Hallo zusammen,
ich komme da mal wieder, trots suchen und lesens nicht weiter.
In folgenden Dummy gibt es zwei readings mit den "set" Befehlen, die ich in einem DOIF ausführen möchte.
SetCmd_Off/SetCmd_On
Internals:
FUUID 5d12286f-f33f-81e9-eb52-e2ca61ae5412a693
NAME Eigenverbrauch_LWP
NR 299
STATE off
TYPE dummy
READINGS:
2019-07-17 15:37:42 PowerLevelMinTime 60
2019-07-03 18:46:07 PowerLimitOff 3000
2019-07-03 18:45:31 PowerLimitOn 3500
2019-07-22 11:29:42 RunCommandON set
2019-07-22 11:30:03 RunCommandOff set
2019-07-15 10:45:25 RunTimeMin 300
2019-07-15 10:41:11 RunTimePerDay 2700
2019-07-22 14:32:49 SetCmd_Off set shelly01 off 0
2019-07-22 14:32:33 SetCmd_On set shelly01 on 0
2019-07-17 16:15:00 state off
Attributes:
alias Eigenverbrauch_LWP
readingList state PowerLevelMinTime PowerLimitOn PowerLimitOff RunTimeMin RunTimePerDay FrequencyPerDay Priority TimeStart TimeEnd
room Strom->Photovoltaik
setList state:on,off PowerLevelMinTime:slider,60,30,300 PowerLimitOn:slider,1000,250,4000 PowerLimitOff:slider,1000,250,4000 RunTimeMin:slider,300,300,7200 RunTimePerDay:slider,3600,1800,14400 FrequencyPerDay:slider,1,1,4 Priority:slider,1,1,5 TimeStart:time TimeEnd:time
stateFormat state
verbose 5
webCmd on:off
# Der Aufruf in der fhem Komandozeile
{ReadingsVal("Eigenverbrauch_LWP","SetCmd_On",0)}
# liefert mit
set shelly01 on 0
Nun habe ich ein fuktionierendes DOIF mit folgendem define
##
## 0 Eigenverbrauch abschalten: wenn Mindestlaufzeit erreicht wurde und Maximallaufzeit pro Tag erreicht ist
##
([LWP_Counter:pulseTimePerDay] >= [Eigenverbrauch_LWP:RunTimePerDay] and [LWP_Counter:pulseTimeIncrement] >= [Eigenverbrauch_LWP:RunTimeMin] and [Eigenverbrauch_LWP:state] ne "off")
#
##############################################################################################
#
# Hier soll nun die Ausgabe von "{ReadingsVal("Eigenverbrauch_LWP","SetCmd_Off",0)}" ausgeführt werden. Also zB. "set shelly01 off 0"
#
#
({fhem("set Eigenverbrauch_LWP off")} <== das ist mein bisheriger Test, der den Status des Dummy schaltet
{Log 1, "cmd_1 PV - Eigenverbrauch Priority 1 : Eigenverbrauch_LWP off"})
#
##############################################################################################
#
##
## 1 Eigenverbrauch abschalten: wenn Mindestlaufzeit erreicht wurde und die PV Produktion unter dem Mindestbedarf ist
##
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] < [Eigenverbrauch_LWP:PowerLimitOff] or [Kostal_PV_Eigenverbrauch:state] eq "off") and [LWP_Counter:pulseTimeIncrement] >= [Eigenverbrauch_LWP:RunTimeMin] and [Eigenverbrauch_LWP:state] ne "off")
({fhem("set Eigenverbrauch_LWP off")}
{Log 1, "cmd_2 PV - Eigenverbrauch Priority 1 : Eigenverbrauch_LWP off"})
##
## 2 Stop, wenn es nur ein kurzer peak ist. Dieser Do Zweig setzt den wait timer vom Einschaltkommando cmd_4 wieder außerkraft, wenn wärend der Wartezeit die PV Anlage zuwenig liefert.
##
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] < [Eigenverbrauch_LWP:PowerLimitOff] or [Kostal_PV_Eigenverbrauch:state] eq "off") and ([LWP_PV:wait_timer] ne "no timer" and [LWP_PV:wait_timer] ne "" and [Eigenverbrauch_LWP:state] eq "off") )
({Log 1, "cmd_3 PV - Eigenverbrauch Priority 1 : Stop wait timer"})
##
## 3 Eigenverbrauch einschalten: wenn PV Produktion über dem Mindestbedarf ist und die Laufzeit pro Tag noch nicht erreicht ist
##
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] > [Eigenverbrauch_LWP:PowerLimitOn] and [Kostal_PV_Eigenverbrauch:state] eq "on") and [08:00-20:00] and [Eigenverbrauch_LWP:state] eq "off" and [LWP_Counter:pulseTimePerDay] < [Eigenverbrauch_LWP:RunTimePerDay])
({fhem("set Eigenverbrauch_LWP on")}
{Log 1, "cmd_4 PV - Eigenverbrauch Priority 1 : Eigenverbrauch_LWP on"})
Der Hintergrund ist, dass ich später alle Konfigurationsdefinitionen im Dummy sehen möchte und sich die Logik im DOIF befindet.
Auch aus diesem DOELSEIF würde ich gerne die Zeiten " [08:00-20:00] " aus Dummy readings auslesen. Geht das?
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] > [Eigenverbrauch_LWP:PowerLimitOn] and [Kostal_PV_Eigenverbrauch:state] eq "on") and [08:00-20:00] and [Eigenverbrauch_LWP:state] eq "off" and [LWP_Counter:pulseTimePerDay] < [Eigenverbrauch_LWP:RunTimePerDay])
Habt Ihr da einen Tipp, oder Link zum Nachlesen?
Viele Grüße
Christian
Warum den Umweg über Reading?
Aber warum nicht einfach:
my $cmd = ReadingsVal("Eigenverbrauch_LWP","SetCmd_On","0");
fhem("$cmd");
Gruß, Joachim
Hallo MadMax-FHEM
vielen Dank für die eigendlich simple Lösung, manchmal sucht man sich einfach nen Wolf :-)
Deine Lösung sieht für mich aus wie der Perl Modus im DOIF, da fällt es mir noch etwas schwer mich zurecht zu finden.
Was wäre besser für die Performance? Oder auch die Übersichtlichkeit? Ach herje, soooo viele Fragen.
Ich habe dann gerade auch noch folgendes gefunden:
{fhem("".ReadingsVal("Eigenverbrauch_LWP","SetCmd_Off",0) )}
Ich hatte in meinem Post noch folgendes ergänzt.
ZitatDer Hintergrund ist, dass ich später alle Konfigurationsdefinitionen im Dummy sehen möchte und sich die Logik im DOIF befindet.
Auch aus diesem DOELSEIF würde ich gerne die Zeiten " [08:00-20:00] " aus Dummy readings auslesen. Geht das?
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] > [Eigenverbrauch_LWP:PowerLimitOn] and [Kostal_PV_Eigenverbrauch:state] eq "on") and [08:00-20:00] and [Eigenverbrauch_LWP:state] eq "off" and [LWP_Counter:pulseTimePerDay] < [Eigenverbrauch_LWP:RunTimePerDay])
Vielen Dank
Christian
Es ist vermutlich nicht messbar, ob du zuerst eine Variable ($cmd) befüllst und dann aufrufst oder ReadingsVal direkt in den Aufruf einbaust...
Wenn du den Aufruf öfter nutzt, ist das mit Variable sicher besser... Und man kann die Variable auch mal loggen, um zu sehen, ob das Kommando auch das erwartete Kommando ist... ;)
Datum/Uhrzeit aus Dummy: da sollte sich einiges im Forum finden lassen, gefühlt wird das jede Woche gefragt... ;)
Ok, Kommandos in Dummy Auswertung etc. im DOIF, ja wenn es für dich Sinn macht...
Ansonsten kann ich zu DOIF wenig sagen, nutze ich nicht...
...ich packe "so Zeugs" meist in eine Sub und programmiere gleich Perl... ;)
Gruß, Joachim
Zitat von: MadMax-FHEM am 22 Juli 2019, 16:17:07
Datum/Uhrzeit aus Dummy: da sollte sich einiges im Forum finden lassen, gefühlt wird das jede Woche gefragt... ;)
Leider habe ich nichts passendes gefunden
der Hinweg geht...
{time()} ===> 1563808062.38839
{FmtTime(time())} ===> 17:06:20
Für den Rückweg fehlte mir halt das dann noch....
{ <Funktion>("17:06:20") }
Update: Im nächsten Post habe ich mein issue dann noch selber lösen können, ohne so Zeugs direkt wieder in perl zu packen ;-)
Gruß
Christian
Sooo, nun habe ich es gefunden und getestet...
Indirekten Zeitangaben https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben (https://fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben)
Im DOIF verwendet man "[[Eigenverbrauch_LWP:TimeStart]]-[[Eigenverbrauch_LWP:TimeEnd]]", was hier ein Zeitbereich zwischen zB. 08:00-20:00 ist.
DOELSEIF (([Kostal_PV_Eigenverbrauch:FeedIn] > [Eigenverbrauch_LWP:PowerLimitOn] and [Kostal_PV_Eigenverbrauch:state] eq "on") and [[Eigenverbrauch_LWP:TimeStart]]-[[Eigenverbrauch_LWP:TimeEnd]] and [Eigenverbrauch_LWP:state] eq "off" and [LWP_Counter:pulseTimePerDay] < [Eigenverbrauch_LWP:RunTimePerDay])
Das Dummy dazu mit den readings TimeStart/End
Internals:
FUUID 5d12286f-f33f-81e9-eb52-e2ca61ae5412a693
NAME Eigenverbrauch_LWP
NR 299
STATE off
TYPE dummy
OLDREADINGS:
READINGS:
2019-07-17 15:37:42 PowerLevelMinTime 60
2019-07-03 18:46:07 PowerLimitOff 3000
2019-07-03 18:45:31 PowerLimitOn 3500
2019-07-15 10:45:25 RunTimeMin 300
2019-07-15 10:41:11 RunTimePerDay 2700
2019-07-22 15:36:11 SetCmdOff set shelly01 off 0
2019-07-22 15:35:59 SetCmdOn set shelly01 on 0
2019-07-22 15:57:14 TimeEnd 20:00
2019-07-22 17:23:41 TimeStart 08:00
2019-07-17 16:15:00 state off
Attributes:
alias Eigenverbrauch_LWP
readingList state PowerLevelMinTime PowerLimitOn PowerLimitOff RunTimeMin RunTimePerDay RunTimeStart RunTimeEnd SetCmd_Off SetCmd_On TimeStart TimeEnd
room Strom->Photovoltaik
setList state:on,off PowerLevelMinTime:slider,60,30,300 PowerLimitOn:slider,1000,250,4000 PowerLimitOff:slider,1000,250,4000 RunTimeMin:slider,300,300,7200 RunTimePerDay:slider,3600,1800,14400 SetCmdOff SetCmdOn TimeStart:time TimeEnd:time
stateFormat state
verbose 5
webCmd on:off
Ändert man nun im Dummy TimeStart/End , so verändert sich ebenfalls der Timer im DOIF und das DOIF geht in den Status "initialized".
Vielen Dank an MadMax-FHEM für die Motivation weiter zu suchen.
Gruß
Christian
Hi Christian,
bitte gerne und danke! :)
Geht nun alles oder ist noch was offen?
Wenn alles geht, dann bitte noch ein [gelöst] vor den ersten Post...
Gruß, Joachim