RegEx für HTTPMOD ( Array )

Begonnen von GunterB, 19 April 2022, 16:18:14

Vorheriges Thema - Nächstes Thema

GunterB

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

Kann mir jemand helfen?

betateilchen

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'
        ];
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

GunterB

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);;\
}