Brauche Hilfe beim zerlegen von einem Reading

Begonnen von Torsten_MG, 18 Januar 2018, 12:22:19

Vorheriges Thema - Nächstes Thema

Torsten_MG

Hallo Leute,

ich habe folgendes Reading:

DasErste_details-1

mit dem Eintrag:
Nachrichten, D 2018<br/>Laufzeit: 15 Minuten<br/>Original-Titel: Tagesschau<br/><br/>Die Nachrichten der ARD produziert in HD.<br/>

Nun möchte ich, daß das Reading so aufgelöst wird, das jeder Text vor dem <br/> separat für sich in ein neues reading kommt. Ich habe keine Erfahrung damit und habe durch suchen im Forum die möglichkeit mit dem split gefunden. Bekomme es aber leider nicht hin.
Hier mein letzter Versuch:
ARD_details {(split /<br/>/,ReadingsVal("TV-Programme","DasErste_details-1",""))[0]}

Als Ergebnis bekomme ich:
Error evaluating TV_Programme userReading ARD_details: Search pattern not terminated at (eval 364) line 1.

Leider komme ich damit nicht weiter. Ich hoffe mir kann da jemand weiterhelfen.

Torsten_MG

Ich habe jetzt nochmal 2 Sachen ausprobiert dabei kommt folgendes raus:

Zuerst:
ARD_details {split(/br/,ReadingsVal("TV-Programme","DasErste_details-1",""))[0]}

Dann erscheint der Text:
Error evaluating TV_Programme userReading ARD_details: syntax error at (eval 324) line 1, near ")["

Dann habe ich es wie folgt abgeändert:
ARD_details {split(/br/,ReadingsVal("TV-Programme","DasErste_details-1","")),[0]}

Dann kommt der Text:
ARRAY(0x2f238d8)

OdfFhem

Die Aufsplittung gelingt mit folgendem regulären Ausdruck:

(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>

Anschließend stehen die einzelnen Teile in $1...$5 zur Verfügung.

Will man direkt nur den dritten Teil, kann man folgende Variante verwenden:

.*<br/>.*<br/>(.*)<br/>.*<br/>.*<br/>



Unter Verwendung von split hilft folgendes vielleicht weiter:

my @parts = split('<br/>',"Nachrichten, D 2018<br/>Laufzeit: 15 Minuten<br/>Original-Titel: Tagesschau<br/><br/>Die Nachrichten der ARD produziert in HD.<br/>");
return scalar(@parts)." --- ".@parts[2];


Torsten_MG

@OdfFhem

leider komme ich mit deiner Ausführung nicht klar.

Wie setze ich diesen Code ein?
(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>

CBSnake

Hi,

hier mal meine quick`n`dirty Lösung:

geteilt0 {[split("<br/>", ReadingsVal("$name","DasErste_details-1",""))]->[0]}, geteilt1 {[split("<br/>", ReadingsVal("$name","DasErste_details-1",""))]->[1]}, geteilt2 {[split("<br/>", ReadingsVal("$name","DasErste_details-1",""))]->[2]}, geteilt3 {[split("<br/>", ReadingsVal("$name","DasErste_details-1",""))]->[3]}, geteilt4 {[split("<br/>", ReadingsVal("$name","DasErste_details-1",""))]->[4]}

Ich mach das auch immer über try`n`error :-) und durch copy`n`past meiner schon funktionierenden Lösungen :-)

Das geteilt3 könnte man auch weg lassen, ist ja quasi leer

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

OdfFhem

Den regulären Ausdruck könnte man z.B. folgendermaßen verwenden:


my $details = "Nachrichten, D 2018<br/>Laufzeit: 15 Minuten<br/>Original-Titel: Tagesschau<br/><br/>Die Nachrichten der ARD produziert in HD.<br/>";
$details =~ "(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>*";
return $3;

Torsten_MG

@CBSnake

wenn ich deinen Code in mein userreading packe, dann erscheint leider nichts und im log tauchen diese Meldungen auf
2018.01.18 13:46:58 1: PERL WARNING: TV_Programme userReadings geteilt0 evaluated to undef at fhem.pl line 4332.
2018.01.18 13:46:58 3: eval: {[split("<br/>", ReadingsVal("TV-Programme","DasErste_details-1",""))]->[0]}
2018.01.18 13:46:58 1: PERL WARNING: TV_Programme userReadings geteilt1 evaluated to undef at fhem.pl line 4332.
2018.01.18 13:46:58 3: eval: {[split("<br/>", ReadingsVal("TV-Programme","DasErste_details-1",""))]->[1]}
2018.01.18 13:46:58 1: PERL WARNING: TV_Programme userReadings geteilt2 evaluated to undef at fhem.pl line 4332.
2018.01.18 13:46:58 3: eval: {[split("<br/>", ReadingsVal("TV-Programme","DasErste_details-1",""))]->[2]}
2018.01.18 13:46:58 1: PERL WARNING: TV_Programme userReadings geteilt3 evaluated to undef at fhem.pl line 4332.
2018.01.18 13:46:58 3: eval: {[split("<br/>", ReadingsVal("TV-Programme","DasErste_details-1",""))]->[3]}
2018.01.18 13:46:58 1: PERL WARNING: TV_Programme userReadings geteilt4 evaluated to undef at fhem.pl line 4332.
2018.01.18 13:46:58 3: eval: {[split("<br/>", ReadingsVal("TV-Programme","DasErste_details-1",""))]->[4]}


@ OdfFhem

das, was du in der ersten Zeile in den "" geschrieben hast, ist ja der Inhalt des Readings DasErste_details-1.

wie setze ich den Code ein, ist leider alles noch recht neu für mich

OdfFhem

Da ich das passende Device nicht habe, habe ich den zu verwendenden Wert einfach mal als Konstante umfunktioniert.

Im echten Code sollte natürlich folgendes stehen:

my $details = ReadingsVal("TV-Programme","DasErste_details-1","");

CBSnake

hmm komisch,

ich hab den eben nochmal hier raus ins  Attr Userreadings kopiert klappt noch, hattest was verändert oder noch weitere Sachen im Userreading stehen?
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Torsten_MG

@CBSnake

Danke funktioniert jetzt, war wohl noch ein Fehler beim übertragen gewesen, vielen Dank!

@ OdfFhem

da die Version von CBSnake funktioniert, werde ich diese Lösung nehmen. Danke für deine Geduld!

CBSnake

Die Herangehensweise von @OdfFhem finde ich auch interessant. Nur wie geht es dann weiter, für Perl-fremde? Wie bekomme ich die $1-$5 Variablen in Readings? Man findet zwar überall Perl-Beispiele im Netz, die aber nicht 1zu1 in Fhem übertragbar sind. Userreadings wird nur fast immer mit siehe Beispiele, siehe Suche beschrieben und da wird dann wieder mit Perl um sich geworfen und mehr als kopieren bleibt einem nicht :-)

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

OdfFhem

Ein Beispiel für geteilt0 könnte z.B. so aussehen:


geteilt0 { my $details = ReadingsVal("$name","DasErste_details-1","");; $details =~ "(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>(.*)<br/>*";; $1}