FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: GunterB am 19 April 2022, 16:18:14

Titel: RegEx für HTTPMOD ( Array )
Beitrag von: GunterB am 19 April 2022, 16:18:14
Ich würde gerne ein Array aus der HTML Seite meines Switchs mit RegEx splitten, so, dass ich für jeden Port den Status als separates Reading bekomme:

link_status:[5,5,5,6,0,0,0,6,0,0]
soll zu folgenden Readings werden:
port1: 5
port2: 5
port3: 5
port4: 6
port5: 0
...


So sieht mein Matching RegEx auf das Array aus
https://regex101.com/r/6yo4qV/1 (https://regex101.com/r/6yo4qV/1)

Kann mir jemand helfen?
Titel: Antw:RegEx für HTTPMOD ( Array )
Beitrag von: betateilchen am 19 April 2022, 17:33:10
Ich würde sowas über eine Funktion in der 99_myUtils lösen.

my @values = ( "link_status:[5,5,5,6,0,0,0,6,0,0]" =~ /(\d)/g );

Dann hast Du ein Array, in dem die einzelnen Ziffern stehen (vorausgesetzt, die Zahlenwerte bestehen immer nur aus einer Ziffer, ansonsten muss die regex entsprechend angepasst werden).
Damit kannst Du in einer loop die entsprechenden readings schreiben.

HTTPMOD kann das sicher auch irgendwie, aber mit den 5 Mio Attributen kann ich mich in diesem Leben nicht mehr anfreunden.






use Data::Dumper;
sub test {
  my @values = ( "link_status:[5,5,5,6,0,0,0,6,0,0]" =~ /(\d)/g );
  Debug Dumper \@values;
}


liefert als Ergebnis:


2022.04.19 17:28:12 1: DEBUG>$VAR1 = [
          '5',
          '5',
          '5',
          '6',
          '0',
          '0',
          '0',
          '6',
          '0',
          '0'
        ];
Titel: Antw:RegEx für HTTPMOD ( Array )
Beitrag von: GunterB am 04 Mai 2022, 12:40:55
Danke für die Hilfe!

Ich versuche eigentlich immer, bevor ich einen eigenen Weg gehe und mir unnötig Arbeit mache, das gewünsche mit vorhandenen Werkzeugen zu bekommen.
Aber wenn ich für die Suche der Werkzeuge länger brauche als für die Neuerfindung des Rads, ist das nervig.

Neues Rad:
## ReadingArrayToReadings
## Device
## ReadingName
## Value e.g.:  "link_status:[5,5,5,6,0,0,0,6,0,0]"
sub ReadingArrayToReadings($$$) {
    my ($device, $reading, $value) = @_;
    my @values = ( $value =~ /(\d)/g );
    my $i = 0;

    foreach(@values) {
        my $old_val = ReadingsVal($device, "${reading}_${i}", "-");
        if ($old_val ne $_) {
            fhem("setreading ${device} ${reading}_${i} ${_}");
        }
        $i += 1;
    }
    ## evtl weitere vorhandene Einträge löschen (wenn Array kleiner wird)
}


defmod NTFY_SWITCH3_LinkStatus notify SWITCH3:Link_Status.* {\
    my $LinkStatus = ReadingsVal($NAME, "Link_Status", "-");;\
    ReadingArrayToReadings($NAME, "Link_Status", $LinkStatus);;\
}