Reading im Ausführungsteil schalten

Begonnen von Tabularasa, 17 Oktober 2018, 15:57:45

Vorheriges Thema - Nächstes Thema

Tabularasa

Zitat von: Otto123 am 19 Oktober 2018, 16:36:29
Das Schwarze ist die Schrift? Die weiße Zeile mit Code: davor und Inhalt in meinem Post?  :-\
Jetzt steh ich ganz auf dem Schlauch :-[
dein notify
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
entspricht doch nicht dem kompletten DOIF von mir oder wie?

Otto123

Das DOIF aus deinem ersten Post macht doch nichts anderes? Oder redest Du von einem Anderen?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tabularasa

#17
In #13 hatte ich ja geschrieben, dass mein DOIF vom ersten Post nicht vollständig war sondern
([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45 and [07:00-22:00]) (set RoomTemporaryDesiredTemp 17)
DOELSEIF (Bedingung) (set RoomTemporaryDesiredTemp 15)
DOELSE (set RoomTemporaryDesiredTemp -1)

und
ZitatWie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
dieser Text von mir stand ja direkt unter dem vollständigen DOIF und bezog sich darauf :D[

Otto123

Naja, das liebe ich: Immer bloß die Hälfte posten  :)
Kann es sein, dass dein Edit und mein Post sich überschnitten haben? Oder ich habe einfach nicht alles gelesen  :-[

Naja mit drei zusätzlichen Bedingungen und Zeitraum  wird das notify natürlich komplizierter.
Machs mit DOIF :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tabularasa

 ;D ;D
aber mein edit hatte nur Kleinigkeiten geändert... der Hauptteil war schon da ;)
Nur wie es aussieht muss ich ja das DOIF auch mit Perl machen, da ja sonst der error immer kommt aber da muss ich wohl auf Damian oder Ellert warten ob mein Versuch aus #13 zumindest im Ansatz richtig war 8)

Damian

Zitat von: Tabularasa am 19 Oktober 2018, 19:43:35
;D ;D
aber mein edit hatte nur Kleinigkeiten geändert... der Hauptteil war schon da ;)
Nur wie es aussieht muss ich ja das DOIF auch mit Perl machen, da ja sonst der error immer kommt aber da muss ich wohl auf Damian oder Ellert warten ob mein Versuch aus #13 zumindest im Ansatz richtig war 8)


DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 17"
  } else {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)


DOIF_Readings entkoppelt wiederholende Events von der eigentlichen DOIF-Definition, damit nicht bei jedem Event geschaltet wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Danke erstmal. Ich hoffe ich hab das jetzt richtig verstanden... Im nachfolgenden Code ist noch ein zusätzlicher Zweig. @Damian, kannst du nochmal drüber gucken, auch mit Klammersetzung?Das Fettgeschriebene ist jetzt nur erstmal zum Verständnis, noch kein richtiger Zweck.
DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 17"
  } [b]elsif {
    ([$SELF:absent] and [07:00-22:00]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 16"[/b]
  }

else {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)[b], absent: ([Bewohner] eq "absent" and [Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<45 and [HZG_EG_EZ:actuator]<20)[/b]

Damian

Zitat von: Tabularasa am 19 Oktober 2018, 21:24:32
Danke erstmal. Ich hoffe ich hab das jetzt richtig verstanden... Im nachfolgenden Code ist noch ein zusätzlicher Zweig. @Damian, kannst du nochmal drüber gucken, auch mit Klammersetzung?Das Fettgeschriebene ist jetzt nur erstmal zum Verständnis, noch kein richtiger Zweck.
DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 17"
  } [b]elsif {
    ([$SELF:absent] and [07:00-22:00]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 16"[/b]
  }

else {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)[b], absent: ([Bewohner] eq "absent" and [Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<45 and [HZG_EG_EZ:actuator]<20)[/b]


Im ersten if-Zweig kommt absent nicht vor, d. h. auch wenn der zweite wahr wird, wird paar Minuten später evtl. der erste wieder zuschlagen, unabhängig davon ob absent wahr ist oder nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Hallo. Ich habe mein DOIF jetzt nochmal geändert, da ich glaube dass es mit der Außentemperatur nicht funktioniert, jedoch schaltet das aktuelle nicht. Hier mal das list
Internals:
   DEF        { if ([$SELF:power]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 5"
  } elsif
    ([$SELF:act]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }
}
   MODEL      Perl
   NAME       di_Heizung
   NR         217
   NTFY_ORDER 50-di_Heizung
   STATE      cmd_1
   TYPE       DOIF
   DOIF_Readings:
     act        (::EventDoIf('',$hash,'^actuator',0)>55)
     power      (::ReadingValDoIf($hash,'Buderus','Power')==0)
   READINGS:
     2018-10-25 20:38:19   Device          di_Heizung
     2018-10-25 20:15:29   act             
     2018-10-25 20:38:19   cmd             1
     2018-10-25 20:38:19   cmd_event       set_cmd_1
     2018-10-25 20:38:19   cmd_nr          1
     2018-10-25 20:34:06   mode            enabled
     2018-10-25 19:58:53   power           1
     2018-10-25 20:38:19   state           cmd_1
     2018-10-19 23:08:38   temp           
     2018-10-19 15:41:50   warm           
   Regex:
     DOIF_Readings:
       :
         act:
           ":^actuator" :^actuator
       Buderus:
         power:
           Power      ^Buderus$:^Power:
       di_Heizung:
   attr:
     cmdState:
   condition:
     0           if (::ReadingValDoIf($hash,'di_Heizung','power')) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 5"
  } elsif
    (::ReadingValDoIf($hash,'di_Heizung','act')) {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }

   devices:
     0           di_Heizung
     all         di_Heizung
   do:
     0:
   helper:
     event      cmd_nr: 1,cmd: 1,cmd_event: set_cmd_1,cmd_1
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_Heizung
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_cmd_1
       state: cmd_1
     triggerEvents:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_cmd_1
       cmd_1
       Device: di_Heizung
     triggerEventsState:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_cmd_1
       state: cmd_1
   internals:
   itimer:
   perlblock:
     0         
   readings:
     0           di_Heizung:power di_Heizung:act
     all         di_Heizung:power di_Heizung:act
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings power:([Buderus:Power]==0), act:([":^actuator"]>55)
   room       DOIF


Es soll, wenn irgendein Thermostat die Actuator Position über 55 hat, in cmd_2 wechseln. Das tut es aber nicht.
Und warum kann ich eigentlich bei set nur noch enable und disable auswählen? Danke

Damian

Du hast scheinbar im FHEM-Modus angefangen und dann in Perl gewechselt. Die ganzen cmd-Readings gibt es im Perl-Modus normalerweise nicht.

Hast du die cfg-Datei editiert?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Es stand die ganze Zeit auf cmd_2 und dann habe ich in der Kommandozeile set di_Heizung cmd_1 eingegeben.
Deshalb vielleicht die cmd Readings... cfg habe ich nicht editiert. Sonst würde es aber gut aussehen? Bzw wie wechselt man denn in den Perl Modus?

Damian

Zitat von: Tabularasa am 25 Oktober 2018, 22:13:50
Es stand die ganze Zeit auf cmd_2 und dann habe ich in der Kommandozeile set di_Heizung cmd_1 eingegeben.
Deshalb vielleicht die cmd Readings... cfg habe ich nicht editiert. Sonst würde es aber gut aussehen? Bzw wie wechselt man denn in den Perl Modus?

Ich weiß nicht, ob dir der Unterschied zwischen FHEM-Modus und Perl-Modus bewusst ist. Deine Definition ist aufgrund der Syntax Perlmodus, es beginnt mit { statt mit (, da solltest du noch mal in der Commandref nachschauen. Im Perl-Modus gibt es keine Zustände und keine cmd-Kommandos, daher eine eingeschränkte Auswahl von set-Befehlen. Wenn dir das zu ungewohnt ist, dann bleibe im FHEM-Modus.

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

Tabularasa

#27
Das ist mir durchaus ungewohnt und ich würde auch gern im fhem Modus bleiben, jedoch bekomme ich ja dann wieder den Error. Der erste Zweig hat heute morgen zumindest schonmal funktioniert. Ich denke es liegt irgendwo an dem DOIF_Reading mit act. Ist das die richtige Syntax dafür um auf alle devices die im Reading actuator haben zu prüfen? Wäre schön wenn du dir das nochmal ansehen könntest. Danke

edit: habe das DOIF mal gelöscht und neu angelegt. im Log kommt
2018.10.26 09:57:14 3: di_Heizung: warning in DOIF_Readings: act
hier nochmal ein list
Internals:
   CFGFN     
   DEF        { if   ([$SELF:power]) {     
fhem_set "Buderus RoomTemporaryDesiredTemp 5"   }
elsif  ([$SELF:act]) {     
fhem_set "Buderus RoomTemporaryDesiredTemp -1"   }
}
   MODEL      Perl
   NAME       di_Heizung
   NR         3703
   NTFY_ORDER 50-di_Heizung
   STATE      ???
   TYPE       DOIF
   DOIF_Readings:
     act        (::EventDoIf('',$hash,'^actuator',0)>55)
     power      (::ReadingValDoIf($hash,'Buderus','Power')==0 and ::ReadingValDoIf($hash,'Buderus','PumpModulation')<46)
   READINGS:
     2018-10-26 09:57:14   Device          di_Heizung
     2018-10-26 09:57:14   act             
     2018-10-26 09:57:16   block_01        executed
     2018-10-26 09:57:14   e_di_Heizung_act
     2018-10-26 09:57:14   e_di_Heizung_power 1
     2018-10-26 09:56:46   mode            enabled
     2018-10-26 09:57:14   power           1
   Regex:
     DOIF_Readings:
       :
         act:
           ":^actuator" :^actuator
         power:
       Buderus:
         act:
         power:
           Power      ^Buderus$:^Power:
           PumpModulation ^Buderus$:^PumpModulation:
   condition:
     0           if   (::ReadingValDoIf($hash,'di_Heizung','power')) {     
fhem_set "Buderus RoomTemporaryDesiredTemp 5"   }
elsif  (::ReadingValDoIf($hash,'di_Heizung','act')) {     
fhem_set "Buderus RoomTemporaryDesiredTemp -1"   }

   devices:
     0           di_Heizung
     all         di_Heizung
   helper:
     DOIF_Readings_events
     event      power: 1,act:
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_Heizung
     triggerEvents:
       power: 1
       act:
       e_di_Heizung_power: 1
     triggerEventsState:
       power: 1
       act:
   internals:
   itimer:
   perlblock:
     0         
   readings:
     0           di_Heizung:power di_Heizung:act
     all         di_Heizung:power di_Heizung:act
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:([":^actuator"]>55)
   room       DOIF

Damian

ZitatDEF        { if ([$SELF:power]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp 5"
  } elsif
    ([$SELF:act]) {
    fhem_set "Buderus RoomTemporaryDesiredTemp -1"
  }
}

Der Perlmodus verhält sich anders, als der FHEM-Modus, hier wird immer der ganze Block ausgeführt (entspricht checkall). Wenn act triggert und power wahr ist, dann wird immer nur der erste Zweig ausgeführt, bis zu der zweiten Abfrage kommt es dann nicht mehr.

Wenn die Bedingungen unabhängig von einander sind, dann sollte man sie in eigenen Blöcken unterbringen.

DEF       
{ if ([$SELF:power]) {fhem_set "Buderus RoomTemporaryDesiredTemp 5"}}
{ if  ([$SELF:act]) {fhem_set "Buderus RoomTemporaryDesiredTemp -1"}}


So sind die Abfragen entkoppelt und beeinflussen sich nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Hier mal ein list im FHEM Modus nach Ellert seiner Anleitung(falls ich es richtig gemacht habe), der leider auch nicht klappt
Internals:
   CFGFN     
   DEF        ([Buderus:Power]==0 and [Buderus:PumpModulation]<46)
{fhem("set Buderus:FILTER=RoomTemporaryDesiredTemp!=5 RoomTemporaryDesiredTemp 5");;undef}
DOELSEIF
([":^actuator"]>55) {fhem("set Buderus RoomTemporaryDesiredTemp 20");;undef}
   MODEL      FHEM
   NAME       di_Heizung1
   NR         3533
   NTFY_ORDER 50-di_Heizung1
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-10-26 10:29:44   Device          HZG_OG_Nora
     2018-10-26 10:28:30   cmd             1
     2018-10-26 10:28:30   cmd_event       di_Heizung1
     2018-10-26 10:28:30   cmd_nr          1
     2018-10-26 10:28:24   mode            enabled
     2018-10-26 10:28:30   state           cmd_1
   Regex:
     cond:
       :
         0:
         1:
           ":^actuator" :^actuator
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Buderus','Power')==0 and ::ReadingValDoIf($hash,'Buderus','PumpModulation')<46
     1          ::EventDoIf('',$hash,'^actuator',0)>55
   devices:
     0           Buderus
     all         Buderus
   do:
     0:
       0          {fhem("set Buderus:FILTER=RoomTemporaryDesiredTemp!=5 RoomTemporaryDesiredTemp 5");;undef}
     1:
       0          {fhem("set Buderus RoomTemporaryDesiredTemp 20");;undef}
     2:
   helper:
     event      actuator: 71
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev HZG_OG_Nora
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_Heizung1
       state: cmd_1
     triggerEvents:
       actuator: 71
     triggerEventsState:
       actuator: 71
   internals:
   itimer:
   readings:
     0           Buderus:Power Buderus:PumpModulation
     all         Buderus:Power Buderus:PumpModulation
   trigger:
   uiState:
   uiTable:
Attributes:
   room       DOIF


Leider klappt das mit den eigenen Blöcken auch nicht :-\
hatte auch ein edit im letzten Beitrag. haste den gesehen?
hier mal noch was kommt im eventmonitor
2018-10-26 10:47:02 CUL_HM HZG_OG_Nora actuator: 74
2018-10-26 10:52:52 CUL_HM HZG_OG_Nora actuator: 97

und hier dazu im log
2018.10.26 10:47:02 3: di_Heizung: warning in DOIF_Readings: act
2018.10.26 10:52:52 3: di_Heizung: warning in DOIF_Readings: act