Die Logik von WebUI - Programmen

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
kaju74
Beiträge: 2023
Registriert: 06.03.2007, 13:14
Kontaktdaten:

Die Logik von WebUI - Programmen

Beitrag von kaju74 » 23.02.2010, 14:21

Hallo.

Immer wieder scheint es schwierigkeiten bzgl. der Logik in Programmen zu geben. Gemeint sind hierbei die "normalen" Programme, also alles das, was mit in den WebUI unter Programme zusammenklicken kann - Skripte sind hierbei erstmal außen vor.

Der Unterschied zwischen "Auslösen auf Änderung", "Auslösen auf Aktualisierung" und "nur prüfen".

Möchte man in einem Programm auf etwas reagieren, so passiert dies innerhalb der "Wenn"-Abschnitte. Also z.B., wenn es draußen heiß ist, dann fahre den Dachfenster-Rolladen ein. Der auslösende Faktor wäre also hier die Außentemperatur, die man mit einem entsprechenden Sensor messen kann. Diesen Sensor träge man also in den "Wenn"-Abschnitt des Programmes ein. Doch unter welcher Bedingung soll eine veränderte Temperatur nun erkannt werden (und das Programm auslösen)? Hier kommen die drei Möglichkeiten ins Spiel, die die Überschrift bereits suggerieren:

Auslösen auf Änderung: Nehmen wir an, das Programm wird gestartet, wenn draußen noch 24°C sind. Steigt die Temperatur nun auf 25°C, wird dies als Änderung erkannt und der erste Teil der Abfrage würde ausgeführt werden.

Auslösen auf Aktualisierung: Bleibt die Temperatur nun z.B. eine Stunde konstant auf 26°C, würde ein Auslösen auf Aktualisierung dennoch bewirken, dass das Programm in regelmäßigen Abständen ausgelöst wird (wenn die Soll-Temperatur im Vergleich natürlich auch passt = zweiter Teil der Wenn-Abfrage!). Eine Aktualisierung findet immer dann statt, wenn der Sensor seine aktuellen Meßwerte an die Zentrale überträgt.

Nur prüfen: Ein Programm wird NIEMALS ausgeführt (mit einer einzigen Ausnahme, siehe unten), wenn als einzige Bedingungen "nur prüfen" Einträge existieren. Diese Einträge folgen immer nur vorangestellten Bedingungen, also z.B. "Wenn Temperatur > 26 Grad UND Rolladenposition > 50%". In diesem Fall würde man zum Ermitteln der aktuellen Rolladenposition den Eintrag "nur prüfen" wählen. Es wird also nur der aktuelle Wert VON DER ZENTRALE ausgelesen!

Wann wird ein Programm gestartet?

Programme werden erstmalig gestartet, wenn man dieses neu angelegt hat. Zudem werden sie ausgeführt, wenn sie die Befehle "Auslösen auf Änderung" oder "Auslösen auf Aktualisieren" enthalten (und entsprechende Bedingungen übereinstimmen). Man kann Programme aber auch manuell starten, indem man diese im Bereich "Status & Bedienung -> Programme" anklickt. Zu guter Letzt werden Programme auch bei einem Neustart der Zentrale abgearbeitet. Welcher Teil des Programmes dabei abgearbeitet wird, zeigt folgender, kurzer Überblick:
  • CCU-Neustart -> Dann-Abschnitt (Wenn-Bedingung trifft zu oder existiert nicht), ansonsten Sonst-Abschnitt
    Auslösen durch Ereignis -> Dann-Abschnitt (Wenn-Bedingung trifft zu), ansonsten Sonst-Abschnitt
    Programm wird manuell ausgelöst -> Dann-Abschnitt
Die Sache mit der Logik!

Wer glaubt, ein Programm wird hinter einer auslösenden Bedingung abgearbeitet, der irrt. Hat man aber erstmal die Logik verstanden, wann welche Bedingung erfüllt und welcher Abschnitt dann ausgeführt wird, sind komplexere Sachverhalte durch wenige Programmzeilen darstellbar.

Wann immer mindestens EINE Bedingung innerhalb eines Programmes zutrifft, wird dieses ausgeführt. Dabei wird aber nicht der Programmcode abgearbeitet, der hinter der betreffenden Bedingung steht, sondern schön erstmal brav von oben nach erstmal geguckt, ob bereits andere Bedingungen zutreffen!!!

Hat man Programme mit nur einem oder zwei "Wenn"-Bedingungen, kann nicht viel schiefgehen. Bei mehreren Abschnitten sollte man sich aber immer darüber im Klaren sein, und sich die Logik von oben nach unten durchgucken, was wann passiert.

MERKE: Ausgelöst wird immer, wenn eine Bedingung zutrifft. Abgearbeitet wird dann aber, von oben nach unten. Trifft eine frühere Bedingung zu, wird diese ausgeführt!

Ich hoffe, das bringt ein wenig Licht ins Dunkle.

Lieben Gruß,
kaju
Zuletzt geändert von kaju74 am 03.12.2013, 14:56, insgesamt 2-mal geändert.

Benutzeravatar
anli
Beiträge: 4297
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Kontaktdaten:

Re: Die Logik von WebUI - Programmen

Beitrag von anli » 15.06.2011, 09:32

teddy278 hat geschrieben: Hallo,

dann mache ich mal nahtlos weiter: Der wichtigste Hinweis von allen lautet:

KEEP IT SIMPLE

Je komplexer das Programm, desto unberechenbarer wird es. Komplexe Aufgaben sollte man auf mehrere Programme aufteilen. Ein Programm auf der CCU ist in dem Sinne nicht vergleichbar mit einem Programm auf dem PC: Auf dem PC machen die meisten Programme viele unterschiedliche Dinge völlig unabhängig voneinander. Auf der CCU dagegen hängt in einem Programm alles zusammen - und das ist gerade am Anfang schwer nachvollziehbar.

Was man NIEMALS tun sollte

Man sollte niemals "bei Änderung" und "bei Aktualisierung" für denselben Sender in einem Programm mischen. Beispiel:

Wenn
Temperatur > 24° bei Aktualisierung
dann
Fenster auf
sonst wenn
Temperatur < 20° bei Änderung
dann heizen
sonst
Licht an

Wenn es wärmer als 24° ist, wird das Fenster geöffnet. Macht man das Fenster zu, und es ist immer noch über 24°, geht es wieder auf, wenn der Temperatursensor seine Meßwerte sendet. Soweit so gut.

Wenn die Temperatur unter 20° sinkt, geht die Heizung an. Auch schön, aber wir haben ja noch das Fenster offen, also drehen wir die Heizung per Hand aus. Kurze Zeit danach ist sie wieder an. Wie kann das sein, wir wollten doch nur bei Änderung auslösen, also einmal beim ersten Unterschreiten der Temperatur? Was ist passiert?

Die Antwort: Die Auswahlmöglichkeiten "bei Aktualisierung" und "bei Änderung" beziehen sich darauf, wann das Programm ausgeführt wird - und zwar das gesamte Programm. Egal, an welcher Stelle "bei Aktualisierung" steht: Sobald für einen Sender "bei Aktualisierung" ausgewählt ist, wird das ganze Programm von oben bis unten abgearbeitet, wenn ein neuer Wert gesendet wird.

Wenn dann weiter unten "bei Änderung" oder "nur prüfen" steht, ist das egal: Das Programm läuft, und die Bedingung wird geprüft. "Bei Aktualisierung" und "bei Änderung" steht zwar auf der WebUI bei den Bedingungen, aber strenggenommen sind es keine, sondern es wird darüber eingestellt, wann ein bestimmter Sender ein Programm startet.

manueller Programmstart

Wird ein Programm manuell gestartet, dann wird automatisch der erste Teil ausgeführt. Beispiel:

Wenn
Tastendruck kurz
dann
Licht an
sonst wenn
Tastendruck lang
dann
Licht aus

Wenn man die Taste drückt, geht das Licht an - soweit logisch. Wenn man das Programm manuell startet, geht allerdings auch das Licht an: Die WebUI führt den ersten "dann"-Zweig aus und das Licht geht an.

Auch hier wichtig: "Tastendruck kurz" und "Tastendruck lang" wird nicht als Bedingung ausgewählt, sondern als Programm-Auslöser. Das klingt langweilig, wird im nächsten Abschnitt aber interessant:

Das Zeitmodul

Nehmen wir ein Programm:

Wenn
Zeit zwischen 10:00 und 11:00 täglich auslösen bei Zeitpunkten
dann
Heizung = 20°
sonst
Heizung = 21°

Um 10:00 wird die Heizung runtergedreht, um 11:00 wieder hoch. Wenn man das Programm um 17:00 manuell ausführt, wird trotzdem die Heizung auf 20° gedrosselt. Warum das? Bei der manuellen Ausführung wird wieder der erste "Dann-Teil von der WebUI ausgeführt und das Programm startet wie bei "Zeitpunkt = 10:00".

Im Normalbetrieb triggert dagegen das Zeitmodul das Programm genau zwei Mal: Einmal um 10:00 mit "Bedingung = wahr", einmal um 11:00 mit "Bedingung = falsch". Dazwischen macht es nichts, denn das Zeitmodul ist hier eben keine Bedingung, sondern ein Trigger.

Vor diesem Hintergrund wird auch deutlich, warum man mehrfache Zeitmodule mit "auslösen bei Zeitpunkt" unbedingt vermeiden sollte, und warum es auch bei der Vermischung von Zeitmodul "auslösen bei Zeitpunkt" und Sender "auslösen bei Aktualisierung" leicht zu unverhersehbarem Verhalten kommt: Es ist scheinbar unvorhersehbar, wann das Programm ausgeführt wird und welche Bedingungen dann gerade wahr sind.


Grüße!
teddy
teddy278 hat geschrieben: Hallo,

zum Thema "bei Aktualisierung", "bei Änderung" und "laufende Verzögerungen abbrechen" hier noch das Zettel-Gleichnis. Außerdem die ewige Frage "wie werden Programme sonst noch ausgeführt".


bei Aktualisierung

Wenn bei irgendeinem Kanal "bei Aktualisierung" eingestellt ist, dann pappt die CCU einen Zettel an den Kanal, auf dem ein Verweis auf das Programm steht. Wenn jetzt dieser Kanal aktualisiert wird, dann sieht die CCU den Zettel, geht zum Programm und führt es aus.

Wichtig: Der Zettel zeigt auf das Programm, nicht auf einen bestimmten Punkt im Programm. Die CCU führt das Programm also komplett von oben nach unten aus, nicht nur den Teil, bei dem "bei Aktualisierung" ausgewählt ist.


bei Änderung

Ähnlich "bei Änderung": Auch hier klebt die CCU einen Zettel an den Kanal, auf dem steht, bei welcher Änderung das Programm ausgeführt werden soll. Beispiel: Im Programm steht "wenn Temperatur > 18° bei Änderung dann ...". Auf den Zettel schreibt die CCU: "bei Änderung 18° Programm ausführen".

Auch hier wichtig: Es steht wieder nur der Verweis auf das Programm, nicht auf irgendeinen Einzelteil des Programms. Außerdem steht tatsächlich "bei Änderung 18°" auf dem Zettel - das Programm wird nicht ausgeführt, wenn sich die Temperatur von 13° auf 14° ändert, sondern nur von 18,0° auf 18,1°, weil sich dann die Bedingung ändert.

Außerdem wird das Programm auch ausgeführt, wenn sich die Bedingung zurückändert: Bei Wechsel von 18,1° auf 18,0° wird das Programm ebenfalls ausgeführt, denn sonst könnte der "Sonst ..."-Zweig nicht angestoßen werden. Aber auch hier: Es wird das komplette Programm ausgeführt, nicht nur der Teil, wo "bei Änderung" ausgewählt ist.


laufende Verzögerungen abbrechen

Nehmen wir ein Programm:

wenn
Taste gedrückt
dann
Licht einschalten sofort
Licht ausschalten verzögert um 5 Minuten

Wenn eine Taste gedrückt wird, schaltet die CCU das Licht ein. Außerdem schreibt sie sich "Licht ausschalten" auf einen Zettel und pappt den auf ihre innere Uhr fünf Minuten von jetzt. Wenn sie dann in fünf Minuten ihre innere Uhr abliest, sieht sie den Zettel, und schaltet das Licht aus.

Wenn die Taste während dieser fünf Minuten nochmal gedrückt wird, dann schickt die CCU erstmal den Befehl zum Einschalten erneut los. Merkt man nicht, das Licht bleibt einfach an. Außerdem schreibt sie wieder "Licht ausschalten" auf einen Zettel und pappt den auf ihre innere Uhr, wieder fünf Minuten von jetzt.

Wenn der Haken bei "laufende Verzögerungen abbrechen" gesetzt ist, dann sucht die CCU vorher auf ihrer Uhr nach Zetteln für das Licht, und wirft sie weg. Der ursprüngliche Ausschaltbefehl wird also nicht ausgeführt, nur der neue in fünf Minuten. Wenn der Haken dagegen nicht gesetzt ist, dann bleibt der Zettel auf der Uhr kleben, und die CCU schaltet das Licht aus - fünf Minuten nach dem ersten Tastendruck. Fünf Minuten nach dem zweiten Tastendruck schaltet sie das Licht dann nochmal aus.


Wie werden Programme sonst noch ausgeführt?

"Bei Änderung" oder "bei Aktualisierung" werden die Programme komplett von oben nach unten ausgeführt. Man sollte noch im Hinterkopf behalten, daß beim Start der CCU ebenfalls alle Programme getriggert werden. Hier werden sie ebenfalls von oben nach unten ausgeführt.

Wenn bei einem Programm steht "wenn Taste gedrückt dann ...", dann passiert nichts, denn während des Starts ist die Taste natürlich nicht gedrückt. Wenn es aber einen "sonst"-Zweig gibt, wird dieser ausgeführt. Und wenn in einem Programm steht "wenn Temperatur > 18° dann Licht einschalten", und es ist beim Start wärmer als 18°, dann geht das Licht an.

Schließlich gibt es die Möglichkeit, Programme über die WebUI direkt auszuführen. Hier wird jedoch nicht das Programm von oben nach unten abgearbeitet, sondern immer der erste "Wenn ..."-Zweig ausgeführt. Nehmen wir unser Programm "wenn Temperatur > 18° dann Licht einschalten": Bei manuellem Aufruf wird immer das Licht eingeschaltet, egal wie warm es ist.


Grüße!
teddy
Danke für diese großartigen Beiträge!
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

SUPER Frühbucher-Tickets für das Usertreffen 2019 jetzt verfügbar! Hier informieren: Eventbrite-Ticketshop. Termin: 5.4. - 7.4.2019 in Kassel (freitags nur Workshops, Vorträge Sa + So). Newsletter-Anmeldung: https://www.homematic-usertreffen.de

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

infrablue
Beiträge: 9
Registriert: 25.12.2011, 23:46

Re: Die Logik von WebUI - Programmen

Beitrag von infrablue » 26.12.2011, 00:01

Wie kann ich in WebUI-Programmen eine Befehlszeile einfügen? Wenn ich ein bestehendes Programm erweitern möchte, kommt es ja auch auf die Reihenfolge der Befehle an. Es ist jederzeit möglich, neue Befehle anzuhängen, aber wie kann ich welche einfügen oder gar verschieben?

Vielen Dank für Hilfe

DrTob
Beiträge: 3407
Registriert: 29.10.2010, 08:24

Die Logik von WebUI - Programmen

Beitrag von DrTob » 26.12.2011, 00:18

Die Befehle haben keine Reihenfolge.

infrablue
Beiträge: 9
Registriert: 25.12.2011, 23:46

Re: Die Logik von WebUI - Programmen

Beitrag von infrablue » 26.12.2011, 17:34

Vielen Dank für die schnelle Antwort! So habe ich das noch nie betrachtet.

Wie kann ich dann eine bestimmte Reihenfolge durchsetzen? Durch Verzögerungen?

Und wie funktioniert das mit Befehlen an die große Fernbedienung mit Display? Da stelle ich doch erst den Text ein, dann evt. noch ein Symbol und einen Ton und sende das dann alles mit "Displaynachricht übertragen". Muss hier nicht eine bestimmte Reihenfolge eingehalten werden?


klassisch
Beiträge: 3196
Registriert: 24.03.2011, 04:32

Re: Die Logik von WebUI - Programmen

Beitrag von klassisch » 26.12.2011, 18:19

infrablue hat geschrieben:Wie kann ich dann eine bestimmte Reihenfolge durchsetzen? Durch Verzögerungen?
Ja, dafür kann man bei den Befehlen "sofort" oder verzögert um ..." eingeben. Wobei man keine Echtzeitfähigkeit im Sekundenbereich oder gar Subsekundenbereich erwarten kann.
Es empfiehlt sich dennoch der Nachvollziehbarkeit wegen die zeitliche Reihenfolge und in die Reihenfolge in der Darstellung parallel zu halten.
Das schwierige dabei: Man kann in WebUi die Programme weder vernünftig editieren noch dokumentieren. Leider nicht die einzige Stelle an der man mehr erwartet und enttäuscht wird.

infrablue
Beiträge: 9
Registriert: 25.12.2011, 23:46

Re: Die Logik von WebUI - Programmen

Beitrag von infrablue » 26.12.2011, 19:34

Wenn ich das richtig verstehe, scheint aber doch eine gewisse Reihenfolge eine Rolle zu spielen, siehe Anleitung für die Programmierung der 19er Fernbedienung.

Ist die Pflege der Programme mit Zusatzsoftware wie z.B. Homeputer besser möglich?

Bullson
Beiträge: 86
Registriert: 10.11.2011, 10:53

Re: Die Logik von WebUI - Programmen

Beitrag von Bullson » 09.06.2012, 12:08

Bei mir funktioniert eine Logik nicht.
Und zwar sieht das so aus:

Wenn VirtualButton 1 lang gedrückt wird
UND wenn "KontakfühlerFürTor" bei "geschlossen" "nur prüfen"
Aktivität:
mach Tor auf (hier steht eigentlich ein funktionierendes Programm)
Sonst
Sende mir eine Mail: Das Tor ist schon offen (Ist eigentlich ein Skript das gestartet wird)

Problem: Egal ob "KontakfühlerFürTor" offen oder geschlossen ist, das Programm zum öffnen wird IMMER ausgeführt. Sie soll das aber nur tun WENN dieser "geschlossen" ist und mir andernfalls eine Mail schicken, dass schon auf ist.
Weiß jemand was ich dazu tun muss?

Edit: Ich starte das Programm direkt. Entweder aus WebUi oder eben per xmlapi mit seiner ID
Geht das dann überhaupt so eine Bedingung zu definieren?

Benutzeravatar
anli
Beiträge: 4297
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Kontaktdaten:

Re: Die Logik von WebUI - Programmen

Beitrag von anli » 09.06.2012, 13:12

Hallo.
Deine Logik funktioniert.
Bullson hat geschrieben:Edit: Ich starte das Programm direkt. Entweder aus WebUi oder eben per xmlapi mit seiner ID
Geht das dann überhaupt so eine Bedingung zu definieren?
Bitte beachte den letzten Satz von teddys Erläuterung: "Schließlich gibt es die Möglichkeit, Programme über die WebUI direkt auszuführen. Hier wird jedoch nicht das Programm von oben nach unten abgearbeitet, sondern immer der erste "Wenn ..."-Zweig ausgeführt. Nehmen wir unser Programm "wenn Temperatur > 18° dann Licht einschalten": Bei manuellem Aufruf wird immer das Licht eingeschaltet, egal wie warm es ist."
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

SUPER Frühbucher-Tickets für das Usertreffen 2019 jetzt verfügbar! Hier informieren: Eventbrite-Ticketshop. Termin: 5.4. - 7.4.2019 in Kassel (freitags nur Workshops, Vorträge Sa + So). Newsletter-Anmeldung: https://www.homematic-usertreffen.de

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“