Ich habe ein eletrisches Gerät was monatlich immer die gleiche Betriebsstundenzahl erreichen soll. Dazu schalte ich es bei täglich einmal für eine feste Stundenzahl ein und addiere diese dann der Vortagszeit hinzu. Und wenn die "Istzeit" die "Sollzeit" erreicht hat, schalte ich das Gerät über eine Schaltersteckdose aus.
Für die Sollzeit Vorgabe nutze ich ein Dummy Device (PF_Betrieb_soll_dummy), bei dem ich folgendes userReadings eingerichtet habe:
Stundensoll {at *01:00:00 {ReadingsVal("PF_Betrieb_soll_dummy","Stundensoll","") +5}}
Um auch andere Möglichkeiten zu probieren, habe ich das userReading temponär geändert auf eine Abfrage alle 1 min.
Stundensoll {at +*00:01:00 {ReadingsVal("PF_Betrieb_soll_dummy","Stundensoll","") +5}}
Funktioniert aber auch mit anderen Zeichensetzungen nicht.
Wo liegt da mein Fehler?
Gruß
Nobbi
userreadings brauchst du bei deinem Fall nicht bzw. macht es nicht was du verm. willst.
Der code bei userreadings wird ausgeführt, wenn ein Event des Gerätes/Devices kommt/gefeuert wird...
Ich bin nicht mal sicher, ob das at so überhaupt läuft weil es ja nicht korrekt definiert wird...
EDIT: steht kein Fehler im Log!? Bzw. gut, kann sein weil der Code verm. ja nicht ausgeführt wird (siehe Beschreibung userreadings)...
Bei einem dummy vermutlich: nie!? (bzw. nur, wenn du beim dummy explizit was setzt)
Vermutlich wäre nur ein at was mittels setreading den Wert beim gewünschten Device setzt das was du willst!?
EDIT: mittels setreading Device Readingname Wert kannst du bei jedem Device jedes beliebige Reading auf einen gewünschten Wert setzen...
Gruß, Joachim
Ja das userReading wird wirklich nur ausgelöst wenn ein Event kommt.
Ich habe darauf mal den Vorschlag aufgegriffen, das mit at und setreading zu bewerkstelligen.
So sieht das jetzt aus, geht aber leider nicht.....
+*00:01:00 my $d= ReadingsVal("PF_Betrieb_soll","Stundensoll","");my $e= 5;setreading PF_Betrieb_soll Stundensoll $d+$e
Siehst du, woran es liegen kann. Der setreading Befehl geht einzeln, aber das mit den Variablen funktioniert irgendwie nicht.
Kommt als Ergebnis immer "$d+$e" im userreading raus.
Gruß
Norbert
Vermutlich weil die Addition in Perl gemacht werden muss...
...und ReadingsVal bzw. ReadingsNum (wenn du nur Zahlen zurück willst) sind auch Perl-Funktionen...
Also musst du erst mal nach Perl wechseln: geschweifte Klammer
Dann wenn du setreading aufrufst (das ist fhem) musst du zurück nach fhem: "fhem-Funktion"
Also in etwa so:
+*00:01:00 {my $d= ReadingsNum("PF_Betrieb_soll","Stundensoll",0) + 5;fhem("setreading PF_Betrieb_soll Stundensoll $d");}
Siehe hier: https://wiki.fhem.de/wiki/Klammerebenen
Gruß, Joachim
Vielen Dank, das funktioniert einwandfrei. Mit den verschiedenen Ebenen sitze ich oft davor und kriege irgendwas nicht hin.
Meistens habe ich Glück, das ich ein Hinweis im Internet finde und mir da was "klauen" kann.
Aber ich bin froh das es geht, und auch danke für den Hinweis auf Wiki.
Gruß
Norbert
Bitte gerne!
Bitte noch [gelöst] vor den ersten Beitrag...
Gruß, Joachim
Ja weiß ich Joachim,
werde ich auch zeitnah machen, aber ich habe nur noch eine Frage an Dich, wo du mir ja so schnell geholfen hast.
Könntest du mir auch einen Tip geben wie ich das mit einmal im Monat lösen könnte?
Gruß
Norbert
Das hatten wir erst vor Kurzem: https://forum.fhem.de/index.php/topic,104984.0.html
Ich habe schon hier im Board einige Hinweise dazu gefunden und auch probiert das ganze in meinen Befehl einzubauen, aber habe immer das Problem welche Zeichen und Klammern an welche Stelle müßen. Auch der Hinweis auf die Wiki Klammern Regel hat mir nicht geholfen:
+*00:01:00 $mday==3 {my $d= ReadingsNum("PF_Betrieb_soll","Stundensoll",0) + 5.1;fhem("setreading PF_Betrieb_soll Stundensoll $d");}
Hier sollte also heute am 3.11. jede Minute "5" dazu gezählt werden, tut es aber nicht.
Gruß
Norbert
Ergänzung:
+*00:01:00 {$mday==3; my $d= ReadingsNum("PF_Betrieb_soll","Stundensoll",0) + 5.1;fhem("setreading PF_Betrieb_soll Stundensoll $d");}
So wird zwar erhöht, aber auch wenn ich statt 3 eine andere Zahl eingebe. Geht also immer noch nicht.
Du musst schon "prüfen" ob $mday == 3 ist, also: if($mday==3){mache etwas}
Und wenn du Perl verwendest, dann immer eine geschweifte Klammer auf...
Also evtl. so:
+*00:01:00 {my $d= ReadingsNum("PF_Betrieb_soll","Stundensoll",0) + 5.1;if($mday==3){fhem("setreading PF_Betrieb_soll Stundensoll $d");}}
Wobei ich jetzt nicht weiß, ob $mday bei at existiert...
...bzw. generell schon "gesetzt" ist...
Gruß, Joachim
Ja funktioniert. Prima.
$mday==3 >= jede Minute 1X 5 addiert
$mday==2 oder 4 Jede Minute wird als Next gezählt, aber keine Addition.
Vielen Dank nochmal
Norbert
REM: Erste Frage im Thread auf Tag/Monat geändert und als gelöst gekennzeichnet.