Reading - vorderen Teil "abschneiden" und in set Befehl versenden

Begonnen von Stonemuc, 12 August 2022, 19:51:24

Vorheriges Thema - Nächstes Thema

Stonemuc

Ich stehe irgendwie vor einem Problem...ich möchte aus einem Reading eines Device nur den hinteren Teil übernehmen und diesen dann in einem set Befehl weiterverwenden...leider komme ich nicht weiter.
Das Device heisßt im meinem Fall WAYH2841, das betreffende Reading BSH.Common.Root.SelectedProgram

BSH.Common.Root.SelectedProgram     LaundryCare.Washer.Program.Mix    2022-08-12 13:31:41



Ich brauch nur den Teil mit Mix, der aber auch Cotton oder anders heißen kann....

Ich hab es mit readingsval probiert...aber ohne Erfolg...

set WAYH2841 startProgram {(ReadingsVal("WAYH2841","BSH.Common.Root.SelectedProgram","Mix"))}

 


Wie kann ich nur diesen hinteren Teil bekommen? Kann mir jemand auf die Sprünge helfen?
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

MadMax-FHEM

#1
Ein komplettes list wäre hilfreich gewesen, ich probiere mal mit Annahmen:


my $SetCommandPart = (split(/./, ReadingsVal("WAYH2841","BSH.Common.Root.SelectedProgram","n.a.")))[3];


EDIT: vorausgesetzt, dass das Device WAYH2841 heißt und in dem Reading BSH.Common.Root.SelectedProgram das steht wovon du den letzten Teil willst und es immer gleiche Anzahl an "Teilen" sind. Ansonsten musst du erst den split in ein Array machen, prüfen wie lange das Array ist und eben den letzten Teil nehmen bzw. statt der 3 sollte -1 gehen, dann ist es immer der letzte Eintrag im Array. Fiel mir jetzt beim Schreiben so ein ;)

EDIT:
Das set dann:

fhem("set WAYH2841 startProgram $SetCommandPart")


EDIT: ob Perl (also der ReadingsVal/split Teil) und fhem set Befehle gemischt werden können kommt wohl drauf an wo/wie du das aufrufst. was sicher geht: nach Perl "abtauchen" und dort dann mittels fhem("fhemBefehl") ausführen...

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)

Otto123

oder :) mit set magic - nur geraten nicht getestet - weil auch fehlt wie WAYH2841 wirklich aussieht  ::)
setreading WAYH2841 startProgram {((split(/./, ReadingsVal("WAYH2841","BSH.Common.Root.SelectedProgram","n.a.")))[3])}

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Stonemuc

Ah..okay..Split hat mir gefehlt. Und die [3] bedeutet, dass es der vierte Teil des Readings ist? Und die -1 würde immer den letzten nehmen? Richtig?
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

MadMax-FHEM

Zitat von: Stonemuc am 12 August 2022, 23:04:37
Ah..okay..Split hat mir gefehlt. Und die [3] bedeutet, dass es der vierte Teil des Readings ist? Und die -1 würde immer den letzten nehmen? Richtig?

Ja, gezählt wird ab 0 -> 3 eben 4. Element

-1 ist immer das letzte Element eines Arrays

Zitat von: https://www.perltutorial.org/perl-array/
Perl also allows you to access array elements using negative indices. Perl returns element referred to by a negative index from the end of the array. For example, $days[-1] returns the last element of the array @days.

oder auch: https://www.tutorialspoint.com/perl/perl_arrays.htm

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)

Stonemuc

Noch eine kurze Rückmeldung tum Thema:

setreading WAYH2841 startProgram {((split(/./, ReadingsVal("WAYH2841","BSH.Common.Root.SelectedProgram","n.a.")))[3])}
hatte es nicht funktioniert - der Wert war immer leer. Mit ein bisschen Suchen bin ich auch auf den entsprechenden Hinweis gekommen...der Punkt im regexp stellt ein Match für jedes beliebige Zeichen dar. Somit definiert man den komplettem Ausdruck als Trennzeichen im Split und bekommt nichts zurück.

Es muss also folgendermaßen lauten:

setreading WAYH2841 startProgram {((split(/\./, ReadingsVal("WAYH2841","BSH.Common.Root.SelectedProgram","n.a.")))[3])}

Nur dann wird der Punkt als Trennzeichen erkannt...
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

betateilchen

Du wirst eine perl Warnung im Log im bekommen, falls - aus welchen Gründen auch immer - ReadingsVal() in diesem Konstrukt tatsächlich mal den default Wert zurückliefert 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!