Projekt Heizungssteuerung: Unerklärliche Aussetzer

Begonnen von M_I_B, 06 November 2016, 18:22:48

Vorheriges Thema - Nächstes Thema

M_I_B

Hallo liebe Leute,

im Zusammenhang mit dem o.g. Projekt ist mir eine Merkwürdigkeit aufgefallen, die ich auch nach viel Suche und Messen nicht erklären kann... Daher kann ich auch nicht wirklich sagen, ob das an DOIF liegt oder ganz wo anders zu suchen ist.

Hintergrund: RPi2b, GPIO's > Relais / 230V > Opto > GPIO's / 1wire > 1w2I²C

Bei der Nummer ist aufgefallen, das die Relais sporadisch für einen ganz kurzen Augenblick abfallen (z.B. wenn Brenner und Umwälzung aktiv). Ganz selten (hab mir 30 Minuten die Beine platt gestanden) taucht dieser Schluckauf auch in umgekehrter Richtung auf, also alles ist aus und plötzlich tackt ein Relais ganz kurz auf ON. Mit dem Scope gemessen liegt dieser "Schluckauf" im Bereich 5-35ms. Diese Aussetzer sind weder in den Logfiles zu sehen, geschweige denn in der WebUI.

Das ganze DOIF umzu ist eigentlich klassisch und sieht für den Brenner so aus:
# Brenner Tag-/ Nachtbetrieb
define set_HWBR DOIF ([a29] < 0) (set HWBR off) DOELSEIF ([a29] > 1) (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] > [hzsp] + [HYSt] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] > [hzsp] + [HYSn] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set HWBR off)
attr set_HWBR room System.DOIF
attr set_HWBR do always

> a29: -1 = Aus, 0 = Automatik, 1 = Manuell, 2 = An
> DayNight: on = Nachabsenkung, off = Tagbetrieb
> HZSPx = SOLL Tag (x=t), Nacht (x=n)
> hzsp = IST (via 1wire)
> HYSx = Hysterese Tag (x=t), Nacht (x=n)
> SWG = Vorgabe Überschwingen (Ausgleich)
> HWBR = GPIO Brenner

Jemand eine Idee, wo ich noch suchen könnte?

M_I_B

#1
... keine ne Idee?

Ich aber... eher eine Ahnung ... Vorab:
Es ist doch so, das FHEM direkt unter Umgehung anderer (Hintergrund-) Dienste auf die GPIO's auf Dateiebene zugreift, oder täusche ich mich?

Wenn ja, könnte es ggf sein, das auf Grund von Timing- Engpässen auf Hardware- Ebene, z.B. durch reichlich I2C- Verkehr oder durch dazwischen funkende andere Dienste (wiringPi) solchen Schluckauf provizieren?

Ok, die Platine ist noch ein echter Prototyp auf Lochraster und soll natürlich mal "in gut" gemacht werden, so das ich notfalls noch zwischen GPIO und Relaistreiber ein Verzögerungsglied (SchmidtTrigger + R/C) einplanen könnte. Aber das wäre Symptom- und nicht Ursachenbekämpfung... also uncool...

( @MOD: Wenn das tatsächlich ein Hardware- Problem ist, bitte verschieben )

Damian

Zitat von: M_I_B am 08 November 2016, 08:38:42
... keine ne Idee?

Ich aber... eher eine Ahnung ... Vorab:
Es ist doch so, das FHEM direkt unter Umgehung anderer (Hintergrund-) Dienste auf die GPIO's auf Dateiebene zugreift, oder täusche ich mich?

Wenn ja, könnte es ggf sein, das auf Grund von Timing- Engpässen auf Hardware- Ebene, z.B. durch reichlich I2C- Verkehr oder durch dazwischen funkende andere Dienste (wiringPi) solchen Schluckauf provizieren?

Ok, die Platine ist noch ein echter Prototyp auf Lochraster und soll natürlich mal "in gut" gemacht werden, so das ich notfalls noch zwischen GPIO und Relaistreiber ein Verzögerungsglied (SchmidtTrigger + R/C) einplanen könnte. Aber das wäre Symptom- und nicht Ursachenbekämpfung... also uncool...

( @MOD: Wenn das tatsächlich ein Hardware- Problem ist, bitte verschieben )


Wenn du nicht nachweisen kannst (z. b. durch Log-Einträge), dass set HBWR on/off kurzfristig toggelt , dann würde ich ein Softwareproblem ausschließen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

M_I_B

... ja, inzwischen komme ich auch langsam zu dieser Überzeugung; wie gesagt: Im Log nix zu sehen ...
Es ist auch so, das dieser Schluckauf erst nach einer gewissen ON- Zeit (resp. seltener nach einer längeren OFF- Zeit) auftritt, und das wie gesagt sehr kurz, gerade so, das die kleinen, recht schnellen Schrack- Relais das gerade noch mechanisch umsetzen können. In diesem Zusammenhang auch (eine) meiner Vermutungen, das hier ggf. der OWserver, wiringPI oder was ähnliches dazwischen haut...

Da es hier heute schon den Ganzen Tag wie Hulle am Schneien ist, werde ich mal das große Scope in den Heizungskeller schaffen und eine Kamera aufstellen; die Gemeinheit ist nämlich, das man gerade irgend wo anders hinschaut, wenn's passiert... Wird Zeit, das ich mal in ein gutes SpeicherScope investiere... Wenn die nur nicht so ätzend teuer wären :(

M_I_B

#4
*** Kommando zurück ! ***

Ich habe jetzt mal direkt auf den GPIO, also in FHEM "HWBR" ein eigenes Logfile angesetzt und alles andere, was gerade nicht lebensnotwendig ist, auskommentiert...

Und in diesem SingleLog sind während der Brennphase etliche "off" zu lesen:
2016-11-08_14:01:10 HWBR on
2016-11-08_14:02:10 HWBR off
2016-11-08_14:04:41 HWBR off
2016-11-08_14:07:11 HWBR off
2016-11-08_14:09:41 HWBR off
2016-11-08_14:11:44 HWBR off
2016-11-08_14:14:14 HWBR off
2016-11-08_14:16:17 HWBR off
2016-11-08_14:18:44 HWBR off
2016-11-08_14:20:47 HWBR off
2016-11-08_14:23:14 HWBR off

Das letzte OFF im Log ist tatsächlich Brennschluss, also um 14:23:14, wie man auch an der Grafik sehen kann. Es wird also zwischendurch sporadisch ein OFF an HWBR geschossen, was von anderer Stelle sofort innert 5-25ms revidiert wird, was erstaunlicher Weise aber nicht im Log auftaucht. Es muss also irgendwie aus dem DOIF kommen; dieses ist auch die einzige DOIF, welche HWBR behandelt (siehe auch ersten Beitrag, hier noch mal...):
define set_HWBR DOIF ([a29] < 0) (set HWBR off) DOELSEIF ([a29] > 1) (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] > [hzsp] + [HYSt] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] > [hzsp] + [HYSn] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set HWBR off)
attr set_HWBR do always
attr set_HWBR room System.DOIF

Interessant sind nur die vier Zeilen, in denen a/b29=0 ist. Die letzte Zeile macht im Grunde nur eine Notabschaltung, wenn Kessel- oder Vorlauf über 85°C gehen (bei 90°C löst die vorgeschriebene mechanische Abschaltung aus). Und hier mal das Ganze mit Realwerten, damit man es besser lesen kann:
define set_HWBR DOIF ([a29] < 0) (set HWBR off) DOELSEIF ([a29] > 1) (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [64] > [55] + [10] and [HWBR] eq "off") (set HWBR on) \ <<< Hat bereits ausgelöst, "hzsp" war vorher unter 54
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [64] < [55] + [6] and [HWBR] eq "on") (set HWBR off) \  <<< Wurde um 14:23:14 erreicht
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [52] > [55] + [8] and [HWBR] eq "off") (set HWBR on) \ <<< nicht aktiv: Nachschaltung
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [52] < [55] + [6] and [HWBR] eq "on") (set HWBR off) \ <<< nicht aktiv: Nachschaltung
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set HWBR off)
attr set_HWBR do always
attr set_HWBR room System.DOIF



Und nun? Ich komme nicht hinter das Geheimnis des Schluckauf's :(


EDIT:
Und da das alle vier involvierten Relais machen, also auch die für die Umwälzung, Ladung und Zirkulation, der Vollständigkeit halber der ganze Trum (ohne Dummy's & Co.)

# Dummy für Tag- / Nachbetrieb setzen
define set_DayNight DOIF ([05:00-22:00|8] or [07:00-23:00|7]) (set DayNight off) DOELSE (set DayNight on)
attr set_DayNight do always
attr set_DayNight room System.DOIF

# Schornsteinfeger - Max. 5 Minuten Brenner, alle Pumpen an
define set_Service DOIF ([Service] eq "on") ({fhem 'set 29d1 '.strftime('%c', localtime)}, set 29d1 BRt [a29], set 29d1 BRn [b29], set 29d1 BRs [HWBR], set 29d1 HP [c29], set 29d1 HPs [HWHP], set 29d1 WP [d29], set 29d1 WPs [HWWP], set 29d1 ZP [e29], set 29d1 ZPs [HWZP], set HWBR 300, set [a-e]29 2) \
DOELSEIF ([Service] eq "off" or [hzsp] >= 85 or [hzvl] >= 85) (set a29 [29d1:BRt], set b29 [29d1:BRn], set HWBR off) (set c29 [29d1:HP], set HWHP [29d1:HPs], set d29 [29d1:WP], set HWWP [29d1:WPs], set e29 [29d1:ZP], set HWZP [29d1:ZPs])
attr set_Service do always
attr set_Service room System.DOIF
attr set_Service wait 5:1,120

# Brenner Tag-/ Nachtbetrieb
define set_HWBR DOIF ([a29] < 0) (set HWBR off) DOELSEIF ([a29] > 1) (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] > [hzsp] + [HYSt] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] > [hzsp] + [HYSn] and [HWBR] eq "off") (set HWBR on) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] < [hzsp] + [SWG] and [HWBR] eq "on") (set HWBR off) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set HWBR off)
attr set_HWBR do always
attr set_HWBR room System.DOIF

# Pumpe Heizkreis
define set_HWHP DOIF ([c29] < 0) (set HWHP off) DOELSEIF ([c29] > 1) (set HWHP on) \
DOELSEIF ([c29] == 0 and [PULL_HKV:state] >= [HKV29on] and [TMP] < [TEMP] and [HWHP] eq "off") (set HWHP on) \
DOELSEIF ([c29] == 0 and [PULL_HKV:state] <= [HKV29off] or [TMP] > [TEMP] and [HWHP] eq "on") (set HWHP off)
attr set_HWHP do always
attr set_HWHP room System.DOIF

# Pumpe Warmwasser
define set_HWWP DOIF ([d29] < 0) (set HWWP off) DOELSEIF ([d29] > 1) (set HWWP on) \
DOELSEIF ([d29] == 0 and (([?05:00-10:00|8] or [?08:00-11:00|7]) and [wwsp] < [WWSP]-5) or [hzsp] > [HZSPt]+5 or ([HWZP] eq "on" and [wwsp] < [WWSP]-5) and [HWWP] eq "off") (set HWWP on) \
DOELSEIF ([d29] == 0 and [wwsp] > [WWSP]-10 and [HWWP] eq "on") (set HWWP off)
attr set_HWWP do always
attr set_HWWP room System.DOIF

# Pumpe Zirkulation
define set_HWZP DOIF ([e29] < 0) (set HWZP off) DOELSEIF ([e29] > 1) (set HWZP on-for-timer 600) \
DOELSEIF ([e29] == 0 and ([?06:30-07:30|8] or [?08:00-10:00|7]) and [wwsp] >= [WWSP]-10 and [HWWP] eq "on" and [HWZP] eq "off") (set HWZP on) \
DOELSEIF ([e29] == 0 and ([wwsp] < [WWSP]-10 or [wwzv] >= [wwzr]-10) and [HWzP] eq "on") (set HWZP off)
attr set_HWZP do always
attr set_HWZP room System.DOIF

Damian

Diese Abfrage ist schon mal nicht korrekt:

DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] > [hzsp] + [HYSt] and [HWBR] eq "off") (set HWBR on)


Vergleich hat eine höher Priorität als Addition.

Was du willst ist vermutlich dieses:

DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [HZSPt] > ([hzsp] + [HYSt]) and [HWBR] eq "off") (set HWBR on)



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

M_I_B

#6
 :o ups >:( ... mal wieder viel Wald und kein Bäume zu sehen  >:( >:( >:(
Danke für den Hinweis! Da hätte ich 1000 mal drüber gelesen und es wäre mir nicht aufgefallen. Korrigiere ich gleich mal ...
Witzig aber, das laut dem Logfile (dem Großen) Brennschluss immer SWG vor SOLL resp. Brennstart korrekt bei SOLL minus HYSx war... Zufall?

EDIT:
Daran lag es nicht; Schluckauf weiter existent. Im Vergleich der Verläufe vor und nach dem Klammern ergeben sich keine Unterschiede bis jetzt ...

Damian

Zitat von: M_I_B am 08 November 2016, 15:46:54
:o ups >:( ... mal wieder viel Wald und kein Bäume zu sehen  >:( >:( >:(
Danke für den Hinweis! Da hätte ich 1000 mal drüber gelesen und es wäre mir nicht aufgefallen. Korrigiere ich gleich mal ...
Witzig aber, das laut dem Logfile (dem Großen) Brennschluss immer SWG vor SOLL resp. Brennstart korrekt bei SOLL minus HYSx war... Zufall?

EDIT:
Daran lag es nicht; Schluckauf weiter existent. Im Vergleich der Verläufe vor und nach dem Klammern ergeben sich keine Unterschiede bis jetzt ...

Hast du schon ohne do always probiert?

Zusätzlich kannst du etwas in den Log schreiben, um zu wissen welcher Zweig da jeweils zuschlägt, z. B.

(set HWBR on, {Log 2, "Zweig cmd_1"})

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

M_I_B

#8
... ja, ohne "do always" habe ich auch schon probiert. Das geht leider gar nicht. Dann werden die Zweige zum Einschalten nie erreicht, unabhängig davon, was einen Event auslöst (Vorgaben, IST-Temperaturen, ...). Auch wenn ich dann den Brenner oder die Umwälzung manuell starte, wird die zeitnah wieder abgeschaltet, obwohl alle Bedingungen für einen Brennstart gegeben sind.
Setze ich an Stelle von "do always" ein leeres "DOELSE" dahinter, habe ich das gleiche Verhalten wie mit "do always", allerdings mit dem Unterschied, das auch ein manuelles Starten zeitnah beendet wird wie "ohne alles"...

Also irgendwas ist das merkwürdig. Ich kann dir nicht sagen, wie oft ich den ganzen Vorgang schon auf Papier durchgegangen bin, ohne auf die Lösung zu kommen.

Das mit dem Zweig musst du mir noch mal erklären. Mein Log schreibe ich wie üblich mit ...
define FileLog_HZBR FileLog ./log/%Y-%m_Brenner.log HWBR:.*
attr FileLog_HZBR logtype text
attr FileLog_HZBR room _Logdateien_


Wo/wie muss ich die Erweiterung jetzt hinbosseln?

Ok, hab's gefunden. Schreibt er zwar dann in fhem-log, aber reicht auch. Also eingebaut habe ich es so:
# Brenner Tag-/ Nachtbetrieb
define set_HWBR DOIF ([a29] < 0) (set HWBR off, {Log 2, "Zweig cmd_1"}) DOELSEIF ([a29] > 1) (set HWBR on, {Log 2, "Zweig cmd_2"}) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and ([hzsp] + [HYSt]) < [HZSPt] and [HWBR] eq "off") (set HWBR on, {Log 2, "Zweig cmd_3"}) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and ([hzsp] + [SWG]) > [HZSPt] and [HWBR] eq "on") (set HWBR off, {Log 2, "Zweig cmd_4"}) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] > ([hzsp] + [HYSn]) and [HWBR] eq "off") (set HWBR on, {Log 2, "Zweig cmd_5"}) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] < ([hzsp] + [SWG]) and [HWBR] eq "on") (set HWBR off, {Log 2, "Zweig cmd_6"}) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set HWBR off, {Log 2, "Zweig cmd_7"}) \
DOELSE
#attr set_HWBR do always
attr set_HWBR room System.DOIF

... und dann steht bei jedem Schluckauf im Fhem-Log " ...
2016.11.08 19:38:00.497 2: Zweig cmd_3
2016.11.08 19:40:21.911 2: Zweig cmd_3
2016.11.08 19:42:30.969 2: Zweig cmd_3

.... passend zu ...
2016-11-08_19:36:21 HWBR on
2016-11-08_19:37:10 HWBR off
2016-11-08_19:38:00 HWBR off
2016-11-08_19:40:21 HWBR off
2016-11-08_19:42:30 HWBR off


Demnach würde das "set HWBR on" ein off senden?!?!??!? Nu bin ich ganz wirr ... :o

M_I_B

... so Kollegas della DOIF  ::)

Ich habe mal etwas umgebaut und einen TriState- Dummy zu Hilfe genommen, die ich zu Hauf als 3state oder 4state auf dem Server für Lichtsteuerung u.s.w. verwende. Umgebaut wie folgt:

# Brenner Tag-/ Nachtbetrieb
define set_HWBR DOIF ([a29] < 0) (set 29d1 -1, {Log 2, "Zweig cmd_1"}) DOELSEIF ([a29] > 1) (set 29d1 1, {Log 2, "Zweig cmd_2"}) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and ([hzsp] + [HYSt]) < [HZSPt] and [HWBR] eq "off") (set 29d1 1, {Log 2, "Zweig cmd_3"}) \
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and ([hzsp] + [SWG]) > [HZSPt] and [HWBR] eq "on") (set 29d1 -1, {Log 2, "Zweig cmd_4"}) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] > ([hzsp] + [HYSn]) and [HWBR] eq "off") (set 29d1 1, {Log 2, "Zweig cmd_5"}) \
DOELSEIF ([b29] == 0 and [DayNight] eq "on" and [HZSPn] < ([hzsp] + [SWG]) and [HWBR] eq "on") (set 29d1 -1, {Log 2, "Zweig cmd_6"}) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set 29d1 -1, {Log 2, "Zweig cmd_7"}) \
DOELSE
#attr set_HWBR do always
attr set_HWBR room System.DOIF

"set HWBR on/off wurde nun durch "set 29d1 -1/1" ersetzt und zielt auf einen schnöden 1zeiler- Dummy gleichen Namens. Auf die Hardware umgesetzt wird das mit ...
define do_HWBR DOIF ([29d1] < 0) (set HWBR off, {Log 2, "Z1 BR-off"}, set 29d1 0, {Log 2, "Z1 D0"}) \
DOELSEIF ([29d1] == 1) (set HWBR on, {Log 2, "Z2 BR-on"}, set 29d1 0, {Log 2, "Z2 D0"}) \
DOELSEIF ([29d1] > 1) (set HWBR on-for-timer [29d1], {Log 2, "Z3 Timer"}, set 29d1 0, {Log 2, "Z3 D0"})
attr do_HWBR do always

Und nun ist zumindest beim Brenner der Schluckauf weg, wie man auch schön in den Log's sieht:
2016-11-08_20:45:48 HWBR on
2016-11-08_20:51:48 HWBR off

2016.11.08 20:45:48.914 2: Z2 BR-on
2016.11.08 20:45:48.917 2: Z2 D0
2016.11.08 20:45:48.926 2: Zweig cmd_3
2016.11.08 20:51:48.956 2: Z1 BR-off
2016.11.08 20:51:48.960 2: Z1 D0
2016.11.08 20:51:48.970 2: Zweig cmd_4

Das heißt also im Klartext, das ein direktes Schalten des Brenners resp. GPIO aus mir vollkommen unverständlichen Gründen sporadisch ein "off" sendet, obwohl in der entsprechenden Zeile ganz klar "on" steht. Wenn aber damit ein Dummy geschaltet wird, der wiederum die Hardware schaltet, dann taucht der Schluckauf nicht auf (bis jetzt).

Ich habe dafür wie gesagt nicht den geringsten Erklärungsansatz. Wenn überhaupt, kann das nur Damian aufklären?!?
Ist zwar auch nur Symptom- Bekämpfung, was mich i.d.R., ziemlich anpi***, aber im Moment möchte ich weder die Relais noch Brenner oder Pumpen auf's Spiel setzen, die solche Hüpfer sicherlich auf Dauer nicht witzig finden ...

Per

Ich habe zwar nicht wirklich was zu deinem aktuellen Problem beizutragen, aber was Grundsätzliches:
bei deinen Abfragen ist [hzsp] eine "Konstante", sprich, die ist die Größe, gegen die in allen Vergleichen geprüft wird. Deshalb würde ich auch [hzsp] immer alleine auf eine Seite setzen, damit erkennst du (und wir) eher die Zusammenhänge.

Aus
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and ([hzsp] + [HYSt]) < [HZSPt] and [HWBR] eq "off") (set 29d1 1, {Log 2, "Zweig cmd_3"})wird dann
DOELSEIF ([a29] == 0 and [DayNight] eq "off" and [hzsp] < ([HZSPt] - [HYSt]) and [HWBR] eq "off") (set 29d1 1, {Log 2, "Zweig cmd_3"})
Sieht bei einem Zweig nicht spektakulär aus, wenn du aber mehrere untereinander hast, merkst du den Unterschied beim Lesen! Besonders mit den Beispielzahlen.

M_I_B

#11
... da hast du vollkommen recht, und deshalb habe ich gestern das und die DayNight- Sache schon umgebaut nach:

# Dummy für Tag- / Nachbetrieb setzen
define set_DayNight DOIF ([05:00-22:00|8] or [07:00-23:00|7]) (set HZSP [HZSPt], set HYS [HYSt], set DayNight off) DOELSE (set HZSP [HZSPn], set HYS [HYSn], set DayNight on)
attr set_DayNight do always
attr set_DayNight room System.DOIF

# Brenner Tag-/ Nachtbetrieb , {Log 2, "Zweig cmd_7"}
define set_HWBR DOIF ([a29] < 0) (set 29d1 -1) DOELSEIF ([a29] > 1) (set 29d1 1) \
DOELSEIF ([a29] == 0 and ([hzsp] + [HYS]) < [HZSP]) (set 29d1 1) \
DOELSEIF ([a29] == 0 and ([hzsp] + [SWG]) > [HZSP]) (set 29d1 -1) \
DOELSEIF ([hzsp] >= 85 or [hzvl] >= 85) (set 29d1 -1)
attr set_HWBR room System.DOIF
attr set_HWBR do always


Ist aber eigentlich auch verkehrt herum. HZSP ist der SOLL- Wert, hzsp der IST-Wert, HYS und SWG auch SOLL- Werte. Habe ich mir so angewöhnt SOLL groß und IST klein zu schreiben (was natürlich unter WinDoof Probleme machen würde...)