Hallo alle zusammen,
ich habe heute beim stöbern in meinem System folgendes Reading meiner pilight Controle Einheit gefunden:
rcv_raw {"origin":"sender","protocol":"arctech_switch","message":{"id":15804858,"unit":3,"state":"off"},"repeat":1,"uuid":"0000-b8-27-eb-c9fa15"}
hier werden die empfangenen Frames angezeigt. Dies hat mich auf folgende Idee gebracht:
Da die Pilight Teilnehmer unidirektional sind (zumindest meine Steckdosen) und ich wegen des WAF noch eine Fernbedienung rumliegen habe, würde ich gerne die von dieser gesendeten Befehle in FHEM umsetzen und dann den Status auf das jeweilige Device übertragen.... so würde auch bei meiner TabletUI der Status stimmen.
Umsetzung möchte ich folgt realisieren:
DOIF -> [(reading ID & unit) = Wert1 & Wert2] und [(state reading) neq (state 433Mhz device)] ( toggle 433 Mhz Device)
das ist jetzt nicht die DOIF Syntax sondern die meiner Gedanken ;D
Nun kommt der Punkt an dem ich eure Hilfe benötige, da ich aus dem komplexen reading nicht die entsprechenden Werte gefiltert bekommen. Ich wäre dankbar, wenn mir hier jemand einen schubs in die richtige Richtung geben könnte.
Nach erneutem Studium der Commandref scheint es mir umsetzbar... oder liege ich hier schon falsch ?
Du kannst das Problem mit http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen lösen.
Definiere schon mal ein DOIF in der richtigen Syntax und wenn Du mit dem Filter oder der Ausgabeformatierung nicht weiter kommst, dann poste mal Deinen Versuch und erläutere Deine Schwierigkeiten.
Siehe auch https://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke
Sorry ich hättet den Code direkt anhängen sollen:
Ich musste auf 2 DOIF ausweichen, da die Steckdosen den befehl "toggle" nicht können.
1. DOIF
([PL_Control:rcv_raw:d] eq "15804858" and [PL_Control:rcv_raw:d] =~ ":3," and [PL_Control:rcv_raw:d] =~ "on") (set Lampe_1_dummy on)
DOELSEIF ([PL_Control:rcv_raw:d] =~ ":15804858," and [PL_Control:rcv_raw:d] =~ ":3," and [PL_Control:rcv_raw:d] =~ "off") (set Lampe_1_dummy off)
hier sind mehrere Versuche mit "eq" un "=~" drin. Allerdings funktioniert die isolierung der Werte nicht so wie ich mir das gedacht habe =)
ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) eq "15804858" and ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) =~ ":3," and ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) =~ "on"
Ich werde mir hierzu morgen den RegEx Part noch einmal genauer ansehen.
2. DOIF für die Status logik
([Lampe_1_dummy] eq "on" and [EG_WZ_SW_Lampe_1] ne "on") (set EG_WZ_SW_Lampe_1 on)
DOELSEIF ([Lampe_1_dummy] eq "off" and [EG_WZ_SW_Lampe_1] ne "off") (set EG_WZ_SW_Lampe_1 off)
Zitat von: Kermit20 am 19 Juli 2016, 22:12:38
Sorry ich hättet den Code direkt anhängen sollen:
Ich musste auf 2 DOIF ausweichen, da die Steckdosen den befehl "toggle" nicht können.
1. DOIF
([PL_Control:rcv_raw:d] eq "15804858" and [PL_Control:rcv_raw:d] =~ ":3," and [PL_Control:rcv_raw:d] =~ "on") (set Lampe_1_dummy on)
DOELSEIF ([PL_Control:rcv_raw:d] =~ ":15804858," and [PL_Control:rcv_raw:d] =~ ":3," and [PL_Control:rcv_raw:d] =~ "off") (set Lampe_1_dummy off)
hier sind mehrere Versuche mit "eq" un "=~" drin. Allerdings funktioniert die isolierung der Werte nicht so wie ich mir das gedacht habe =)
ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) eq "15804858" and ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) =~ ":3," and ReadingValDoIf($hash,'PL_Control','rcv_raw','(-?\d+(\.\d+)?)','',AttrVal($hash->{NAME},'notexist',undef)) =~ "on"
Ich werde mir hierzu morgen den RegEx Part noch einmal genauer ansehen.
2. DOIF für die Status logik
([Lampe_1_dummy] eq "on" and [EG_WZ_SW_Lampe_1] ne "on") (set EG_WZ_SW_Lampe_1 on)
DOELSEIF ([Lampe_1_dummy] eq "off" and [EG_WZ_SW_Lampe_1] ne "off") (set EG_WZ_SW_Lampe_1 off)
Wenn in deinem Status steht:
id:15804858,unit:3,state:off
Dann kannst du mit
[PL_Control:rcv_raw:"id:(.*),unit"]
auf
id zugreifen
mit
[PL_Control:rcv_raw:"unit:(.*),state"]
auf
unit zugreifen
und mit
[PL_Control:rcv_raw:"state:(.*)"]
auf
statezugreifen.
Gruß
Damian
Danke für deine konstruktive Hilfe, wenn ich das so lese, klingt es logisch. Leider gibt es auch bei der kürzesten Variante:
([PL_Control:rcv_raw:"id:(.*),unit"] = 15804858) (set Lampe_1_dummy on)
bereits Probleme.
error
perl error in condition: ReadingValDoIf($hash,'PL_Control','rcv_raw','id.:(.*),.unit','',AttrVal($hash->{NAME},'notexist',undef)) = 15804858: Can't modify non-lvalue subroutine call in scalar assignment at (eval 280800) line 2, at EOF
auch wenn dies nicht ganz verstehe, gehe ich aktuell davon aus, dass die Hochkommatar schuld sein könnten.
":{"id":15804858,"unit":3,"state":"off"},"
ich habe auch eine andere Variante versucht, da ich ja weiß wie viele Zeichen ich nach einem Doppelpunkt erwarte:
([PL_Control:rcv_raw:":(0-9.......),"] = 15804858) (set Lampe_1_dummy on)
aber auch hier kommt folgende Fehlermeldung:
error
perl error in condition: ReadingValDoIf($hash,'PL_Control','rcv_raw',':(0-9.......),','',AttrVal($hash->{NAME},'notexist',undef)) = 15804858: Can't modify non-lvalue subroutine call in scalar assignment at (eval 286260) line 2, at EOF
eine Idee ?
Ich be mich gerade gewundert, warum ich heute kein Nachricht aus meinem Müllkalender bekommen habe.... hier habe ich eine Ähnlich Fehlermeldung:
perl error in condition: DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and ReadingValDoIf($hash,'CAL_OC_Termine','CAL_Abfall_OC_Biotonne_tage','','',AttrVal($hash->{NAME},'notexist',undef)) = 1: Can't modify non-lvalue subroutine call in scalar assignment at (eval 7372) line 2, at EOF
Ich werde auch mal nach einem "globalen" Problem suchen.
################################################################################
EDIT:
Das Problem lag bei mir: Meine DOIF habe ich zum Vergleichen bei Zahlen mit "=" gebaut... nach einem Blick in die CR habe ich nun alles auf "==" geändert und schon geht der Vergleich wieder.