notify mit 2 Bedingungen aus Readings

Begonnen von derFelix, 31 März 2022, 00:57:49

Vorheriges Thema - Nächstes Thema

Otto123

ZitatAuslösen muss das notify unabhängig davon, welche Bedingung eher eintrifft, aber beide müssen erfüllt sein. Also müssen beide Bedingungen als Trigger eingesetzt werden.
ZitatDer Teiler | löst offensichtlich aus, wenn eines der beiden Ereignisse eintritt, aber es reicht eine Bedingung aus für die Auslösung. Eine klassische oder-Schaltung, aber nicht meine benötigte und-schaltung.
Was denn nun? ::)
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

derFelix

ZitatZitat
Auslösen muss das notify unabhängig davon, welche Bedingung eher eintrifft, aber beide müssen erfüllt sein. Also müssen beide Bedingungen als Trigger eingesetzt werden.
Zitat
Der Teiler | löst offensichtlich aus, wenn eines der beiden Ereignisse eintritt, aber es reicht eine Bedingung aus für die Auslösung. Eine klassische oder-Schaltung, aber nicht meine benötigte und-schaltung.
Was denn nun? ::)
Entschuldige, war blöd ausgedrückt: Zeile 1 war mein Wunsch, Zeile 2 eine (nicht gewünschte) Zustandsbeschreibung.

ZitatWie gibts du das ein? Bitte nur über FHEMWEB arbeiten.

Irgendwie fehlen mir da ein paar Doppelpunkte, und die Querstriche sind auch "verdächtig". Jetzt doch mal ein Versuch mit "!":
Code: [Auswählen]
Wetterstation:solarradiation:.0|Ess10:.essinfo.home.direction.is_battery_discharging_:.0 {fhem('set Buero_Decke off') if ReadingsVal('Buero_Decke','state','on') ne 'off' && !ReadingsVal('Ess10','/essinfo/home/direction/is_battery_discharging_','1') && !ReadingsVal('Wetterstation','solarradiation','1') }

Bitte ausnahmsweise nicht das "trigger"-Kommando nehmen, sondern
Code: [Auswählen]
setreading Wetterstation solarradiation 0

Ich geb alles über FHEM Web ein.
Ich habe obigen Code eingegeben, bei Befehl "setreading" auf die solarradiation löst das notify aus, mit dem trigger-Befehl nicht. Beide male war battery_discharging 0. Nun versuche ich mal die ! zu verstehen. Ob das jetzt mit Betrieb auf Akku auch geht, weiß ich aber nicht. Vielen Dank für die Mühe.

Beta-User

Dein Trigger-Kommando war wie vermutet "kaputt"...

Das "!" ist einfach die Kurzform von "nicht", der Ausdruck wird "wahr", wenn die jeweilige Reading-Abfrage, die danach kommt nicht "0", (Perl-) undef oder '' (leerer Text) liefert.
Ergänzend: "&&" ist die Kurzform von "logisch und" (aber nicht (!) gleichbedeutend mit "and"), "logisch oder" wäre "||" (was wiederum nicht ganz dasselbe ist wie das (leider) häufig hier zu findende "or").
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Otto123

Zitat von: derFelix am 31 März 2022, 17:16:10
Entschuldige, war blöd ausgedrückt: Zeile 1 war mein Wunsch, Zeile 2 eine (nicht gewünschte) Zustandsbeschreibung.
Ich wiederhole mal für mich: Dein Wunsch war: Es sollen beide Devices triggern. Der Zustand wäre: es triggern beide Devices - wieso ist das jetzt nicht gewünscht?
Der Trigger
Wetterstation:solarradiation:.0|Ess10:.essinfo.home.direction.is_battery_discharging_:.0
löst aus wenn solarradiation auf 0 geht und / oder löst aus wenn is_battery_discharging_ auf 0 geht. Der logische Begriff und / oder hängt jetzt hier von der Sichtweise ab.
Beide Ereignisse triggern: das eine oder das andere ...
Beide Ereignisse kommen nicht gleichzeitig - also und gibt es quasi nicht - es müssen nicht beide auftreten.
Egal welcher Wert den Trigger setzt, die Abfrage erfolgt über beide Werte - im nachfolgenden if(){}
Beispiel:
um 10:45 geht solarradiation auf 0 - notify löst aus, Abfrage wird gestartet.
um 10:56 geht is_battery_discharging_ auf 0  - notify löst aus, Abfrage wird gestartet.

Es war nur eine Frage von mir! Kann sein, deine Intension war:
wenn is_battery_discharging_  auf 0 geht will ich ich den Wert  solarradiation wissen.
wenn solarradiation auf 0 geht will ich den Wert  is_battery_discharging_  wissen.
wenn sich solarradiation ändert will ich beide Werte abfragen.
wenn sich is_battery_discharging_ ändert will ich beide Werte abfragen.
wenn sich einer der beiden Werte ändert will ich beide Werte abfragen.
:D
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

derFelix

Puh, dass die Abfragen so schwierig werden können...   ???

Also ich möchte, dass jedesmal, wenn entweder battery_discharging_ ODER solarradiation auf 0 fällt abgefragt wird, ob BEIDE Werte bei 0 liegen. Nur in diesem Fall ( 2mal 0) soll geschaltet werden. Also die Abfrage als ODER, die Schaltung als UND. Für mich als Leihe schwierig, schon solche Details in Worte zu fassen.

Ziel der Übung: Ich Lese aus der PV-Anlage aus, ob bei Dunkelheit Strom aus dem Akku genommen wird. Solange dies der Fall ist, soll der Wechselrichter weiter laufen. Wenn jedoch der Akku alle ist, soll der Wechselrichter ausgeschaltet werden, um Energie zu sparen, da die Anlage das jedenfalls nicht zuverlässig hin bekommt. Früh, wenn es wieder hell wird, soll die Anlage natürlich wieder in Bereitschaft gesetzt werden, um die Sonnenenergie möglichst auch voll nutzen zu können.
Nun kann es aber auch sein, dass an trüben Tagen der Akku nur ganz wenig geladen wird und ein strafferer Verbraucher den Akku auch am Mittag leer saugt, obwohl die Anlage noch Strom, wenn auch nicht viel, liefert. Dann soll die Anlage natürlich bis zum Eintreten der Dunkelheit weiter laufen, obwohl der Akku lange leer ist.

Ich hoffe, ich konnte mich halbwegs verständlich ausdrücken. Als Statiker kann ich zwar abstrakt denken, dass mir viele in meinem Fachgebiet auch schwer folgen können, aber eine Aufdröselung meines Problems in eine ODER und eine UND-Funktion hab ich nicht hin bekommen...


Otto123

Alles gut, dann hast Du Dir jetzt genau die Funktion von Beta-Users Vorschlag in #14 erklärt :) Der prüft zusätzlich noch ob der Wechselrichter schon aus ist.
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

derFelix

#21
So, nun hatte ich Zeit, alles durch zu probieren. Es klappt leider immer noch nicht.
1. Problem ist, dass is_battery_discharging_ auf bei einem Akkustand von 0% weiterhin auf 1 stehen bleibt. Das konnte ich ändern, indem ich den Ladestand des Akkus als trigger nutze.
Folgende Änderungen habe ich nun durchgeführt:
Wetterstation:solarradiation:.0.00|Ess10:/essinfo/common/BATT/soc:.0.0 {fhem('set Buero_Decke off') if ReadingsVal('Buero_Decke','state','on') ne 'off' && ReadingsVal('Ess10','/essinfo/common/BATT/soc','0.0') && ReadingsVal('Wetterstation','solarradiation','0.00') }

Es sieht so aus, als ob nicht mit Zahlen, sondern mit Zeichenfolgen hantiert wird, und dementsprechend muss der Ausdruck im notify exakt dem Ausdruck im Reading gleichen ( 0.00 und 0.0 statt einfach 0). Demzufolge funktionierten auch die !ReadingsVal-Ausdrücke nicht.

Wie kann ich den Ausdruck ReadingsVal('Wetterstation','solarradiation','0') so ändern, dass er als Zahl erkannt wird und auch mit größer, kleiner und gleich gearbeitet werden kann?

Mit oben genannten Ausdruck schaltet das notify immer, wenn auch nur ein Wert 0 erreicht, also auch, wenn beispielsweise solarradiation auf 100 steht und Ess10:/essinfo/common/BATT/soc: auf 0.0 fällt. Das dürfte doch bei obigem notify nicht passieren, werden doch 3 Bedingungen abgefragt (Schalter an oder aus? Solarradiation bei 0? Ladestand 0%?) und nur bei eintreten aller Bedingungen sollte das notify schalten.

Edit:
Bei folgendem notify erkennt er die Werte auch als Zahlen:

Wetterstation:solarradiation:.* {fhem('set Buero_Decke on') if ReadingsVal('Buero_Decke','state','off') ne 'on' && ($EVTPART1 > 0) }


Otto123

ZitatEs sieht so aus, als ob nicht mit Zahlen, sondern mit Zeichenfolgen hantiert wird, und dementsprechend muss der Ausdruck im notify exakt dem Ausdruck im Reading gleichen ( 0.00 und 0.0 statt einfach 0). Demzufolge funktionierten auch die !ReadingsVal-Ausdrücke nicht.
Hast Du eigentlich schon mal ein bisschen Grundlagen gelesen?
https://wiki.fhem.de/wiki/Erste_Schritte_in_FHEM#Bei_Event_ausf.C3.BChren_-_notify
Zitat
Wie kann ich den Ausdruck ReadingsVal('Wetterstation','solarradiation','0') so ändern, dass er als Zahl erkannt wird und auch mit größer, kleiner und gleich gearbeitet werden kann?
ReadingsNum() verwenden. https://fhem.de/commandref_DE.html#perl

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

derFelix

ZitatHast Du eigentlich schon mal ein bisschen Grundlagen gelesen?
https://wiki.fhem.de/wiki/Erste_Schritte_in_FHEM#Bei_Event_ausf.C3.BChren_-_notify
Ja, das habe ich gelesen und versucht, zu verstehen. Nur steht da nichts zu meinem Problem drin. Deswegen frage ich nach.
ZitatReadingsNum() verwenden.
Genau das war der entscheidende Hinweis. Vielen Dank. Damit habe ich mein Problem entgültig gelöst bekommen:
Wetterstation:solarradiation:.0.00|Ess10:/essinfo/common/BATT/soc:.0.0 {fhem('set Ess10 System off') if ReadingsVal('Ess10','/essinfo/home/operation/status','start') ne 'stop' && ReadingsNum('Ess10','/essinfo/common/BATT/soc','1') == 0 && ReadingsNum('Wetterstation','solarradiation','1') == 0 }
Danke euch beiden, ihr habt mir gut weiter geholfen!




Otto123

Wenn ich deinen Beitrag #21 richtig verstehe ist das nicht richtig. Und Du hast nicht verstanden, dass im notify im vorderen Teil mit Suchmustern gearbeitet wird und Zahlen quasi keine Rolle spielen. Die ReadingsXXX() Funktionen lesen die exakten Werte aus, so wie sie sind. ReadinsgNum() extrahiert aus eine Zeichenkette die Zahl - aus 20% wird also eine 20.

Deswegen solltest Du wahrscheinlich besser auf alles triggern:
Wetterstation:solarradiation:.*|Ess10:/essinfo/common/BATT/soc:.*

Ein Suchmuster auf einen bestimmten Zahlenbereich kann man zwar machen, ist aber hohe Schule. Ganz oben war ich mal von exakt 0 ausgegangen, das wiederum ist einfach :)
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

derFelix

#25
Das habe ich schon verstanden, deswegen steht auch im vorderen Suchmuster nicht 0, sondern 0.0 bzw. 0.00.
Wenn ich es wie Du beschrieben eingebe:
ZitatDer Trigger
Code: [Auswählen]
Wetterstation:solarradiation:.0|Ess10:.essinfo.home.direction.is_battery_discharging_:.0
löst aus wenn solarradiation auf 0 geht und / oder löst aus wenn is_battery_discharging_ auf 0 geht.
Dann wird nicht ausgelöst. Es wird eben nicht als Zahl erkannt, sondern als Zeichenfolge. Wenn ich aber die Werte nummerisch vergleichen möchte, was für mich am logischsten ist, ist readingsnum() der richtige Ansatz.

Edit:
grade gesehen: Du beziehst Du auf den Eintrag weiter oben.
Du hast recht, wahrscheinlich hätte der auch schon funktioniert, nur nicht auslösbar mit manuellem triggern, oder ich habe meinen Raspberry zu stark geärgert...