[gelöst] Entfernen von Zeichen aus einem Reading

Begonnen von Gisbert, 22 August 2022, 22:24:20

Vorheriges Thema - Nächstes Thema

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

MadMax-FHEM

#1

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Jamo

#2
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;;}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

TomLee

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 ?

OdfFhem

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

TomLee

Sry, würds gerne verstehen, darf man fragen warum es nur mit dem r klappt, kannst du bitte Doku verlinken oder was zu sagen.

OdfFhem

@TomLee

beispielhafte Doku: 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.

OdfFhem

Ohne r wird's etwas länger, geht aber natürlich auch:

{$_='bat_wort1_wort2';; s/^bat_//;; return $_;;}

Gisbert

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​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome