Hallo,
ich habe folgenden DOIF zur Steuerung eines Lüfters mit einem Userreading PlotStatus, das ich gerne in ein Logfile schreiben möchte. Problem: während das Reading "command" ankommt, ändert sich PlotStatus zwar in der Weboberfläche wenn man "An" oder "Aus" wählt, aber leider nicht im Log. Wo liegt mein Fehler? danke für hilfreiche Tipps :-)
define UberschussLuftentfeuchter.control DOIF ([$SELF:command] eq "Automatik" and [Stromzaehler:power:d] <= -1.0*[$SELF:power])\
{ Log 1, "🤖⚡ UberschussLuftentfeuchter AN" }\
(set deCONZ_HUEDevice20 on, setreading $SELF PlotStatus 3)\
DOELSEIF ([$SELF:command] eq "Automatik" and [Stromzaehler:power:d] > -200)\
{ Log 1, "🤖🚫 UberschussLuftentfeuchter AUS" }\
(set deCONZ_HUEDevice20 off, setreading $SELF PlotStatus 0)\
DOELSEIF (["$SELF:command: Aus"])\
{ Log 1, "✋🚫 UberschussLuftentfeuchter manuell AUS" }\
(set deCONZ_HUEDevice20 off, setreading $SELF PlotStatus 1)\
DOELSEIF (["$SELF:command: An"])\
{ Log 1, "✋⚡ UberschussLuftentfeuchter manuell AN" }\
(set deCONZ_HUEDevice20 on, setreading $SELF PlotStatus 2)
setuuid UberschussLuftentfeuchter.control 685b9113-f33f-6bf2-3b23-94feb03ca8507b8f
attr UberschussLuftentfeuchter.control alias Überschuss-Luftentfeuchter Steuerung
attr UberschussLuftentfeuchter.control cmdState Automatik AN|Automatik AUS|Manuell AUS|Manuell AN
attr UberschussLuftentfeuchter.control readingList command delay power
attr UberschussLuftentfeuchter.control room HUEDevice,Hauswirtschaftsraum,Strom
attr UberschussLuftentfeuchter.control setList command:uzsuSelectRadio,An,Aus,Automatik\
delay:slider,0,1,600\
power:slider,100,100,10000
attr UberschussLuftentfeuchter.control stateFormat ;command (state)
attr UberschussLuftentfeuchter.control userReadings PlotStatus
attr UberschussLuftentfeuchter.control wait [$SELF:delay]:[$SELF:delay]:0:0
attr UberschussLuftentfeuchter.control webCmd command
define UberschussLuftentfeuchter FileLog ./logdaily/UeberschussLuftentfeuchter-%Y-%m-%d.log UberschussLuftentfeuchter.control:PlotStatus:.*|UberschussLuftentfeuchter.control:command:.*
setuuid UberschussLuftentfeuchter 686d0cfc-f33f-6bf2-a7a9-4652224de422c163
Hi,
etwas schräge Definition, aber ich denke ein setreading auf das eigene Device erzeugt auch im DOIF keinen Event.
https://fhem.de/commandref.html#setreading
Das hier ist irgendwie unnütz:
Zitat von: Jackie am 08 Juli 2025, 15:08:24attr UberschussLuftentfeuchter.control userReadings PlotStatus
Schau mal in die Doku:
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B.* {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
<modifier> kann die folgenden Werte haben:
none: als ob man es gar nicht spezifiziert hätte.
difference: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert gesetzt.
differential: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet, falls der Unterschied unter eine Sekunde liegt.
integral: das Gegenteil von differential. Das Ergebnis wird um das Produkt aus der Zeit-Differenz und der Durschnittswert der letzten zwei Readings erhöht.
result += (time - timeold) * (oldval + value) / 2
offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist wird der vorherige Wert zum Reading addiert. Das Reading kann dann als offset verwendet werden um einen Zähler der durch Sromverlust zurückgesetzt wird zu korrigieren.
monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton wachsender Zähler ableiten.
Beispiel:
attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0}
Achtung:
Falls difference oder differential spezifiziert ist, dann werden für die Berechnung ältere Werte benötigt, d.h. der Wert wird frühestens beim zweiten Änderung gesetzt.
der Name der definierten Readings besteht aus alphanumerischen Zeichen, Unterstrich (_) und Minus-Zeichen (-).
Ob man sowas im DOIF elegant lösen kann, weiß ich nicht. Man kann allgemein das setreading mit einem sleep 0.1 "verzögern". Oder Du machst ein richtiges userReadings.
Gruß Otto
dankeschön, aber was ist in dem Kontext denn ein "richtiges" Userreading? Ich habe das ja über
attr UberschussLuftentfeuchter.control userReadings PlotStatus
bereits versucht zu definieren. Was ist daran genau falsch?
die userreadings erzeugen selbst keine events. ich hab mir bei notify auf userreading z.b. so geholfen, dass ich auf den trigger des userreadings das notify setze und dann das userreading mit ReadingsVal auslese. dann ist im code alles "richtig"
Zitat von: Guybrush am 09 Juli 2025, 08:16:05die userreadings erzeugen selbst keine events. ich hab mir bei notify auf userreading z.b. so geholfen, dass ich auf den trigger des userreadings das notify setze und dann das userreading mit ReadingsVal auslese. dann ist im code alles "richtig"
Danke, kannst du mir dazu deinen Beispielcode zeigen wie du das genau umgesetzt hast?
Zitat von: Jackie am 09 Juli 2025, 08:04:17attr UberschussLuftentfeuchter.control userReadings PlotStatus
bereits versucht zu definieren. Was ist daran genau falsch?
Naja, die von Dir verwendete Syntax ist halt komplett falsch.
Deshalb hatte Otto ja schon den Auszug aus der commandref zitiert, damit Du nachlesen kannst, wie man es eigentlich richtig macht.
Zitat von: Guybrush am 09 Juli 2025, 08:16:05die userreadings erzeugen selbst keine events.
Diese Aussage halte ich für falsch. Zum ausprobieren: ;)
defmod dummy1 dummy
attr dummy1 room Test
attr dummy1 setList on off
attr dummy1 userReadings testreading {'eventtestreading'}
Auszug Eventmonitor
2025-07-09 09:18:54.616 dummy dummy1 on
2025-07-09 09:18:54.616 dummy dummy1 testreading: eventtestreading
Hast Du mal versucht, Deine Befehle zu ändern wie in meinem Link zur commandref empfohlen?
setreading $SELF PlotStatus ... --> sleep 0.1;setreading $SELF PlotStatus ...
Ich meine das funktioniert bei DOIF auch.