Hallo,
ich habe vor, aus dem Modul WeekdayTimer, das reading "disabled" = 0 oder 1, in einen Text umzuwandeln.
Das ganz sollte später so aussehen :
disabled: 1 --> deaktiviert
disabled: 0 --> aktiviert
Das möchte ich dann in einem neuen reading namens "Zustand" angezeigt bekommen.
Hat jemand eine Ahnung wie der Code aussehen könnte ?
Über einen Lösungsvorschlag wäre ich sehr dankbar.
Eventuell so:
userReadings Zustand {AttrVal("Name vom WeekdayTimer","disable",0) eq "1" ? "deaktiviert" : "aktiviert"}
Gruß Otto
Fhem wirft mir diese Fehlermeldung raus:
Zustand : Error evaluating Schale userReading Zustand: Can't find string terminator '"' anywhere before EOF at (eval 107308) line 1.
Meine userReadings sehen zur Zeit so aus:
Zustand {AttrVal("Schale","disable",0) eq "1" ? "deaktiviert" : "aktiviert"},
Datum { (split ' ',ReadingsVal("Schale","nextUpdate",0))[0]},
Zeit { (split ' ',ReadingsVal("Schale","nextUpdate",0))[1]},
Das Komma am Ende?
Brachte keine Änderung als ich es weggenommen habe.
Zitat von: Canon.Fritz am 05 April 2018, 21:05:00
Fhem wirft mir diese Fehlermeldung raus:
Zustand : Error evaluating Schale userReading Zustand: Can't find string terminator '"' anywhere before EOF at (eval 107308) line 1.
Meine userReadings sehen zur Zeit so aus:
Zustand {AttrVal("Schale","disable",0) eq "1" ? "deaktiviert" : "aktiviert"},
Datum { (split ' ',ReadingsVal("Schale","nextUpdate",0))[0]},
Zeit { (split ' ',ReadingsVal("Schale","nextUpdate",0))[1]},
Es funktioniert doch mit dem Komma. Ich musste noch einmal von disable auf enable stellen.
Jetzt haut alles hin. :)
Vielen Dank Otto ;)
Hallo,
habe ein ähnliches Problem wie Canon.Fritz. Von meiner Wärmepumpe kommen aber mehr als zwei Werte für den Zustand "Brauchwasserstufe"
0 für "Aus"
1 für "Solarbetrieb"
2 für "Verdichterbetrieb"
3 für "Nachheizstufe"
Ich möchte statt der Ziffern den jeweiligen Text in den UserReadings haben.
Bisher funktioniert nur:
Brauchwasserstufe {AttrVal("Mythz","Brauchwasserstufe_sControl",0) eq "0" ? "keine" : "solar_Verdichter_Nachheizen"}
Ich habe leider bisher keinen geeigneten Syntax gefunden, um die von Otto beschriebene Möglichkeit zu erweitern.
Kann mir jemand weiterhelfen?
Danke vorab.
Gruß
Markus
Hallo Markus,
zum Test in der Kommandozeile
{my $ret;; my $bws=AttrVal("Mythz","Brauchwasserstufe_sControl",0);; if ($bws eq "0"){$ret="Aus"}if ($bws eq "1"){$ret="Solarbetrieb"}if ($bws eq "2") {$ret="Verdichterbetrieb"}if ($bws eq "3"){$ret="Nachheizstufe"} return $ret}
Für die DEF
Brauchwasserstufe {my $ret; my $bws=AttrVal("Mythz","Brauchwasserstufe_sControl",0); if ($bws eq "0"){$ret="Aus"}if ($bws eq "1"){$ret="Solarbetrieb"}if ($bws eq "2") {$ret="Verdichterbetrieb"}if ($bws eq "3"){$ret="Nachheizstufe"} return $ret}
Eigentlich muss da noch ein Trigger hin, in der Art Brauchwasserstufe:Brauchwasserstufe_sControl.* aber erzeugt denn des setzen des Attributes einen Event?
Edit: Die Methode "zu Fuß" - die folgenden Vorschläge sind viel besser! :D
Gruß Otto
Ungetestet und keine Zeit zum erkären (könnt ich eh nicht).
So in der Art ist es mMn. übersichtlicher umgesetzt.
Brauchwasserstufe {my $bws=AttrVal("Mythz","Brauchwasserstufe_sControl",0);
my %bws2cmnd = (
'0' => 'Aus',
'1' => 'Solarbetrieb',
'3' => 'Verdichterbetrieb',
'4' => 'Nachheizstufe',
);
my $bwscmd = $bws2cmnd{$bws};
return $bws;}
Danke Jörg, das ich das mittlerweile verstehe.
Gruß
Thomas
das ginge weniger aufwändig auch mit einem array.
Brauchwasserstufe {
my $bws=ReadingsVal("Mythz","Brauchwasserstufe_sControl",0);
my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');
return $bws2cmnd[$bws];
}
Edit - array korrigiert, weil der Wert für 2 doch vorhanden ist :)
Edit 2: eckige Klammer für array-Element korrigiert
Edit 3: AttrVal() durch ReadingsVal() ersetzt
Zitatdas ginge weniger aufwändig auch mit einem array.
vorab hol schon mal die Keule raus.
Es dämmert schon leicht, komm bestimmt noch im Laufe des Tages drauf, frag trotzdem jetzt schon.
Was mach ich falsch ?
defmod du_t1 dummy
attr du_t1 devStateIcon .*:nix
attr du_t1 genericDeviceType light
attr du_t1 readingList brightness
attr du_t1 room Test
attr du_t1 setList on off 1 2 3 4
attr du_t1 userReadings Brauchwasserstufe:1|2|3|4 {my $bws=ReadingsVal($name,"state",0);;my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');;return $bws2cmnd($bws);;}
setstate du_t1 3
setstate du_t1 2020-11-20 11:50:03 Brauchwasserstufe Error evaluating du_t1 userReading Brauchwasserstufe: Global symbol "$bws2cmnd" requires explicit package name (did you forget to declare "my $bws2cmnd"?) at (eval 123416) line 1.\
setstate du_t1 2020-02-17 18:46:15 brightness 0
setstate du_t1 2020-11-20 11:50:03 state 3
setstate du_t1 2020-04-28 10:10:41 wert1 08:00
Na ja, da hier NUR (fortlaufende) Zahlen im Spiel sind, kann man das einfach als Index im Array nutzen und muss nicht den "umständlichen" Weg über Hash-lookup gehen (der universeller ist, weil er auch mit gemischten Ausgangswerten oder Lücken umgehen kann).
So sollte es klappen:
defmod du_t1 dummy
attr du_t1 setList on:noArg off:noArg 1:noArg 2:noArg 3:noArg 4:noArg
attr du_t1 userReadings Brauchwasserstufe:[1-4] {my $bws=ReadingsVal($name,"state",0);;my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');;return $bws2cmnd[$bws];;}
setstate du_t1 1
setstate du_t1 2020-11-20 12:05:28 Brauchwasserstufe Solarbetrieb
setstate du_t1 2020-11-20 12:05:28 state 1
Warum hier plötzlich eckige Klammern, das mein ich bisher noch nicht gesehen/gelesen zu haben, kannst das erklären oder verlinken zum nachlesen ?
Zitat von: TomLee am 20 November 2020, 12:36:55
Warum hier plötzlich eckige Klammern, das mein ich bisher noch nicht gesehen/gelesen zu haben, kannst das erklären oder verlinken zum nachlesen ?
Eckige Klammern kennzeichnen ELemente eines array, ich habe das oben (copy&paste Fehler) vergessen, anzupassen. Ist aber jetzt erledigt.
Zitatdas mein ich bisher noch nicht gesehen/gelesen zu haben
doch hab ich, aber ein Hirn wie ein Spatz :P
http://www.mathe2.uni-bayreuth.de/perl/GK/arrays.htm#Zugriffsoperator (http://www.mathe2.uni-bayreuth.de/perl/GK/arrays.htm#Zugriffsoperator)
👍 Vielen Dank für die schnellen Antworten, werde ich am WE ausprobieren
Gruß
Markus
Hallo zusammen,
ich habe den ersten Vorschlag von Otto in der Kommandozeile ausprobiert:
{my $ret;; my $bws=AttrVal("Mythz","Brauchwasserstufe_sControl",0);; if ($bws eq "0"){$ret="Aus"}if ($bws eq "1"){$ret="Solarbetrieb"}if ($bws eq "2") {$ret="Verdichterbetrieb"}if ($bws eq "3"){$ret="Nachheizstufe"} return $ret}
--> es kommt immer nur "Aus" zurück, auch wenn der Wert von Brauchwasserstufe_sControl auf "1" steht
Auch wenn ich die userreadings wie vorgeschlagen erweitere:
Brauchwasserstufe {
my $bws=AttrVal("Mythz","Brauchwasserstufe_sControl",0);
my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');
return $bws2cmnd[$bws];
--> der Wert bleibt auf "Aus", auch wenn der Wert von Brauchwasserstufe_sControl auf "1" steht
Ein event wird von Brauchwasserstufe_sControl erzeugt.
Noch eine Idee, was nicht passt ?
Danke&Gruß
Markus
Du kennst den Unterschied zwischen AttrVal() und ReadingsVal()?
Und bitte bei allen userReadings daran danken, einen trigger zu setzen.
Code-Tags sind auch immer für die Lesbarkeit hilfreich.
Komplett zusammengefasst:
Brauchwasserstufe:Brauchwasserstufe_sControl.* {
my $bws=ReadingsVal("Mythz","Brauchwasserstufe_sControl",0);
my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');
return $bws2cmnd[$bws]; }
Zitat von: Beta-User am 23 November 2020, 08:36:47
Du kennst den Unterschied zwischen AttrVal() und ReadingsVal()?
Der Fehler ist vermutlich durch copy&paste entstanden, sowohl in meinem Code-Schnipsel oben (da stand auch AttrVal()) als auch jetzt beim Ausprobieren.
Trotzdem sollte der Anwender den Unterschied natürlich kennen :)
Ich hatte mit über das AttrVal auch gewundert - aber so ist das wenn man einen Thread kapert und von dem etwas abschreibt was gar keinen Bezug hat :o
Zitat von: MSP am 20 November 2020, 09:21:28
Bisher funktioniert nur:
Brauchwasserstufe {AttrVal("Mythz","Brauchwasserstufe_sControl",0) eq "0" ? "keine" : "solar_Verdichter_Nachheizen"}
Der Code funktioniert im Fehlerfall ja immer, der Folgende dann nicht mehr:
Brauchwasserstufe {AttrVal("Mythz","Brauchwasserstufe_sControl",2) eq "0" ? "keine" : "solar_Verdichter_Nachheizen"}
Hallo zusammen,
vielen Dank nochmals, die Anzeige ändert sich jetzt, wenn sich der Wert, z.B. von "0" auf "1" ändert
Folgenden Code habe ich den userreadings hinzugefügt
Brauchwasserstufe {\
my $bws=ReadingsVal("Mythz","Brauchwasserstufe_sControl",0);;\
my @bws2cmnd = ( 'Aus','Solarbetrieb','Verdichterbetrieb','Nachheizstufe');;\
return $bws2cmnd[$bws];;\
}
Das AttrVal() kam durch copy&paste rein.
Im Mythz Modul separiere ich bereits zahlreiche Betriebswerte durch userreadings mit ReadingsVal().
Den Code kann ich jetzt auch gut für die verschiedenen Heizkreisstufen verwenden 👍
Danke&Gruß
Markus
Was spricht denn dagegen, einen trigger zu setzen?
Das macht - je nachdem, wie die Readings am Device selbst aktualisiert werden - auch bei den anderen userReadings Sinn, schau einfach mal in den Event-Monitor, dann wird ggf. klarer, warum.
Zitat von: Beta-User am 23 November 2020, 16:44:09
Was spricht denn dagegen, einen trigger zu setzen?
Mangelndes Wissen und wenig Verständnis dessen, was man da eigentlich tut, wenn man vorgekaute Lösungen einfach per copy&paste übernimmt.
Zitat von: betateilchen am 23 November 2020, 17:22:37
Mangelndes Wissen und wenig Verständnis dessen, was man da eigentlich tut, wenn man vorgekaute Lösungen einfach per copy&paste übernimmt.
Stimmt wohl...
Dachte, ich hätte es c&p-fertig geliefert, aber eben gesehen, dass noch eine schließende Klammer gefehlt hatte (ist nachgezogen) :o .
Na ja, wie dem auch sei, ich schreibs halt hin, bis die Finger bluten, immer in der Hoffnung, dass es jemand liest :'( ...