Logik-Denkfehler bei Programm

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
ah966
Beiträge: 8
Registriert: 31.10.2017, 18:56

Logik-Denkfehler bei Programm

Beitrag von ah966 » 30.11.2017, 09:33

Hallo!

Ich möchte eine Lampe über die CCU steuern. Sie soll morgens (06:30 bis Sonnenaufgang+40 ) und abends (Sonnenuntergang bis Sonnenuntergang + 180) leuchten, dazwischen aber nicht.
Dazu habe ich noch zwei Systemvariablen angelegt: Astro40 und Astro180, die beide zum Sonnenaufgang bzw -untergang mit der jeweiligen Verzögerung auf entweder morgens (=wahr) oder abends (=falsch) gesetzt werden.

Mein Programm sieht nun folgendermaßen aus:

Code: Alles auswählen

Wenn [Zeitstrg] Astro nacht [zu Zeitp auslösen] 
ODER [Zeitstrg] 06:30 [zu Zeitp auslösen]

Dann: [Gerät] Licht [sofort] [Ein]

Sonst, Wenn [Systemzust] Astro180 bei [abends] [bei Änderg auslösen]
ODER           [Systemzust] Astro40 bei [morgens] [bei Änderg auslösen]

Dann: [Gerät] Licht [sofort] [Aus]
Morgens läuft alles (fast) sauber, außer, daß die Lampe schon zum Sonnenaufgang genau ausgeht.
Abends geht sie zur richtigen Zeit an, wird aber um Astro40 abends erneut eingeschaltet, ebenso um Astro 180 abends.

Mir ist bewusst, daß ich durch Aufsplitten des Programms in mehrere Teile das Problem gelöst bekomme - mich interessiert aber die Logik dahinter. Ich habe schon einige Themen und Seiten dazu durchgelesen, durchgestiegen bin ich aber noch nicht.

Für mich stellt sich das so dar, als wenn die CCU bei
- Sonnenauf- und Sonnenuntergang und
- jeder Änderung der beteiligten Variablen und
- den festen Zeitschaltpunkten
das Programm abarbeitet.
Sobald dann eine der Bedingungen zutrifft wird der entsprechende Dann-Teil ausgeführt.

D.h. das Programm wird immer dann angefasst, wenn irgendetwas mit einer der beteiligten Variablen passiert.
Umgekehrt: Das Programm wird öfters durchlaufen als man vermutet - nicht nur dann, wenn sich eine Variable auf einen bestimmten Wert ändert.
--> Ist das so korrekt?

Viele Grüße,
Andreas

Cash
Beiträge: 1184
Registriert: 09.01.2016, 17:42
Wohnort: Sauerland
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Logik-Denkfehler bei Programm

Beitrag von Cash » 30.11.2017, 09:42

Korrekt. Immer dann wenn sich etwas ändert wird das Programm angestoßen und fängt vorne an. Sobald die erste Bedingung erfüllt ist führt er denn Dann Zweig aus...

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Logik-Denkfehler bei Programm

Beitrag von JRiemann » 30.11.2017, 10:35

ah966 hat geschrieben: Für mich stellt sich das so dar, als wenn die CCU bei
- Sonnenauf- und Sonnenuntergang und
- jeder Änderung der beteiligten Variablen und
- den festen Zeitschaltpunkten
das Programm abarbeitet.
Sobald dann eine der Bedingungen zutrifft wird der entsprechende Dann-Teil ausgeführt.
Richtig! Sobald sich der Wahrheitsgehalt eines Objektes welches mit "bei Änderung" markiert wurde ändert, wird ein Programmdurchlauf angestoßen. Ebenso ist es bei einem festen Zeitpunkt.
Wichtig ist dabei auch das der Programmdurchlauf immer ab der 1. Zeile des Programms gestartet wird. Und die 1. gefundene erfüllte Bedingung sorgt für das ausführen des DANN womit zugleich der Durchlauf beendet wird.
ah966 hat geschrieben:. das Programm wird immer dann angefasst, wenn irgendetwas mit einer der beteiligten Variablen passiert.
Umgekehrt: Das Programm wird öfters durchlaufen als man vermutet - nicht nur dann, wenn sich eine Variable auf einen bestimmten Wert ändert.
--> Ist das so korrekt?
Nicht ganz richtig! Wenn sich irgendwas bei dem Objekt tut dann müsste "bei Aktualisierung" ausgewählt sein um einen Durchlauf auszulösen. In diesem Fall reicht schon eine regelmäßige Statusmeldung des Objektes ohne das sich etwas ändert. Objekte die mit "nur prüfen" gekennzeichnet sind lösen keinen Durchlauf aus. Ihr Wahrheitsgehalt wird aber natürlich bei einem Durchlauf geprüft und hat Einfluss auf den weiteren Verlauf.
ah966 hat geschrieben: ist bewusst, daß ich durch Aufsplitten des Programms in mehrere Teile das Problem gelöst bekomme
Richtig! Gerade bei "Astrozeit" kommt es schnell zu Problemen wenn gegenteilige Schaltungen in einem Programm definiert sind.
Ich habe es aber trotzdem mal über 1 Programm und ohne Variablen erstellt. Dabei muss man aber sehr darauf achten in welcher Reihenfolge die Blöcke im Programm aufgeführt sind weil der Durchlauf immer in Zeile 1 beginnt. Außerdem ist das prüfen des Lampenstatus ratsam um unnötige Schaltungen zu vermeiden. Müsste so funktionieren wie gewünscht...

Code: Alles auswählen

WENN - Zeitmodul - 6:30 Uhr - zum Zeitpunkt auslösen
UND - Schaltaktor - Zustand AUS - nur prüfen
DANN - Schaltaktor -Zustand EIN
  SONST-WENN - Zeitmodul - ASTRO Nacht - zum Zeitpunkt auslösen
  UND - Schaltaktor - Zustand AUS - nur prüfen
  DANN - Schaltaktor - Einschaltdauer 180 Min
  DANN - Schaltaktor - verzögert um 1 Sek - Zustand EIN
SONST-WENN - Zeitmodul - ASTRO Tag - nur prüfen
UND - Schaltaktor - Zustand EIN - nur prüfen
DANN - Schaltaktor - verzögert um 40 Min - Zustand AUS
Viele Grüße!
Jörg

ah966
Beiträge: 8
Registriert: 31.10.2017, 18:56

Re: Logik-Denkfehler bei Programm

Beitrag von ah966 » 30.11.2017, 21:34

Hallo und vielen Dank für Eure Antworten!

Wow, Jörg, da wäre ich nicht drauf gekommen.
Das Programm habe ich so nachgebaut und teste das mal - besten Dank!

Habe bisher die Einschaltdauer, bzw Verzögerung vermieden.

Hier habe ich gelesen, daß das verzögerte Setzen einer Variablen und das sofortige Auslösen bei einer Änderung derselben komplexere Programme beherrschbar macht:
https://www.elv.de/topic/astrofunktion- ... erung.html.

Ist das Benutzen von Einschaltdauer und Verzögerungen aufwändiger für die CCU, was z.B. die Performance angeht?
Was passiert, wenn die CCU während der laufenden Einschaltdauer/Verzögerung gebootet wird?
Kann ich mein Programm auch mit den "Verzögerungsvariablen" bauen oder wird es dadurch unnötig kompliziert?

Viele Grüße,
Andreas

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Logik-Denkfehler bei Programm

Beitrag von JRiemann » 30.11.2017, 22:05

Die Nutzung einer Variable halte ich hier nicht für nötig da sich Deine Wünsche auch so realisieren lassen. Aber bekanntlich führen viele Wege zum Ziel und jeder eignet sich seine eigene „Schreibweise“ von Programmen im Rahmen der CCU-Logik an.

Es gibt sehr viele Anforderungen wo Zwischenschritte über Variablen Vorteile bringen oder sogar unumgänglich sind. Z.B. bei Umsetzungen in denen es vorkommt das Verzögerungen abgebrochen werden müssen...

Die Verzögerungen haben keinen messbaren Einfluss auf die Performance der CCU. Im Fall der „Einschaltdauer“ ist es so das der Timer im Aktor läuft und die CCU bei dem Timer und dem folgenden ausschalten unbeteiligt ist, der Aktor regelt das eigenständig.

Bei einem Reboot bleiben Verzögerungen die im Aktor laufen erhalten und das ausschalten funktioniert auch ohne CCU. Verzögerungen die in der CCU laufen gehen bei einem Reboot verloren.
Variablen behalten ihren Zustand normalerweise über den Reboot hinaus bei. Dies könnte man auch zum eigenen Vorteil nutzen weil alle Programme nach dem Reboot durchlaufen und auf wahre Bedingungen geprüft werden.

Wie Du siehst gibt es sehr viele Wege und Möglichkeiten bestimmte Anforderungen umzusetzen. Man muss von Fall zu Fall entscheiden welcher Lösungsweg den eigenen Ansprüchen am besten gerecht wird.
Viele Grüße!
Jörg

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Logik-Denkfehler bei Programm

Beitrag von Bratmaxe » 01.12.2017, 09:58

Die Einschaltdauer ist für ein "sicheres" Ausschalten sehr sinnvoll und benötigt keinen weiteren Funkverkehr (wie JRiemann schon geschrieben hat).
Ich nutzte diese z.B. bei meiner Gartenbewässerung. Damit stelle ich sicher, das die Bewässerung sicher ausschaltet nach der eingestellten Zeit. Theoretisch könnte der Ausschaltbefehl der CCU untergehen, oder die CCU zwischen Einschaltung und Ausschaltung abgestürzt sein, dann würde es ewig weiter regnen im Garten.
(der Vollständigkeit halber: Ja klar auch das Relais im Aktor könnte hängen bleiben und somit würde es weiter regnen, dies halte ich jedoch für unwahrscheinlicher als das die CCU mal ausfällt oder Funkpakete verloren gehen)

Damit will ich nur sagen das es durchaus sehr sinnvolle Verwendungen für die Einschaltdauer gibt!
Gruß Carsten

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“