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?
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
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
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?
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
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...
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)