[gelöst] DOIF - reagiert nicht mehr auf Events (uiTable und Timer)

Begonnen von ch.eick, 27 Februar 2022, 10:54:10

Vorheriges Thema - Nächstes Thema

ch.eick

Zitat von: Damian am 01 März 2022, 16:59:11
Klar, das ist komfortabel. Läuft bei meinen Eltern auch so. Unsere Heizung ist etwas älter, da lässt sich der hydraulischer Abgleich schlecht vornehmen. Der Komfort kann aber etwas mehr Heizkosten bedeuten, weil er punktuell pro Raum nicht steuerbar ist. Abgesehen davon, wollte ich sehen, wann tatsächlich die Ventile in den Räumen offen sind, um den Heizbedarf der Räume etwas abschätzen zu können.
Das ist alles legitiem und würde ich auch so machen und Dein Monitoring sieht auch sehr gut aus :-)
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

Zitat von: Damian am 01 März 2022, 12:07:16
Da du ohnehin schon viel mit Perl gemacht hast, ist das der richtige Weg. Auf Dauer wirst du davon profitieren. Du kannst nun im Modul eigene Funktionen definieren, mit Instanzvariablen hantieren, mehrere Blöcke gleichzeitig und unabhängig voneinander ausführen, den Status setzen, wie du willst usw.
Hallo Damin,
das DOIF Perl Modus reagiert doch anders auf die Events und ich habe das Problem, dass es zu doppelten Ausführungen der Blöcke kommt.

Hast Du da mal einen Tipp, wie ich das verriegeln kann?

2022.03.03 17:43:57.648 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie wird mit Automatik gesteuert
2022.03.03 17:43:57.649 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie auf 97.00 %, Entlademodus freigegeben
2022.03.03 17:43:57.682 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie wird mit Automatik gesteuert
2022.03.03 17:43:57.683 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie auf 97.00 %, Entlademodus freigegeben

Das setzen von readings innerhalb des Blocks ist wohl zu langsam, da die Events erst später ausgelöst werden.
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

Damian

Zitat von: ch.eick am 03 März 2022, 18:38:32
Hallo Damin,
das DOIF Perl Modus reagiert doch anders auf die Events und ich habe das Problem, dass es zu doppelten Ausführungen der Blöcke kommt.

Hast Du da mal einen Tipp, wie ich das verriegeln kann?

2022.03.03 17:43:57.648 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie wird mit Automatik gesteuert
2022.03.03 17:43:57.649 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie auf 97.00 %, Entlademodus freigegeben
2022.03.03 17:43:57.682 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie wird mit Automatik gesteuert
2022.03.03 17:43:57.683 3: WR_1_Speicher_1_ExternControl cmd_3  : Batterie auf 97.00 %, Entlademodus freigegeben

Das setzen von readings innerhalb des Blocks ist wohl zu langsam, da die Events erst später ausgelöst werden.
Ich kenne deinen Block nicht. Wenn ein Block zwei mal ausgeführt wurde, dann muss es auch zwei Trigger gegeben haben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ch.eick

Zitat von: Damian am 03 März 2022, 18:40:46
Ich kenne deinen Block nicht. Wenn ein Block zwei mal ausgeführt wurde, dann muss es auch zwei Trigger gegeben haben.
Ja, beim durchlaufen des Blocks wir auch in einem anderen Device ein neuer Status abgeholt, was eine zweite Bedingung für den selben Block auslöst.

Trotzdem soll der Block aber nur einmal durchlaufen werden, weshalb ich das gerne verriegeln möchte.


3_Automatik_smart_Laden_beenden
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
     and
     [$SELF:SpeicherEntladung] eq "Automatik" and                        ## Nur für den Automatik Modus
      (
       [WR_1_API:Battery_InternControl_MinHomeConsumption] > 100         ## Das Speicher Entladen ist geperrt
       and
       [$SELF:ui_command_1] ne "smart_Laden_start"                       ## Das verriegelt gegen das smart_Laden_start
       and
       (
            [WB_1:lp_1_ChargeStat] ne "loading"                          ## Es wird gerade kein Fahrzeug geladen
        and
        (
           [WR_1:Act_state_of_charge] >= 90                              ## Der Speicher ist bereits 90% voll oder vor dem            <<< dieses EVENT scheint die zweite Auslösung zu erzeugen
         or                                                              ##    Fahrzeug Laden war der Speicher frei gegeben
           [Kia_eNiro_PV:WR_1_Speicher_1_ExternControl_smart_laden_before] eq "inaktiv"
        )
       )
      or [$SELF:ui_command_1] eq "smart_Laden_beenden"                   ## Hier wird das uiTable select ausgewertet       <<< Das war der erste EVENT, den ich verwendet hatte
     )
   ) {

    if( [$SELF:ui_command_1] eq "smart_Laden_beenden" ) {                ## Hier wurde manuell aktiviert
      set_Reading("ui_command_1_before",[$SELF:ui_command_1]);
    }

   if ( [WB_1:lp_1_ChargeStat] ne "loading" ) {                          ## Es wird gerade kein Fahrzeug geladen
     fhem("setreading Kia_eNiro_PV WR_1_Speicher_1_ExternControl_smart_laden_before ---");  ## den Merker wieder zurück setzen

     if (AttrVal("$SELF","verbose",0) >=3)
       {Log 3, "$SELF cmd_3  : Batterie wird mit Automatik gesteuert";
        Log 3, "$SELF cmd_3  : Batterie auf ".[WR_1:Act_state_of_charge]." %, Entlademodus freigegeben"};
     ::CommandSet(undef, "WR_1_API 22_03_Battery_MinHomeConsumption 50");                                              <<< hier wird im Speicher ein Wert gesetzt und impliziet auch der Status abgefragt
     set_Reading("SpeicherExternTrigger","none");                        ## den externen Trigger wieder freigeben
   } else {
     if (AttrVal("$SELF","verbose",0) >= 0)
        {Log 3, "$SELF cmd_3  : Kia_eNiro_PV es wird gerade geladen";    ## Es wird noch ein Fahrzeug geladen.
         Log 3, "$SELF cmd_3  : Kia_eNiro_PV smart_laden bleibt aktiviert"};
   }

   set_Reading("ui_command_1","---");                                    ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
  }
}
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

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ch.eick

Zitat von: Damian am 03 März 2022, 19:30:57
Trigger rausnehmen kannst du mit [?...]
Das verstehe ich nicht, welchen Trigger soll ich raus nehmen?
Der wird ja in einer anderen Situation verwendet.

Das eine wäre eine manuelle Steuerung und das andere wird für den Automatismus verwendet.
Es darf nur nicht in dem Moment, wo ich es manuell mache noch zusätzlich automatisch passieren.
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

Damian

Also im Perlmodus wird im Gegensatz zum FHEM-Modus der ganze Block ausgeführt, egal wo die Triggerangaben stehen.

Wenn du Teile davon getrennt ausführen willst, dann musst du den Block in mehrere Blöcke auftrennen. Gemeinsamkeiten der Blöcke werden dann über Funktionen realisiert, so wie beim strukturierten Programmieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF