Hallo zusammen,
irgendwie stehe ich bei dem folgenden Skript Programm auf dem Schlauch:
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
Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
Moderator: Co-Administratoren
Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
- Dateianhänge
-
- Alarmauslösung_.pdf
- (68.44 KiB) 60-mal heruntergeladen
Zuletzt geändert von alchy am 09.07.2018, 23:33, insgesamt 1-mal geändert.
Grund: Programm als jpg angehangen und Titel geändert und strike
Grund: Programm als jpg angehangen und Titel geändert und strike
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
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.
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.
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 ....
Viele Grüße!
Jörg
Jörg
-
- Beiträge: 1573
- Registriert: 28.05.2015, 12:48
- Wohnort: Willich
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 10 Mal
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
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
Um das Programm mit allen Abfragen zu testen, musst du es inaktiv schalten und wieder aktivieren.
Gruß Carsten
Gruß Carsten
-
- Beiträge: 450
- Registriert: 12.01.2015, 23:37
- System: CCU
- Hat sich bedankt: 15 Mal
- Danksagung erhalten: 14 Mal
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
Hallo Ja.rod,
es wird oft kompliziert erklärt, aber eigentlich gehts nur um zwei Punkte:
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
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.
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
Lichtsteuerung, Heizungssteuerung, Überwachung (Feuer, Wasser, Einbruch, Stromausfall, Heizungsausfall, Wetter, Kamera), Alarmierung (optisch, akustisch, mail, SMS, voice call) - CCU, diverse HM- und HMIP Aktoren und Sensoren, Rauchmeldeanlage, UPS, GSM-Alarmwähler, Zugriff aus dem Internet via HTTPS und htdigest authentication, kein Datenkraken-Interface (Google, Amazon, China-Cloud, BND, NSA...) - HomeMatic Sicherheits-Kompendium - Checkliste für Auswahl von IP Kameras - Vergleich aktueller HomeMatic Zentralen - und alle Antworten für das gesamte Universum und den Rest
-
- Beiträge: 4155
- Registriert: 09.09.2012, 10:41
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 78 Mal
- Danksagung erhalten: 301 Mal
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
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...
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:
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
Es gibt 10 Arten von Menschen: solche die Binärcode verstehen und solche, die ihn nicht verstehen.
-
- Beiträge: 450
- Registriert: 12.01.2015, 23:37
- System: CCU
- Hat sich bedankt: 15 Mal
- Danksagung erhalten: 14 Mal
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
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.
Lichtsteuerung, Heizungssteuerung, Überwachung (Feuer, Wasser, Einbruch, Stromausfall, Heizungsausfall, Wetter, Kamera), Alarmierung (optisch, akustisch, mail, SMS, voice call) - CCU, diverse HM- und HMIP Aktoren und Sensoren, Rauchmeldeanlage, UPS, GSM-Alarmwähler, Zugriff aus dem Internet via HTTPS und htdigest authentication, kein Datenkraken-Interface (Google, Amazon, China-Cloud, BND, NSA...) - HomeMatic Sicherheits-Kompendium - Checkliste für Auswahl von IP Kameras - Vergleich aktueller HomeMatic Zentralen - und alle Antworten für das gesamte Universum und den Rest
-
- Beiträge: 3083
- Registriert: 23.08.2015, 11:06
- System: CCU
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 111 Mal
Re: Wenn-Dann-Logik bei Programm...Ich steh auf dem Schlauch
Meinen vielleicht.gzi hat geschrieben: ↑13.07.2018, 19:36Manfred, ich denke, dass wir das Gleiche meinen. ...
...in einer (hoffentlich) verbesserten Beschreibung am Ende dieses Postings ergänzt.
Aber schreiben tust Du etwas anderes.
Das dann auch noch in "HomeMatic Tipps & Tricks - keine Fragen!" (wenn man Deinem Link folgt), ein einmaliger Ausrutscher war's wohl nicht.
LG
Stefan