Reading mit Wert ausfüllen wenn 2 Bedingungen erfüllt sind

Begonnen von Depechem, 30 Oktober 2020, 09:39:54

Vorheriges Thema - Nächstes Thema

Depechem

Hallo ich möchte gern ein reading (z.b.: eines dummys) mit einem Wert füllen wenn 2 Dinge erfüllt werden.
- wenn Kontakt1 open & Kontakt2 closed  & Schalter10 on = schreibe in ein Reading (z.b.: in ein dummy) die Zahl 15
- wenn Kontakt1 open & Kontakt2 open  & Schalter10 on = schreibe in ein Reading (z.b.: in ein dummy) die Zahl 30
- wenn Schalter10 off = darf nicht ins Reding geschrieben werden.

könnt ihr mir da bitte Ansätze oder codeschnipsel zur Verfügung stellen. entweder als notify, Doif, dummys...

Bin euch für eure Hinweise dankbar
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

MadMax-FHEM

#1
Dann sag doch mal: welche von den genannten Devices (ich nehme mal an das sind 3 Devices plus der dummy wo es landen soll?) "Kontakt1", "Kontakt2" und "Schalter" denn "auslösen" sollen!?

Also WELCHE Änderung an WELCHEM Device soll denn dazu führen, dass etwas passiert?

Nur eines davon?
Alle 3?

Weil egal ob notify oder DOIF: irgendwas muss der "Auslöser" sein, sonst passiert nichts!

(außer du machst es "zyklisch" per at, dann ist eben die "Uhrzeit" der "Auslöser" ;)  )

EDIT: wenn du dich entschieden hast (und es nur ein Device als Aulöser gibt/geben soll), dann den Eventmonitor öffnen und auf den Event warten, der eben "auslösen" soll. Den dann markieren und ein DOIF/notify "bauen lassen". Das dann eben mit if(ReadingsVal("Schalter","state","n.a.") eq "on" (wenn der gewünschte Zustand eben in "state" steht. Wenn woanders, dann anpassen) entsprechend prüfen und "entscheiden". Dann entweder "set dummyName Wert" oder (wenn du es in einem dummy als Reading willst) "setreading dummyName Wert". Bei DOIF evtl. andere Aufrufe nötig/möglich. Und da du (zumindest bei notify an der Stelle verm. "in" Perl bist musst du für fhem-Aufrufe [set / setreading etc.] die "fhem-Funktion" benutzen: fhem("set dummy Wert")...

https://wiki.fhem.de/wiki/Event_monitor
https://wiki.fhem.de/wiki/Eventhandler
https://wiki.fhem.de/wiki/Klammerebenen
https://wiki.fhem.de/wiki/If-condition

EDIT:
Zitat von: Depechem am 30 Oktober 2020, 09:39:54
Bin euch für eure Hinweise dankbar
hiermit getan... :)

EDIT: ok, einen hab ich noch ;) Wenn alle 3 Devices auslösen sollen, dann geht das indem du bei notify den "Trigger" entsprechend gestaltest (also die "Trigger-RegEx"). Z.B. sollen beide Kontakte dazu führen, dass geprüft und gesetzt wird, dann sowas (NUR EIN BEISPIEL!!!): define nTest notify Kontakt.:(open|closed) {if...}   /   Bei DOIF eben entsprechend "Trigger-Bedingungen" oder "nur" "Abfrage-Bedingungen" (siehe commandref)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Hi,

ich würde "hinten" anfangen :)
Pseudocode:
define n_test notify Schalter10:on {if(Kontakt1 eq open){if(Kontakt2 eq closed){schreibe in ein Reading (z.b.: in ein dummy) die Zahl 15}else{schreibe in ein Reading (z.b.: in ein dummy) die Zahl 30}}}

Gruß Otto
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

Depechem

#3
Hallo Joachim,

-Kontakt1 und Kontakt2 sind eine Art Fenstekontakte vom (HmIPW-DRI32) mit den state "open" und "closed" < diese lösen aus
-Schalter10 ist eine Schaltsteckdose mit den state "on" und "off" < diese soll auch Außlöser sein.

-der Dummy o.ä. soll dann beschrieben werden

Hintergrund: es wird eine Füllstandsanzeige. Kontakt1 bedeutet 15% Kontakt2 30% ... diese Daten sollen in irgend ein Reading geschrieben werden, damit ich ein Reading mit Prozentangabe bekomme.
nun darf das Reading aber nur in Kombination mit dem Schalter10 on geschrieben werden, da wenn Schalter10 off auch alle Kontakt1 Kontakt2... automatisch in "closed" gehen und ich das aber nicht ausgewertet haben möchte.

Also das Reading darf nur beschrieben werden wenn Schalter10 on und einer der Kontakte1, 2... eine "state" Änderung bekommt
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Depechem

Zitat von: Otto123 am 30 Oktober 2020, 12:20:19
Hi,

ich würde "hinten" anfangen :)
Pseudocode:
define n_test notify Schalter10:on {if(Kontakt1 eq open){if(Kontakt2 eq closed){schreibe in ein Reading (z.b.: in ein dummy) die Zahl 15}else{schreibe in ein Reading (z.b.: in ein dummy) die Zahl 30}}}

Gruß Otto

Hallo Otto, Danke für den notify Ansatz.
natürlich müssen mehrere Readings geschrieben werden.
also Kontakt1 15%, Kontakt2 30% Kontakt3 45%... kann man dies auch mit einem notify lösen oder ist da ein DOIF besser?
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Otto123

#5
Klar kannst Du mehrere Readings beschreiben, dann wird halt die Bedingungsabfrage anders.

Was mich stutzig macht ist das:
ZitatAlso das Reading darf nur beschrieben werden wenn b]Schalter10 on[/b] und einer der Kontakte1, 2... eine "state" Änderung bekommt
Also der zeitpunkt der state Änderung von Schalter10 spielt keine Rolle?

Dann musst Du doch auf die Kontakte triggern:
define n_test notify Kontakte[1-9]:closed {}

Ist jetzt open oder closed der Kontakte der entscheidende Event?
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

Depechem

#6
Zitat von: Otto123 am 30 Oktober 2020, 12:30:01
Klar kannst Du mehrere Readings beschreiben, dann wird halt die Bedingungsabfrage anders.

Was mich stutzig macht ist das:Also der zeitpunkt der state Änderung von Schalter10 spielt keine Rolle?

Dann musst Du doch auf die Kontakte triggern:
define n_test notify Kontakte[1-9]:closed {}

Ist jetzt open oder closed der Kontakte der entscheidende Event?

genau,
open oder closed der Kontakte sind die entscheidenden Events, aber nur wenn "Schalter10" den state "on" hat. Bei "Schalter10" state "off" dürfen die Events von den Kontakten nicht ins Reading schreiben

und Kontakte[1-9]:closed wird wohl nicht funktionieren da ich ja die einzelnen Kontakte extra auswerten muss
RaspberryPi2 / FHEM / 3 Wand-Tablets mit Tablet UI / HM USB / verschiedene HM-Aktoren / JeeLink USB für WS1600 und mehrere LaCrosse Sensoren / HEOS ...

Otto123

#7
Zitatopen oder closed der Kontakte sind die entscheidenden Events
Wirklich beide Events sind entscheidend? Dann vom Prinzip her doch so:
define n_test notify (Kontakte[1-9]:closed|Kontakte[1-9]:open) {if (Schalter10 eq on){Hier muss die Logik zum auslesen und schreiben hin}}
Die Logik zum auslesen scheint ja komplexer zu sein als bisher beschrieben ;)

Zitatwird wohl nicht funktionieren da ich ja die einzelnen Kontakte extra auswerten muss
Was meinst Du damit? $NAME liefert Dir den Kontakt der ausgelöst hat. $EVENT liefert Dir den Auslösezustand.
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

Beta-User

Vielleicht auch ein Ansatz (eher mathematisch, wenn ich das richtig interpretiere, aber das scheint ja das zu sein, was gewünscht ist):

https://forum.fhem.de/index.php/topic,110165.msg1041882.html#msg1041882

leicht OT@Otto: laß' doch gleich auch noch die Klammern weg, sonst denkt noch jemand, die seien erforderlich:
define n_test notify Kontakte[1-9]:closed|Kontakte[1-9]:open {if (Schalter10 eq on){Hier muss die Logik zum auslesen und schreiben hin}}
(Schon klar, dass das auch mit Klammern eine "geprüfte regex ist ;) ).
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

#9
auch leicht OT, ich dachte ja, ich hätte es verstanden - aber
{ notifyRegexpCheck('Kontakte[1-9]:open')} liefert auch bloß wieder Kontakte[1-9]:open: no match (ignored)

Also müsste man Kontakte.:[open,closed] Kontakte.:[closedpn]+ als Trigger nehmen? Nach welchen Regeln funktioniert notifydev :o
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

Beta-User

Schock schwere Not :o :o :o .
Beim Device scheint das mit den eckigen Klammern nicht zu klappen, da ist der Punkt besser? Und hinten? wird das wirklich ausgewertet, wenn man das in Array-Format da reinhaut?!?

Bisher war ich davon ausgegangen, dass [xy] nochmalen Regex-Regeln folgt, also genau ein Zeichen gemeint ist, und der zweite Vorschlag daher nicht klappt - das scheint auch grundlegend falsch zu sein...!

Mir ging es eigentlich nur um die "Hygiene": runde Klammern klingen nach "oder", da ist die Pipe nicht weit, und dann wird wirklich unspezifisch gearbeitet, was dann auch mit notifyRegexpCheck() aufgedeckt wird.
Grummel, irgendwie habe ich mal wieder was nicht richtig verstanden (wobei ich das bei meinen regexen jetzt eigentlich durchgängig bereinigt habe, so dass am Ende eben ein "ok" kam).
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