FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Gisbert am 22 August 2022, 22:24:20

Titel: [gelöst] Entfernen von Zeichen aus einem Reading
Beitrag von: Gisbert am 22 August 2022, 22:24:20
Hallo zusammen,

ich habe Readingswerte, aus denen ich einige Zeichen entfernen möchte.
Die Readingswerte können unterschiedlich lang sein: z.B.:
bat_Heizung
bat_Wohnzimmer
bat_Kueche
Nennen wir das Reading "Batterie" und es hat aktuell den Wert "bat_Heizung".
Ich möchte nun das "bat_" weghaben und das ganze in einem neuen Reading speichern.

Das funktioniert leider nicht:
attr userReadings Raum {my $bt; $bt = ReadingsVal('device','Batterie',''); $bt =~ s/\bat_//g; return $bd;}
Das Ergebnis ist das Reading Raum bat_Heizung - und ncht Heizung wie erhofft.

Kann mir jemand helfen?
Viele Grüße
Gisbert
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: MadMax-FHEM am 22 August 2022, 22:35:43

attr userReadings Raum {return (split(/_/, ReadingsVal($name, "Batterie", "n_a")))[1]}


oder evtl.


attr userReadings Raum {my $bt; $bt = ReadingsVal('device','Batterie',''); $bt =~ s/bat_//gr; return $bt;}

EDIT: bereits im Beispiel von Gisbert vorhandene Fehler korrigiert.

Siehe: https://forum.fhem.de/index.php/topic,128754.msg1231394.html#msg1231394
EDIT: und ja, das mit dem r am Ende war wohl wegen oder nur nötig im SVG, in FhemWeb-cmd hat es ja auch bei mir schon ohne funktioniert. Daher wohl wirklich nur die bereits (von anderen Helfern) erwähnten Fehler? ;)
EDIT: oder auch nicht ;) Es ist ja auch nur das "split" von mir, der Rest ist nur "geklaut" ;)

Gruß, Joachim
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: Jamo am 22 August 2022, 23:11:22
Hallo Gisbert,
1) das \ vor bat_ muss weg
2) return $bt nicht $bd
Das hier kannst Du oben in die fhem Kommandozeile eingeben.
{my $bt = ReadingsVal('device','Batterie','');; $bt =~ s/bat_//g;; return $bt;;}
oder in kurz fuer die Kommandozeile:
{my $bt = 'bat_Heizung';; $bt =~ s/bat_//g;; return $bt;;}
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: TomLee am 22 August 2022, 23:22:49
Zitat1) das \ vor bat_ muss weg

Und bei deinem Beispiel

{my $bt = 'bat_Heizung',;; $bt =~ s/bat_//g;; return $bt;;}

das Komma.

Der Vorschlag mit split ist doch OK und kürzer,  warum jetzt noch auf dem matching-Beispiel rumreiten, spricht was dafür ?
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: OdfFhem am 23 August 2022, 00:10:11
Zitat von: TomLee am 22 August 2022, 23:22:49
Der Vorschlag mit split ist doch OK und kürzer,  warum jetzt noch auf dem matching-Beispiel rumreiten, spricht was dafür ?

"Kritisch" würde es mit split, wenn mehrere _ im Namen vorkommen ...

Kurz geht oft auch mit regulären Ausdrücken (z.B. für die Kommandozeile):

{$_='bat_wort1_wort2';; return s/^bat_//r;; }
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: TomLee am 23 August 2022, 00:22:26
Sry, würds gerne verstehen, darf man fragen warum es nur mit dem r klappt, kannst du bitte Doku verlinken oder was zu sagen.
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: OdfFhem am 23 August 2022, 00:38:22
@TomLee

beispielhafte Doku: https://perldoc.perl.org/perlrequick#Search-and-replace (https://perldoc.perl.org/perlrequick#Search-and-replace)

Im vorliegenden Beispiel würde man im Normalfall (also ohne r) als Ergebnis die Anzahl der Fundstellen erhalten ...
Man will aber den resultierenden Wert zurückbekommen ... das bewirkt der modifier r.
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: OdfFhem am 23 August 2022, 00:52:52
Ohne r wird's etwas länger, geht aber natürlich auch:

{$_='bat_wort1_wort2';; s/^bat_//;; return $_;;}
Titel: Antw:Entfernen von Zeichen aus einem Reading
Beitrag von: Gisbert am 23 August 2022, 07:38:27
Hallo zusammen,

vielen, lieben Dank - jetzt hab ich mehr Lösungen, als ich brauche :). Ihr seid klasse :) :).

1) das \ vor bat_ muss weg --> Hier hatte ich von einem Beispiel leiten lassen, in dem ein Punkt (.) oder ein Pluszeichen (+) entfernt werden sollte.
2) return $bt nicht $bd --> Übertragungsfehler in meinem Beispiel; ich wollte euch kein ellenlanges list oder raw-Definition antun.

Viele​ Grüße​ Gisbert​