Ich habe ein Problem mit einem CUxD Timer. Grundsätzlich funktioniert er, aber bei dem Problem weiß ich als Einsteiger leider nicht weiter.
Ich habe mir über die RaspberryMatic einen Radiowecker gebastelt. Herzstück des Weckers ist ein CUxD-Timer, der die Ablaufsteuerung triggert. Zentrale Anforderung von mir war es, dass ich den Wecker über eine Systemvariable stellen kann, damit ich die Uhrzeit als Freitext über PocketControl vorgeben kann. Die dazugehörige SV heißt „Wecker_Weckzeit“ und wird in folgendem Timer-Programm ausgewertet:
Die Vorlage dafür kam hier aus dem HM-Forum. Sinn der Übertragung der Zeit im Sonstzweig ist es, dass bei jeder SV-Aktualisierung außer „Stopp“ der Timer aktualisiert wird. In der Sonst-Anweisung steht folgendes Skript:
Code: Alles auswählen
! Wert aus Systemvariable in Wecker-Timer schreiben
string zeit_wecker = dom.GetObject("Wecker_Weckzeit").Value(); ! Weckzeit aus SV auslesen
integer i_zeit = (3600 * zeit_wecker.StrValueByIndex(":",0).ToInteger()) + (60 * zeit_wecker.StrValueByIndex(":",1).ToInteger()); ! Weckzeit in Interger-Variable "Sekunden seit Mitternacht" umwandeln
integer i_zeit_pre = i_zeit - 300; ! Vorab-Weckzeit für Geräte-Init berechnen (5 Minuten)
var t = system.Date("%F") # "00:00:00";
t = t.ToTime().ToInteger();
t = t + i_zeit_pre;
string weckzeit_pre = t.ToTime().Format("%H:%M:%S").ToString(); ! Zeit seit 01.01.1970 ermitteln und mit Wecker_Pre beaufschlagen
dom.GetObject("CUxD.CUX2800001:1.TIMER_SET").State(weckzeit_pre); ! Weckzeit_Pre in CUxD Timer schreiben
Im zentralen Weckprogramm wird dann auf den Ablauf des Timers reagiert:
Nun das Problem: trotz der Tatsache, dass repeat angehakt ist, wird der Timer beim nächsten Ablauf nicht wieder getriggert und das Programm läuft nicht los. Ich habe schon verschiedene Sachen probiert: anderen Timer-Kanal gewählt, Timer Device neu angelegt, auf Formatierungsfehler in der Zeit untersucht… Nichts hilft, der Wecker reagiert nur, wenn ich den Timer manuell stoppe und dann die Zeit neu an die SV übergebe. Das Umrechnen der Zeit aus der SV und Übergabe an das Device funktionieren problemlos, auch wenn ich die Zeit vor dem ersten Auslösen zum Testen mehrfach ändere. Der Timer läuft sicher einmal durch, dann aber kein zweites Mal trotz gesetztem Repeat.
Im SysLog vom CUxD finde ich auch keinen Fehler oder verdächtigen Eintrag. Auch ändere ich in allen anderen Wecker-Unterprogrammen den Zugriff auf den Timer nicht weiter, nur in den oben gezeigten Code-Schnipseln.
Ich denke es ist auch kein Programmierfehler oder Syntax-Fehler im Programm: ich lasse mir zum Debuggen eine pockeControl Push Nachricht in dem o.g. Weckprogramm senden sofort wenn der DANN Zweig aktiviert wird. Beim ersten mal ist alles gut, beim zweiten mal aber wird keine Nachricht getriggert. Es ist also tatsächlich so, dass das Programm nicht losläuft, weil die erste Bedingung nicht wahr wird (bevor jemand fragt: Ja, die zweite Variable ist auf EIN).
Das ist mein erstes Projekt mit einem CUxD-Timer und ich bin auch alles andere als programmiererfahren. Hat jemand eine Idee was da nicht stimmt oder was ich noch versuchen könnte?
CUxD und RM sind auf dem jeweils aktuellen Stand.
Für Hinweise und Hilfe wäre ich sehr dankbar.
Viele Grüße,
Martin