Seite 1 von 1

Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 09.07.2018, 22:34
von Ja.rod
Hallo zusammen,
irgendwie stehe ich bei dem folgenden Skript Programm auf dem Schlauch:
Ja.rod_programm.jpg
Ich beschreibe mal was ich erreichen möchte:
Sobald die Variable "Alarmanlage" auf "an" ist und ein Bewegungsmelder, Fensterkontakt, etc. anspricht soll eine Telegram-Nachricht verschickt werden.
Falls noch Dunkelheit hinzukommt sollen neben dem Verschicken der Telegramnachricht auch noch zusätzlich die Lichter angehen.

Wenn ich das Skript aktuell laufen lassen wird immer eine Telegramnachricht verschickt egal ob die Variable "Alarmanlage" "an" oder "aus" ist.
Ich habe mich irgendwie mit der Logik verzettelt, komme aber nicht drauf.

Ich hoffe ihr könnt mir auf die Sprünge helfen.

Danke.

Gruß
Ja.rod

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 10.07.2018, 09:12
von JRiemann
Das kann so absolut nicht funktionieren wie gewünscht.
Das erste DANN hat absolut keinen Inhalt und müsste eine Aktion enthalten. Dadurch kann höchstens die Aktion aus dem SONST-WENN ausgeführt werden.
Der SONST-WENN Block reagiert ausschließlich auf die Lichtwerte und steht damit in keiner Weise im Zusammenhang mit "Alarm" oder den Fenstern wie es gewünscht ist.

Code: Alles auswählen

WENN - Alarm - scharf - nur prüfen
UND - Bewegungsmelder Lichtwert (hell) - nur prüfen
  UND - Fenster - offen - bei Änderung auslösen
  ODER - Fenster - Sabotage erkannt - bei Änderung auslösen
  ODER - Bewegungsmelder - Bewegung erkannt - bei Änderung auslösen
  ODER - Bewegungsmelder - Sabotage erkannt - bei Änderung auslösen
DANN - Skript - Telegramm

SONST-WENN - Alarm - scharf - nur prüfen
UND - Bewegungsmelder Lichtwert (dunkel) - nur prüfen
  UND - Fenster - offen - bei Änderung auslösen
  ODER - Fenster - Sabotage erkannt - bei Änderung auslösen
  ODER - Bewegungsmelder - Bewegung erkannt - bei Änderung auslösen
  ODER - Bewegungsmelder - Sabotage erkannt - bei Änderung auslösen
DANN - Skript - Telegramm
DANN - Licht ...
DANN - Licht ....
P.S. Das schwärzen der Seriennummern ist nicht nötig, damit kann keiner hier Unfug treiben. Ich würde an Deiner Stelle auch die Namensgebung der Geräte ohne Seriennummer anwenden. Deine Klarnamen sind ja eindeutig und unverwechselbar gewählt. Die zusätzliche Seriennummer macht die Namen nur unnötig lang und unübersichtlich. Lediglich die Nummerierung der Kanäle eines Gerätes sollte erhalten bleiben.

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 10.07.2018, 09:30
von Bratmaxe
Zur Info, durch das drücken auf den Knopf "Start" unter Programme wird IMMER der DANN-Pfad ausgeführt.
Um das Programm mit allen Abfragen zu testen, musst du es inaktiv schalten und wieder aktivieren.

Gruß Carsten

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 11.07.2018, 22:07
von gzi
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:
Unbenannt.JPG
Weiters erstelle ich ein kleines Programm mit dem sinnigen Namen "__Autoexec". Das immer (und nur) beim Neustart der CCU lösläuft.
Unbenannt2.JPG
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

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 12.07.2018, 12:06
von manfredh
gzi hat geschrieben:
11.07.2018, 22:07
[*]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"
Das ist so nicht richtig - auch wenn du es vielleicht richtig gemeint hast.

Richtig ist:

JEDE Zeile im "Wenn" oder "Sonst wenn", auch wenn sie mit anderen Zeilen ODER- oder UND-Verknüpft ist, löst ein Programm aus, außer es steht "nur prüfen" dahinter.

Und...
gzi hat geschrieben:
11.07.2018, 22:07
[*]Ist das Programm einmal ausgelöst, dann hängt es von den "nur prüfen"-Zusatzbedingungen ab, welcher Zweig durchlaufen wird **).
Ist das Programm einmal ausgelöst, werden die jeweiligen Bedingungsblöcke im Verbund geprüft. Von oben nach unten. Der erste wahre Block führt zum Ausführen des DANN und das Programm wird beendet.

Das Unverständnis dieser Logik führt bei vielen Anwendern zu Irritationen, weil z.B. folgendes passieren kann:

- Eine Zeile im ersten WENN-Block wird wahr -> das Programm wird ausgelöst
- Beim Abarbeiten des Programms wird der erste Block als unwahr erkannt (nur eine zeile ist ja wahr) und das Programm sucht weiter
- Irgendein "Sonst wenn" Block ist wahr (obwohl der Auslöser da gar nicht drin steht) und wird ausgeführt.

Gruß
Manfred

Edit:
gzi hat geschrieben:
11.07.2018, 22:07
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.
Nach einem Programmstart werden immer ALLE Zweige von oben nach unten durchlaufen, bis einer als wahr erkannt wird.
Eine einzelne Bedingung (-Zeile) muss - wenn sie mehrfach verwendet wird, nur einmal als Auslöser definiert werden (bei Änderung / Aktualisierung auslösen) und kann an anderen Stellen auf "nur prüfen" stehen. Dabei ist es wurscht, in welchem Block sie als Auslöser definiert ist.

Edit2:
Vereinfacht kann man sagen:
- die Einstellungen "bei Änderung auslösen" und "bei Aktualisierung auslösen" bewirken, dass durch diese Zeile das Programm gestartet wird
- beim Ablauf des Programmes wird nur noch geprüft

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 13.07.2018, 19:36
von gzi
Manfred, ich denke, dass wir das Gleiche meinen. Dass Auslösebedingungen nicht unbedingt am Anfang stehen müssen, habe ich in einer (hoffentlich) verbesserten Beschreibung am Ende dieses Postings ergänzt.

Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch

Verfasst: 13.07.2018, 22:08
von 66er
gzi hat geschrieben:
13.07.2018, 19:36
Manfred, ich denke, dass wir das Gleiche meinen. ...
...in einer (hoffentlich) verbesserten Beschreibung am Ende dieses Postings ergänzt.
Meinen vielleicht. :roll:
Aber schreiben tust Du etwas anderes. :shock:

Das dann auch noch in "HomeMatic Tipps & Tricks - keine Fragen!" (wenn man Deinem Link folgt), ein einmaliger Ausrutscher war's wohl nicht. :roll:

LG
Stefan