Hauptmenü

Frage zu Generalisierung

Begonnen von Kai-Alfonso, 23 Januar 2018, 11:45:44

Vorheriges Thema - Nächstes Thema

Kai-Alfonso

Moin,

ich habe an meinen Fenstern HM Rollladenaktoren und HM Drehgriffkontaktsenoren (Homebrew). Beides ist wie folgt benannt:

Rollladen: HM_Rollladen_$RAUMNAME
Fenster: Fenster_$RAUMNAME

Beispiel:

HM_Rolllade_Wohnzimmer und Fenster_Wohnzimmer

Jetzt würde ich gerne per Doif folgendes prüfen: Wenn Drehgriffkontaktsensor meldet offen oder gekippt und Rollladen = 0 (also unten), dann soll er die Rollladen ein Stück hochfahren, bis das Fenster wieder geschlossen ist (dann Rollladen wieder runter)

Jetzt könnte ich natürlich für jeden Fenster/Rollladenkombination ein doif machen - würde das gerne aber über die Generalisierung und Regex lösen. Geht das irgendwie?

(["^Fenster_"] = "offen" and ["^HM_Rolllade":control]  eq 0)

würde ja auch jede Kombinationen betreffen, die nicht zusammen gehören 
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

CBSnake

Hi,

mal ein Weg:

vorweg (["^Fenster_"] = "offen" geht nicht (["^Fenster_"] eq "offen" geht,

== nur für Zahlen ;-)

Du könntest mit einem Userreading im Device Fenster den Zustand (control) des jeweiligen Rollos schreiben.

attr userreadings control {ReadingsVal('Das_Rollo_Device','control',0)}

Dann würde:

(["^Fenster_"] eq "offen" and [$DEVICE:control]  eq 0) schonmal als Abfrage triggern.

mit (Codeschnippsel)

({
my $room = AttrVal('$DEVICE','room','');;
fhem ("set HM_Rolladen_$room dein Wert")
})


kannst du dann deinen Aktor steuern.

Alles ungeprüft aus meiner Config zusammenkopiert :-)

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Kai-Alfonso

Zitat von: CBSnake am 23 Januar 2018, 12:07:37
Hi,

mal ein Weg:

vorweg (["^Fenster_"] = "offen" geht nicht (["^Fenster_"] eq "offen" geht,

== nur für Zahlen ;-)



Hallo Achim,

sorry - da hatte ich mich verschrieben - bei dem and part habe ich ja auch eq genutzt ;-)

Interessante Idee mit dem userReading - werde ich gleich mal testen
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Damian

Bei Ereignisabfragen auf das Ereignis abfragen:

["^Fenster_:offen"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Kai-Alfonso

Moin, das mit dem userReading scheint nicht wirklich zu funktionieren - der updatet das Reading nicht wirklich. event-on-change-reading beim Rollladen Device ist gesetzt.

Außerdem müsste ich ja je Fenster ein userReading machen - da kann ich gleich je Fenster/Rollladen Kombi ein DOIFELSE machen :-)

Kann ich mir nicht mit $DEVICE und Regex den Raum rausfriemeln?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

nils_

Zitat von: Kai-Alfonso am 24 Januar 2018, 09:50:35
Kann ich mir nicht mit $DEVICE und Regex den Raum rausfriemeln?
kannst du!
oder sowas https://perldoc.perl.org/functions/substr.html

oder beim fensterdrehgriff den rolloaktor mit speichern, oder oder oder.....
viele Wege in FHEM es gibt!

Per


Kai-Alfonso

Zitat von: Per am 29 Januar 2018, 12:49:50
"Ohne" Perl.

Danke Per - ich hatte es mit Perl hinbekommen, hab jetzt aber doch auf die Methode mit Filtern umgeschrieben. Die vielen Klammern (Doif, mit Perl wo wiederum ein Fhem Befehl ausgeführt wird) verwirren mich :-)

Hatte  das Filtern gar nicht auf dem Schirm, grade weil Doif und die Doku schon so mächtig geworden ist -also nochmal danke für den Hinweis.
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Kai-Alfonso

Zitat von: Per am 29 Januar 2018, 12:49:50
"Ohne" Perl.

Ups, jetzt hab ich doch noch eine Frage  :o :o :o

Ich kann einen set Befehl prima absetzen mit


(["^1Fenster_:geöffnet"])
(set 1HM_Rolllade_[$DEVICE:&NAME:"(.*)_(.*)":"$2"] control 1)


daraus einsteht dann durch Generalisierung und Regex folgender Befehl

set 1HM_Rolllade_Testraum control 1

Soweit _ so gut: Jetzt wollte ich davor noch ein IF hängen, der vorher prüft, ob die Rolllade überhaupt unten (=control 0) ist.  Das scheint irgendwie nicht zu gehen - bin mir auch nicht sicher, ob ich die eckigen Klammern richtig gesetzt habe. Die brauche ich ja beim set Befehl nicht, aber bei der Abfrage nach Zustand/Reading schon:

(IF ([1HM_Rolllade_[$DEVICE:&NAME:"(.*)_(.*)":"$2"]:control] = 0)
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Damian

So etwas (geschachtelte Angaben in eckigen Klammern):

(IF ([1HM_Rolllade_[$DEVICE:&NAME:"(.*)_(.*)":"$2"]:control] = 0)

funktionieren beim IF und auch beim DOIF nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

nils_

klammern habe ich mir nicht angeguckt,
aber ein vergleich ist '==' und nicht '=' (-> Zuweisung!)

//edit:
damian war schneller, anscheinend noch ein anderer "fehler"
viele Wege in FHEM es gibt!

Kai-Alfonso

Zitat von: Damian am 30 Januar 2018, 09:40:28
So etwas (geschachtelte Angaben in eckigen Klammern):

(IF ([1HM_Rolllade_[$DEVICE:&NAME:"(.*)_(.*)":"$2"]:control] = 0)

funktionieren beim IF und auch beim DOIF nicht.

Danke für die Info - dann kann man das anscheinend nur in Perl lösen?
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

Per

Zitat von: Kai-Alfonso am 30 Januar 2018, 09:56:11dann kann man das anscheinend nur in Perl lösen?
Nein, auch mit FHEM. Such mal nach "Filter".