[gelöst] WAIT mit Unterscheidung zw. Bedingungswechsel und Bedingungswiederholung

Begonnen von FHEMAN, 12 Januar 2025, 15:09:12

Vorheriges Thema - Nächstes Thema

FHEMAN

Hi, ich habe ein DOIF, welches aus zwei Bedingungen besteht. Stark vereinfacht:

({[Solarpower]>0)(Akku laden mit [Solarpower] Watt})
DOELSE({Akku entladen mit [Powermeter:Verbrauch] Watt})


do always ist aktiviert wegen der regelmäßigen Anpassung der Ladepower je nach PV-Überschuss. Der Ausführungsteil muss Perl Code sein.

Nun möchte ich wegen der Relaisschonung am liebsten den Bedingungswechsel (Wechsel zw. Laden und Entladen) nur alle 900 Sekunden zulassen bzw. für diese Zeit einlocken.
Die regelmäßige Ausführung desselben Bedingungsteils soll jedoch alle 30 Sekunden durchgeführt werden dürfen.

Mit wait und repeatcmd komme ich nicht weiter nach meinem Verständnis.

Gibt es ein Attribut, um dies auf einfachem Wege umzusetzen?

   
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

rabehd

Mit dem Attribut cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:... wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung. In der angegebenen Zeitspanne wird ein Kommando nicht ausgeführt, auch wenn die dazugehörige Bedingung wahr wird.
Auch funktionierende Lösungen kann man hinterfragen.

FHEMAN

Hatte ich in Betracht gezogen. Aber hilft nicht bei meinem Problem, da die Pause pro Zweig gilt. Ich will ja den Wechsel mit einer Pause versehen.
w
Wie ein einmaliges wait.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

rabehd

Dann deaktivere Dein DOIF beim Wechsel und starte ein at, welches aktiviert.  ;)

Auch funktionierende Lösungen kann man hinterfragen.

Per

Soll die Pause nur beim Wechsel zwischen den beiden Fällen sein oder auch innerhalb eines Falls?
Man kann mit mehreren Sequenzen und wait auch global warten erzwingen.

FHEMAN

Nur beim Wechsel pausieren, genau. Mit Sequenzen arbeite ich aktuell nicht, der Ausführungsteil ist bei mir (wie fast immer) Perl Code.

Ein separates at möchte ich vermeiden. Dann könnte ich auch da gleich alle Logik reinbauen.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Per

Dann geh doch ganz in den Perl Mode, erstelle bei jeden Command einen Timer, welchen du das nächste mal abfragst. Also quasi ein internes at.
Was anderes macht wait ja bestimmt auch nicht, nur eine Ebene tiefer.

FHEMAN

Ja, ich hatte nur den Verdacht, dass ich etwas / ein Attribut übersehe bei der Vielzahl an Möglichkeiten in DOIF.

So siehts jetzt aus:
{ if (get_Timer("doif.AkkuEntladen")==0 and [Solarpower]>0) {
    ... Akku laden mit [Solarpower] Watt ...
    set_Timer("doif.AkkuLaden",600);      
}}
{ if (get_Timer("doif.AkkuLaden")==0 and [Powermeter:Verbrauch] != 0) {
    ... Akku entladen mit [Powermeter:Verbrauch] Watt ...
    set_Timer("doif.AkkuEntladen",600);   
}}


Ich bin nur noch nicht sicher, ob die zweite Bedingung jetzt ebenfalls als ELSE verstanden wird. 
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

FHEMAN

Irgendwas übersehe ich. Muss ich noch was umschalten für die Perl Variante?
   
condition c01: Undefined subroutine &DOIF::get_Timer called, line 1.
condition c02: Undefined subroutine &DOIF::get_Timer called, line 1.


//Nachtrag:
OK, es war noch ein auskommentierter DOELSEIF Zweig drin, über den das DOIF wohl gestolpert ist.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Damian

Zitat von: FHEMAN am 12 Januar 2025, 19:30:59Ja, ich hatte nur den Verdacht, dass ich etwas / ein Attribut übersehe bei der Vielzahl an Möglichkeiten in DOIF.

So siehts jetzt aus:
{ if (get_Timer("doif.AkkuEntladen")==0 and [Solarpower]>0) {
    ... Akku laden mit [Solarpower] Watt ...
    set_Timer("doif.AkkuLaden",600);       
}}
{ if (get_Timer("doif.AkkuLaden")==0 and [Powermeter:Verbrauch] != 0) {
    ... Akku entladen mit [Powermeter:Verbrauch] Watt ...
    set_Timer("doif.AkkuEntladen",600);   
}}


Ich bin nur noch nicht sicher, ob die zweite Bedingung jetzt ebenfalls als ELSE verstanden wird. 

Jeder Block wird für sich getriggert und ausgeführt, hier gibt es keine direkte Abhängigkeit zwischen den Blöcken. Denk dran, dass alles den Block triggert, was der DOIF-Trigger-Syntax entspricht, egal wo es innerhalb des Blocks steht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEMAN

Das dachte ich mir schon. Auch wenn es für den Nicht-Perl Modus gilt, ich habe es wegen des Komforts wieder umgestellt. (Ich werde nicht so richtig warm mit dem Perl-Bedingungsteil)
Dazu zwei Readings als Timer missbraucht:

([?$SELF:LastDischarge:sec,601] > 600 and [Solarpower]>0) ({
    ... Akku laden mit [Solarpower] Watt ...
    fhem("setreading $SELF LastCharge 1");     
}) DOELSEIF ([?$SELF:LastCharge:sec,601] > 600 and [Powermeter:Verbrauch] != 0) ({
    ... Akku entladen mit [Powermeter:Verbrauch] Watt ...
    fhem("setreading $SELF LastDischarge 1"); 
})

set_Reading("LastCharge","1")
funktioniert ja nicht, selbst wenn ich im Ausführungsteil Perl verwende, richtig?

 
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Damian

Zitat von: FHEMAN am 12 Januar 2025, 21:13:40set_Reading("LastCharge","1")[/font] funktioniert ja nicht, selbst wenn ich im Ausführungsteil Perl verwende, richtig?

set_Reading ist eine Funktion aus dem DOIF-Namensraum, also im Perl-Modus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEMAN

OK, danke.

Kann es sein, dass [<Device>:<Reading>:sec] keinen Default-Wert zulässt, wie ich ihn oben verwende? Es gibt zwar keinen Fehler, aber er scheint meine Zeitangabe zu ignorieren oder sogar falsch zu interpretieren. In der Doku steht es nicht explizit.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Damian

Zitat von: FHEMAN am 13 Januar 2025, 00:15:59OK, danke.

Kann es sein, dass [<Device>:<Reading>:sec] keinen Default-Wert zulässt, wie ich ihn oben verwende? Es gibt zwar keinen Fehler, aber er scheint meine Zeitangabe zu ignorieren oder sogar falsch zu interpretieren. In der Doku steht es nicht explizit.

ja, da stimmt was nicht, muss ich mir mal genauer anschauen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF