[gelöst] Regex Zeichen ersetzen und userreading daraus machen

Begonnen von matze1999, 20 Dezember 2023, 17:15:13

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,

Danke für die Tipps, ich bin mit den userReadings ganz zufrieden.

Ich nutze das jetzt so, ich trenne die einzelnen Datensätze auch noch in Linie, Ziel und Minuten, damit ich die Daten auf der Anzeige besser anordnen kann:

sub departure3 {
  my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=33000902&provider=Vvo";
  my $result = GetFileFromURL($url);
  my @val = split(/,/,$result);
  map {$_ =~ s/[\[\]"]//g; } @val;
  for (my $i=0;$i<3;$i++) {
    my $l = "$val[$i*3]";
    my $z = "$val[($i*3)+1]";
    my $dz = "$val[($i*3)+1]";
    my $m = "$val[($i*3)+2]";
    $dz=~s/ö/\~ef/;
    $dz=~s/ü/\~f5/;
    fhem("setreading departures Linie$i $l",1);
    fhem("setreading departures Ziel$i $z",1);
    fhem("setreading departures displayZiel$i $dz",1);
    fhem("setreading departures Min$i $m",1);
  }
}

Dann werden noch zwei Sätze der anzuzeigenden Daten gebildet: eines für die Darstellung in und mit fhem und ein Satz für die Darstellung auf dem Tasmota Display.

attr departures userReadings displayMin0 {my $Temp = ReadingsVal("departures","Min0","");; $Temp=~s/^0$/~20/;; return $Temp},\
displayMin1 {my $Temp = ReadingsVal("departures","Min1","");; $Temp=~s/^0$/~20/;; return $Temp},\
displayMin2 {my $Temp = ReadingsVal("departures","Min2","");; $Temp=~s/^0$/~20/;; return $Temp},\
rssMin0 {my $Temp = ReadingsVal("departures","Min0","");; $Temp=~s/^0$//;; return $Temp},\
rssMin1 {my $Temp = ReadingsVal("departures","Min1","");; $Temp=~s/^0$//;; return $Temp},\
rssMin2 {my $Temp = ReadingsVal("departures","Min2","");; $Temp=~s/^0$//;; return $Temp}

setstate departures 65\
Luga\
0
setstate departures 2023-12-21 18:40:01 Linie0 65
setstate departures 2023-12-21 18:40:01 Linie1 65
setstate departures 2023-12-21 18:40:01 Linie2 85
setstate departures 2023-12-21 18:40:01 Min0 0
setstate departures 2023-12-21 18:40:01 Min1 11
setstate departures 2023-12-21 18:40:01 Min2 10
setstate departures 2023-12-21 18:40:01 Ziel0 Luga
setstate departures 2023-12-21 18:40:01 Ziel1 Blasewitz
setstate departures 2023-12-21 18:40:01 Ziel2 Löbtau Süd
setstate departures 2023-12-21 18:40:01 displayMin0 ~20
setstate departures 2023-12-21 18:40:01 displayMin1 11
setstate departures 2023-12-21 18:40:01 displayMin2 10
setstate departures 2023-12-21 18:40:01 displayZiel0 Luga
setstate departures 2023-12-21 18:40:01 displayZiel1 Blasewitz
setstate departures 2023-12-21 18:40:01 displayZiel2 L~efbtau S~f5d
setstate departures 2023-12-21 18:40:01 rssMin0
setstate departures 2023-12-21 18:40:01 rssMin1 11
setstate departures 2023-12-21 18:40:01 rssMin2 19

Dann werden alle Minute die Daten erneuert:

defmod departure.at at +*00:01:00 {departure3()}
attr departure.at alignTime 00:00

Und danach per doif auf das Display geschrieben, als trigger der letzte Durchgang der Schleife ("Min2") in der sub:

([MQTT2_DVES_AAC355:LWT] eq "Online" and [departures:Min2]) (
set MQTT2_DVES_AAC355 clear,
set MQTT2_DVES_AAC355 line01 Li,
set MQTT2_DVES_AAC355 line02 Ziel,
set MQTT2_DVES_AAC355 line03 Min,
set MQTT2_DVES_AAC355 line11 [departures:Linie0],
set MQTT2_DVES_AAC355 line12 [departures:displayZiel0],
set MQTT2_DVES_AAC355 line132 [departures:displayMin0],
set MQTT2_DVES_AAC355 line21 [departures:Linie1],
set MQTT2_DVES_AAC355 line22 [departures:displayZiel1],
set MQTT2_DVES_AAC355 line232 [departures:displayMin1],
set MQTT2_DVES_AAC355 line31 [departures:Linie2],
set MQTT2_DVES_AAC355 line32 [departures:displayZiel2],
set MQTT2_DVES_AAC355 line332 [departures:Min2]
)

und in ein RSS:

Du darfst diesen Dateianhang nicht ansehen.

# Schriftart festlegen
font /usr/share/fonts/truetype/msttcorefonts/arial.ttf

thalign "left"
pt 20
rgb "FFFFFF"
text 10 30 "Linie"
text 100 30 "Ziel"
thalign "right"
text 450 30 "Min"

line 10 35 450 35

rgb "FFFF00"
thalign "left"
text 10 60 ReadingsVal("departures","Linie0","")
text 100 60 ReadingsVal("departures","Ziel0","")
text 10 90 ReadingsVal("departures","Linie1","")
text 100 90 ReadingsVal("departures","Ziel1","")
text 10 120 ReadingsVal("departures","Linie2","")
text 100 120 ReadingsVal("departures","Ziel2","")


thalign "right"
text 450 60 ReadingsVal("departures","rssMin0","")
text 450 90 ReadingsVal("departures","rssMin1","")
text 450 120 ReadingsVal("departures","rssMin2","")

Das einzige, was ich gern noch machen würde ist, die Textposition der Minuten auf dem Tasmota Display in Abhängigkeit von der Stellenanzahl festzulegen, damit ich dort auch rechtsbündig anzeigen lassen kann. Da weiss ich noch nicht wie ich das genau mache.

matze1999