Hallo Alle,
ich benötige Hilfe bei der Umsetzung eines Regex im userReadings.
Mein Dummy RelaisEinfahrtStatus erhält im Sekundentakt den Status im state -->0100000000000000
Jede Zahl steht dabei für ein Relais und einen Zustand (die 1 steht für Relais 2 an, der Rest ist aus)
Ich möchte damit Readings im Dummy per userreadings belegen, sodass in jedem Readings
zb.
R1 0
R2 1
...
und so weiter steht.
dazu habe ich bereits im attr userReadings folgendes stehen.
R1 {ReadingsVal("RelaisEinfahrtStatus","state","0")},
dies gibt mir aber den gesamten state in R1
wenn ich es mit regex versuche
R1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state","0"); my test34 =~ .(?=.{15}$) ; return $test34 },
erhalte ich
Search pattern not terminated or ternary operator parsed as search pattern
gibt es andere Ideen oder wie kann ich das Regex Problem lösen?
MFG Rico
Nimm einfach substr dafür statt Regex.
Entweder für jedes R einzeln oder Du baust Dir eine Schleife die dann durchlaufen wird.
Gruß
Dan
Hi,
möglicherweise wird's auch besser, wenn Du der Variable test34 noch ein $ spendierst, also
my $test34...
Ansonsten würde ich das auch mit substr und einer Schleife über das ganze Teil machen.
...am besten gleich als Funktion in die 99_myUtils, die direkt die Readings mittels ReadingsBulkUpdate setzt.
Gruß,
Thorsten
substr war mir bis heut neu und das geht super.....Danke hierfür schonmal ;D ;D
R1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-16, 1) ; return $test34 },
bringt genau das erste Zeichen zurück...
Wie könnte eine Schleife aussehen?
(Das wäre dann das 2. Neuland für Heut)
MFG Rico
Zitat von: rico5588 am 30 März 2017, 12:19:05
substr war mir bis heut neu und das geht super.....Danke hierfür schonmal ;D ;D
R1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-16, 1) ; return $test34 },
bringt genau das erste Zeichen zurück...
Wie könnte eine Schleife aussehen?
(Das wäre dann das 2. Neuland für Heut)
MFG Rico
Etwa so (ungetestet):
R1:state.* {
my $test34 = ReadingsVal("RelaisEinfahrtStatus","state","0100000000000000");
my $i = 1;
foreach (split //,$test34)
{
fhem "setreading $NAME R$i $_";
$i++;
}
}
Gruß
Dan
Das geht leider nicht wie gewünscht, habe mich für den einfachen weg entschieden.
R1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-16, 1) ; return $test34 },
R2 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-15, 1) ; return $test34 },
R3 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-14, 1) ; return $test34 },
R4 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-13, 1) ; return $test34 },
R5 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-12, 1) ; return $test34 },
R6 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-11, 1) ; return $test34 },
R7 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-10, 1) ; return $test34 },
R8 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-9, 1) ; return $test34 },
I1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-8, 1) ; return $test34 },
I2 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-7, 1) ; return $test34 },
I3 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-6, 1) ; return $test34 },
I4 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-5, 1) ; return $test34 },
I5 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-4, 1) ; return $test34 },
I6 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-3, 1) ; return $test34 },
I7 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-2, 1) ; return $test34 },
I8 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3); $test34 = substr($test34,-1, 1) ; return $test34 },
nicht schön aber selden :o
Danke dennoch
Zitat von: DeeSPe am 30 März 2017, 13:11:44
Etwa so (ungetestet):
R1:state.* {
my $test34 = ReadingsVal("RelaisEinfahrtStatus","state","0100000000000000");
my $i = 1;
foreach (split //,$test34)
{
fhem "setreading $NAME R$i $_";
$i++;
}
}
Du hättest vielleicht noch dazusagen sollen. dass das DEF eines notify ist und dass das erste R1 für "RelaisEinfahrtStatus" steht.
Gruß,
Thorsten
nicht ganz...
das habe ich im attr userreading eines Dummy's stehen....
defmod RelaisEinfahrtStatus dummy
attr RelaisEinfahrtStatus room Relay
attr RelaisEinfahrtStatus userReadings R1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-16, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt1 on" } else { fhem "set RelaisEinfahrt1 off"}} ;; return $test34 },\
R2 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-15, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt2 on" } else { fhem "set RelaisEinfahrt2 off"}} ;; return $test34 },\
R3 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-14, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt3 on" } else { fhem "set RelaisEinfahrt3 off"}} ;; return $test34 },\
R4 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-13, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt4 on" } else { fhem "set RelaisEinfahrt4 off"}} ;; return $test34 },\
R5 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-12, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt5 on" } else { fhem "set RelaisEinfahrt5 off"}} ;; return $test34 },\
R6 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-11, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt6 on" } else { fhem "set RelaisEinfahrt6 off"}} ;; return $test34 },\
R7 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-10, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt7 on" } else { fhem "set RelaisEinfahrt7 off"}} ;; return $test34 },\
R8 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-9, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrt8 on" } else { fhem "set RelaisEinfahrt8 off"}} ;; return $test34 },\
I1 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-8, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang1 on" } else { fhem "set RelaisEinfahrtEingang1 off"}} ;; return $test34 },\
I2 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-7, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang2 on" } else { fhem "set RelaisEinfahrtEingang2 off"}} ;; return $test34},\
I3 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-6, 1) ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang3 on" } else { fhem "set RelaisEinfahrtEingang3 off"}} ;; return $test34},\
I4 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-5, 1) ;; return $test34 ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang4 on" } else { fhem "set RelaisEinfahrtEingang4 off"}}},\
I5 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-4, 1) ;; return $test34 ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang5 on" } else { fhem "set RelaisEinfahrtEingang5 off"}}},\
I6 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-3, 1) ;; return $test34 ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang6 on" } else { fhem "set RelaisEinfahrtEingang6 off"}}},\
I7 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-2, 1) ;; return $test34 ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang7 on" } else { fhem "set RelaisEinfahrtEingang7 off"}}},\
I8 { my $test34 = ReadingsVal("RelaisEinfahrtStatus","state",3);; $test34 = substr($test34,-1, 1) ;; return $test34 ;; {if ($test34 eq "1" ) { fhem "set RelaisEinfahrtEingang8 on" } else { fhem "set RelaisEinfahrtEingang8 off"}}},
attr RelaisEinfahrtStatus webCmd on:off
Zitat von: Thorsten Pferdekaemper am 30 März 2017, 13:51:34
Du hättest vielleicht noch dazusagen sollen. dass das DEF eines notify ist und dass das erste R1 für "RelaisEinfahrtStatus" steht.
Gruß,
Thorsten
Eigentlich dachte ich es funktioniert auch im userReading! Wie gesagt, war ungetestet. Aber das geht offenbar nicht in userReading.
Hier mal ein funktionierendes Beispiel mit einem dummy und passendem notify:
define d2 dummy
attr d2 setList state
define n_d2_state notify d2:state.* {\
my $i = 1;;\
foreach (split //,$EVTPART1)\
{\
my $x = length $i < 2 ? "0$i" : $i;;\
my $z = $_ == 1 ? "on" : "off";;\
fhem "setreading $NAME Relais_$x $z";;\
$i++;;\
}\
}
attr n_d2_state addStateEvent 1
Ich denke das ist etwas kürzer, leichter wart- und erweiterbar und natürlich damit eleganter. 8)
Gruß
Dan
EDIT: Habe soeben noch ReadingsVal durch $EVTPART1 ersetzt, was den Code noch kompakter macht.
Ich habe den notify Code aus dem vorherigen Beitrag noch einmal angepasst und damit die entstehenden Readings etwas aufgewertet. ;)
Der Zahl wird damit nun eine 0 vorangestellt wenn sie nur 1-stellig ist und die Readings heißen dann "Relais_01" usw.
Aus 0 wird off und aus 1 wird on in den Readings.
Internals:
CFGFN
NAME d2
NR 165
STATE 1111000010100101
TYPE dummy
Readings:
2017-03-30 19:11:16 Relais_01 on
2017-03-30 19:11:16 Relais_02 on
2017-03-30 19:11:16 Relais_03 on
2017-03-30 19:11:16 Relais_04 on
2017-03-30 19:11:16 Relais_05 off
2017-03-30 19:11:16 Relais_06 off
2017-03-30 19:11:16 Relais_07 off
2017-03-30 19:11:16 Relais_08 off
2017-03-30 19:11:16 Relais_09 on
2017-03-30 19:11:16 Relais_10 off
2017-03-30 19:11:16 Relais_11 on
2017-03-30 19:11:16 Relais_12 off
2017-03-30 19:11:16 Relais_13 off
2017-03-30 19:11:16 Relais_14 on
2017-03-30 19:11:16 Relais_15 off
2017-03-30 19:11:16 Relais_16 on
2017-03-30 19:11:16 state 1111000010100101
Attributes:
setList state
Gruß
Dan
Gruß Dan,
das ist doch sehr beeindruckend was so alles geht.... ;)
Noch ne kleine Frage dazu... da ich das so selber nie hinbekommmen werde.
Die erste 8 Zahlen sind Relais die letzten 8 sind Eingänge.
Kann man das notify dahin abändern?
8)
Zitat von: rico5588 am 30 März 2017, 19:58:53
Gruß Dan,
das ist doch sehr beeindruckend was so alles geht.... ;)
Noch ne kleine Frage dazu... da ich das so selber nie hinbekommmen werde.
Die erste 8 Zahlen sind Relais die letzten 8 sind Eingänge.
Kann man das notify dahin abändern?
8)
define n_d2_state notify d2:state.* {\
my $i = 1;;\
foreach (split //,$EVTPART1)\
{\
my $x = length $i < 2 ? "0$i" : $i;;\
my $z = $_ == 1 ? "on" : "off";;\
my $r = "Relais_$x";;\
$r = "Input_$x" if ($i > 8);;\
fhem "setreading $NAME $r $z";;\
$i++;;\
}\
}
So etwa?
Gruß
Dan
EDIT: Kleiner Schönheitsfehler: Die Zahlen starten nicht wieder bei 1 beim Wechsel auf Input!
!!!Danke!!!
ist mir zwar ein Rätsel wie man das so schnell hinbekommt....
aber ja genau so hat ich es mir vorgestellt.
MFG Rico