(Gelöst) Regex im userReadings beim Dummy

Begonnen von rico5588, 30 März 2017, 11:53:16

Vorheriges Thema - Nächstes Thema

rico5588

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

Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Thorsten Pferdekaemper

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
FUIP

rico5588

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
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

rico5588

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
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Thorsten Pferdekaemper

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
FUIP

rico5588

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
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

DeeSPe

#8
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.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

rico5588

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)

Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

DeeSPe

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!
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

rico5588

!!!Danke!!!

ist mir zwar ein Rätsel wie man das so schnell hinbekommt....
aber ja genau so hat ich es mir vorgestellt.

MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS414
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly