Hauptmenü

Reaktion auf Zähleränderung

Begonnen von Knallfrosch, 11 Oktober 2024, 00:01:05

Vorheriges Thema - Nächstes Thema

Knallfrosch

Hallo zusammen,

ich versuche mit einem DOIF den Brennerzustand über den Gasbezug anzuzeigen.

ZIEL: Ändert sich der Wert des Gaszaehler:gas_total = Brenner EIN, ändert sich der Gaszaehler:gas_total 60s nicht mehr = Brenner AUS

Ich scheitere aber schon an der Bedingung für Brenner EIN.

Folgendes habe ich bisher versucht:

Im Gaszaehler habe ich das attr Oldreading für den Zählwert (gas_total) angelegt.

und

([Gaszaehler:gas_total] > [Gaszaehler:gas_total_Old])
(setreading Gasheizung_Zustand status Brenner EIN)

DOELSE       (setreading Gasheizung_Zustand status Brenner AUS)

Das funktioniert leider nicht, da die Bedingung "EIN" quasi immer erfüllt ist.

Kann mir bitte jemand helfen wie ich das o.g. Ziel erreichen kann?

Vielen Dank.



Per

Da der Zähler eh nur eine Richtung kennt, reicht es, wenn du auf Event reagierst. Dazu wait 0:xxx (musst du sehen, welche Zeit sinnvoll ist) und resetwait nutzen.
([Gaszaehler:"gas_total"])()()Und statt setReading kannst du mit
cmdState on|off
ein vergleichbares Ergebnis erzielen.

Knallfrosch

#2
Hallo,

danke für deine Unterstützung.
Ich kann mir oft mit Versuch und Irrtum helfen, hier hänge ich aber nach wie vor fest.

Folgendes habe ich gemacht:

attr Gaszaehler event-on-change-reading gas_total
DOIF:
([Gaszaehler:gas_total])
(setreading Gasheizung_Zustand status Brenner in Betrieb)

DOELSE       (setreading Gasheizung_Zustand status Brenner AUS)

und
attr Gasheizung_Zustand wait 0:15
attr Gasheizung_Zustand do resetwait

Gedanke war:
Wenn ein sich das Reading Gaszaehler:gas_total ändert wird die 1. Bedingung des DOIF ausgelöst und wenn innerhalb von 15s kein neues Event kommt die 2. Bedingung.

Das funktioniert aber nicht. Die 2. Bedingung wird nicht angestoßen.

Ich finde den Fehler nicht.


Grüße




Per

Kein DOELSE, sondern direkt dahinter.
do always
brauchst du noch.
Und
wait 0,15
War mein Fehler!

Alternativ im Perl Mode, dann brauchst du die ganzen Attribute nicht. Einfach immer den gleichen Timer auf 15 s setzen, und dieser Timer setzt das Reading auf "Brenner aus".

Otto123

Siehe auch https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Der Vorschlag war ([Gaszaehler:"gas_total"])()()
Die Realisierung ist anders: ([Gaszaehler:gas_total])
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Knallfrosch

Hallo,

Zitat von: Per am 11 Oktober 2024, 08:45:19Kein DOELSE, sondern direkt dahinter.
do always
brauchst du noch.
Und
wait 0,15
War mein Fehler!

Alternativ im Perl Mode, dann brauchst du die ganzen Attribute nicht. Einfach immer den gleichen Timer auf 15 s setzen, und dieser Timer setzt das Reading auf "Brenner aus".

Dank deiner Hilfe, habe ich es geschafft. Es funktioniert jetzt wie ich es mir gewünscht habe.
Den Timer musste ich deutlich verlängern (war zu erwarten), da die Heizung moduliert und der Gasverbrauch dadurch deutlich sinkt liefert der Zähler seltener eine Änderung.

Deine Hinweise zu cmdState statt setreading und den Timer mit Perl einzubauen muss ich mir nochmal in Ruhe ergänzend anschauen.
Warum würdest du das eigentlich empfehlen?
Ist das nur "schöner" oder hat es auch andere Gründe?

Zitat von: Otto123 am 11 Oktober 2024, 09:39:53Siehe auch https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Der Vorschlag war ([Gaszaehler:"gas_total"])()()
Die Realisierung ist anders: ([Gaszaehler:gas_total])

Danke für den Hinweis auf meinen Fehler, habe ich korrigiert.
Es funktionierte auch ohne die "".
Ich verstehe den Unterschied allerdings auch nach dem 3. Lesen der commandref nicht.

Kannst du bitte versuchen mir das mit anderen Worten zu erklären!?

Danke.

Grüße

Per

Perl ist hier einfach "eleganter", auch die Prozessorlast dürfte kleiner sein.

Da hier kein Vergleich stattfindet, sollte Event und Wert (also mit und ohne Anführungszeichen) gleich funktionieren. Ob es in der Last einen Unterschied macht, kann ich nicht beurteilen.

Damian

#7
Es steht in der Commandref:
ZitatAnwendungsbeispiel: wie oben, jedoch wird hier nur das Ereignis (welches im Eventmonitor erscheint) ausgewertet und nicht der Status von "remotecontrol" wie im vorherigen Beispiel

das bedeutet bei:

[Gaszaehler:"gas_total"]

wird bei einem Ereignis von Gaszaehler das Event (welches im Eventmonitor erscheint) auf Vorkommen von "gas_total" durchsucht, das Ergebnis der Auswertung kann nur wahr oder nicht wahr sein.

bei

[Gaszaehler:gas_total]

wird bei einem Ereignis von Gaszaehler das Reading gas_total ausgewertet und zurückgeliefert. Normalerweise würde man es mit einem Wert vergleichen z. B. [Gaszaehler:gas_total] > 1000, wenn man dagegen keinen Vergleich anstellt, entspricht das der Angabe [Gaszaehler:gas_total] != 0  (ungleich Null).

Solange gas_total nicht Null ist, wird es funktionieren, sollte gas_total bei dieser Angabe gleich Null sein, wird deine Bedingung nicht wahr sein.

Daher ist für dich die Angabe in Anführungszeichen die bessere Wahl.

Bei so kleinen Definitionen muss man nicht DOIF-Perl verwenden, die Unterschiede werden marginal sein.


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