Hallo Ja.rod,
es wird oft kompliziert erklärt, aber eigentlich gehts nur um zwei Punkte:
- Jedes PGM braucht (sinnvollerweise) einen oder mehrere, mit ODER verknüpfte, Auslöser (Änderung einer Sysvar, Änderung eines Geräte-Datenpunkts oder Zeit-Bedingung) . Zusätzlich kann man sich immer implizit dazudenken : "ODER CCU-Neustart"
- Ist das Programm einmal ausgelöst, dann hängt es von den "nur prüfen"-Zusatzbedingungen ab, welcher Zweig durchlaufen wird **). Der WENN Zweig oder einer der SONST Zweige. Da hakt es bei Dir.
Es wird der erste Zweig durchlaufen, für den alle Zusatzbedingungen zutreffen. Alle anderen Zweige werden nicht durchlaufen. Es gibt also keine geschachtelten IF's wie in anderen Programmiersprachen.
Für Deinen Fall wird also immer eine Telegramnachricht verschickt, weil Du einen Zweig hast (der letzte) , für den diese Systemvariable "Alarmanlage" gar nicht geprüft wird.
Die Prüfung auf Helligkeit gehört noch mit in den allerersten Bedingungsblock (also: "Alarmanlage" "an" UND "dunkel") Der erste Aktivitätenblock ( der mit den Lichtspielen) gehört in den DANN Zweig.
Beim SONST WENN Zweig brauchst Du eine Prüfung auf "Alarmanlage" "an" UND "dunkel". Dort gehört dann als Aktivität nur das Versenden der Nachricht hinein.
Das wärs eigentlich schon! Aber ...
... wenn Du aber verhindern willst, dass beim CCU Neustart eine Nachricht versandt wird, so muss Dein Programm noch prüfen, ob es nicht gerade beim Neustart ausgelöst wurde. Dazu gibt es einen Trick, der hier aufwändig aussieht, aber bei vielen Programmen wiederverwendet werden kann.
Es gibt in der CCU eine (und nur eine!) Systemvariable, die beim Neustart nicht wie alle anderen mit dem zuletzt gültgen Wert re-initialisiert wird, sondern immer auf "Wahr" gesetzt wird. sie heißt normalerweise "Anwesenheit". Ich benenne sie aber um auf: "CCU_Status" und definiere sie neu:
Weiters erstelle ich ein kleines Programm mit dem sinnigen Namen "__Autoexec". Das immer (und nur) beim Neustart der CCU lösläuft.
Das bedeutet: bei Neustart hat "CCU_Status" den Wert "wahr/booting" und nach einer Minute den Wert "falsch/normal". Vergeiche auch
hier.
Nun musst Du noch bei jedem Programmzweig, der beim CCU Neustart
nicht laufen soll, nur die Bedingung
"UND Systemzustand CCU_Status bei normal nur prüfen" hinzufügen.
Bitte probier das aus und sobald es funktioniert, poste doch dein Programm noch einmal und hänge an den Titel Deines ersten Postings das Wort "[gelöst]" dran. Dann kann dein Problem Anderen als Beispiel dienen!
@JRiemann: Soweit ich weiß, muss man im SONST WENN Zweig die Auslöserbedingung nicht mehr wiederholen, weil er einen SONST WENN Zweig ja nur durchläuft, wenn das Programm ausgelöst wird.
Für weitere Infos siehe auch
hier.
**) Ein Sonderfall soll noch erwähnt werden: Wird das Programm über das WebUI manuell gestartet, dann wird immer (und nur!) der DANN Zweig durchlaufen.
Das ist der Grund, warum ich eigentlich fast nie mit SONST WENN Zweigen arbeite, sondern lieber ein zweites Programm anlege.
viel Erfolg!
gzi