[gelöst] DOIF mit ausführen eines fhem Befehls aus einem reading

Begonnen von ch.eick, 22 Juli 2019, 15:08:23

Vorheriges Thema - Nächstes Thema

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

MadMax-FHEM

Warum den Umweg über Reading?

Aber warum nicht einfach:


my $cmd = ReadingsVal("Eigenverbrauch_LWP","SetCmd_On","0");
fhem("$cmd");


Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

MadMax-FHEM

#3
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Sooo, nun habe ich es gefunden und getestet...

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)