Reading im Ausführungsteil schalten

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

Vorheriges Thema - Nächstes Thema

Tabularasa

Hallo. Habe folgendes DOIF
Internals:
   CFGFN     
   DEF        ([Buderus:OutdoorTemp]>15) (set Buderus RoomTemporaryDesiredTemp 17)
   MODEL      FHEM
   NAME       di_Heizung
   NR         16230
   NTFY_ORDER 50-di_Heizung
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-10-17 15:49:38   Device          Buderus
     2018-10-17 15:49:38   cmd             1
     2018-10-17 15:49:38   cmd_event       di_Heizung
     2018-10-17 15:49:38   cmd_nr          1
     2018-10-17 15:49:38   error           set Buderus RoomTemporaryDesiredTemp 17: 17
     2018-10-17 15:48:28   mode            enabled
     2018-10-17 15:49:38   state           cmd_1
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Buderus','OutdoorTemp')>15
   devices:
     0           Buderus
     all         Buderus
   do:
     0:
       0          set Buderus RoomTemporaryDesiredTemp 17
     1:
   helper:
     event      RoomDesiredTemp: 17.5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev Buderus
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: di_Heizung
       error: set Buderus RoomTemporaryDesiredTemp 17: 17
       state: cmd_1
     triggerEvents:
       RoomDesiredTemp: 17.5
     triggerEventsState:
       RoomDesiredTemp: 17.5
   internals:
   itimer:
   readings:
     0           Buderus:OutdoorTemp
     all         Buderus:OutdoorTemp
   trigger:
   uiState:
   uiTable:
Attributes:
   disable    0
   room       DOIF


Leider bekomme ich einen error angezeigt, schalten tut es zwar aber mich stört der error ein bisschen ::)
Im Log erscheint dazu folgendes
2018.10.17 15:49:00 1: ERROR evaluating { Buderus }: Bareword "Buderus" not allowed while "strict subs" in use at (eval 230445) line 1.

2018.10.17 15:49:35 3: Buderus set raw /heatingCircuits/hc1/temporaryRoomSetpoint value 17
2018.10.17 15:49:35 2: Buderus get /heatingCircuits/hc1/temporaryRoomSetpoint - HTTP: HTTP/1.0 200 The request has succeeded
Content-Type: application/json, data: {"id":"/heatingCircuits/hc1/temporaryRoomSetpoint","type":"floatValue","writeable":1,"recordable":0,"value":17.5,"unitOfMeasure":"C","minValue":5.0,"maxValue":30.0,"state":[{"off":0.0},{"na":-1.0}]}
2018.10.17 15:49:35 3: Buderus /heatingCircuits/hc1/temporaryRoomSetpoint set floatValue 17
2018.10.17 15:49:35 3: Buderus raw HTTP data: {"value":17}
2018.10.17 15:49:37 2: Buderus get /heatingCircuits/hc1/temporaryRoomSetpoint - HTTP: HTTP/1.0 200 The request has succeeded
Content-Type: application/json, data: {"id":"/heatingCircuits/hc1/temporaryRoomSetpoint","type":"floatValue","writeable":1,"recordable":0,"value":17.0,"unitOfMeasure":"C","minValue":5.0,"maxValue":30.0,"state":[{"off":0.0},{"na":-1.0}]}
2018.10.17 15:49:38 2: di_Heizung: set Buderus RoomTemporaryDesiredTemp 17: 17
2018.10.17 15:49:38 1: Perfmon: possible freeze starting at 15:49:36, delay is 2.014

Kann jemand daran erkennen worauf der error zurückzuführen ist?
Danke

Otto123

#1
Hi,

So würdest Du den state des Gerätes Buderus mit "RoomTemporaryDesiredTemp 17" setzen!
Das geht so sicher nicht! Es sei denn Buderus hat readingList gesetzt.

Was willst Du wirklich? Ein Reading im Gerät Buderus setzen? Dann
setreading Buderus RoomTemporaryDesiredTemp 17

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

Ellert

Diese Fehlermeldung
Zitat2018.10.17 15:49:00 1: ERROR evaluating { Buderus }: Bareword "Buderus" not allowed while "strict subs" in use at (eval 230445) line 1.
sollte nicht vom Schaltvorgang des DOIF kommen, sie entsteht 38 s vorher.

Set scheint untypischerweise etwas zurückzugeben, das wird als Fehler interpretiert. Passiert das auch in der Befehlszeile?

Siehe auch https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Besonderheit_des_Error-Reading

Tabularasa

#3
Wenn ich das wüsste was ich will ::)
Ich habe das Modul BDKM für meine Heizung und möchte in der Set Liste was schalten.
Hier mal ein gekürztes list von dem Buderus Device
Internals:
   BASEINTERVAL 120
   DEF        192.168.178.99
   HTTPTIMEOUT 10
   INTERPOLLDELAY 0
   IP         192.168.178.99
   ISPOLLING  0
   NAME       Buderus
   NR         234
   READBACKDELAY 500
   SEQUENCE   11
   STATE      idle
   TYPE       BDKM
   VERSION    $Id: 79_BDKM.pm 12770 2016-12-14 08:39:57Z arnoaugustin $
   IDS:

     /heatingCircuits/hc1/temporaryRoomSetpoint:
       MAX        30
       MIN        5
       TYPE       floatValue
       UNIT       C
       VALUE      17
       WRITEABLE  1

   JOBQUEUE:
   POLLIDS:
     /heatingCircuits/hc1/temporaryRoomSetpoint:
       DELTA     
       MODULO     1
   READINGS:
     
     2018-10-17 15:51:34   RoomDesiredTemp 17
     2018-10-06 21:52:18   RoomManualDesiredTemp 21
     2018-10-17 15:49:37   RoomTemporaryDesiredTemp 17
     2018-10-17 16:16:50   SecondBurnerWorkingTime 0
     2018-10-17 16:16:50   Status          ACTIVE
   REALTOUSER:
     /heatingCircuits/hc1/temporaryRoomSetpoint RoomTemporaryDesiredTemp
     
   UPDATES:
     
     /heatingCircuits/hc1/temporaryRoomSetpoint
     
   USERTOREAL:
/heatingCircuits/hc1/manualRoomSetpoint
     RoomTemporaryDesiredTemp /heatingCircuits/hc1/temporaryRoomSetpoint
   helper:
     _98_statistics ST.Gasverbrauch
Attributes:
   PollIds    RC300DEFAULTS
   event-on-change-reading .*
   group      Buderus
   room       System

Das was ich unten im Bild so setzen möchte, wollte ich im DOIF machen
Danke :D

edit
Zitat von: Ellert am 17 Oktober 2018, 17:02:42
Diese Fehlermeldungsollte nicht vom Schaltvorgang des DOIF kommen, sie entsteht 38 s vorher.

Set scheint untypischerweise etwas zurückzugeben, das wird als Fehler interpretiert. Passiert das auch in der Befehlszeile?

Siehe auch https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Besonderheit_des_Error-Reading
Ja die Meldung habe ich alle paar Minuten einmal... Keine Ahnung was sie bedeutet

Wenn ich set Buderus RoomTemporaryDesiredTemp 16 in die Befehlszeile eingebe kommt 16 und im eventmonitor steht
2018-10-17 17:09:15 BDKM Buderus RoomTemporaryDesiredTemp: 16
also ohne Fehler anscheinend...

Otto123

Gut meine Idee war offenbar verkehrt - das Gerät kann offenbar das was Du willst. Geht denn der Befehl so wie er ist in der FHEm Kommandozeile?

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

#5
Zitat von: Otto123 am 17 Oktober 2018, 17:14:55
Geht denn der Befehl so wie er ist in der FHEm Kommandozeile?

Gruß Otto
Siehe mein edit
Zitat von: Tabularasa am 17 Oktober 2018, 17:05:46

Wenn ich set Buderus RoomTemporaryDesiredTemp 16 in die Befehlszeile eingebe kommt 16 und im eventmonitor steht
2018-10-17 17:09:15 BDKM Buderus RoomTemporaryDesiredTemp: 16
also ohne Fehler anscheinend...
Befehlszeile=Kommandozeile

Würde ich das in die Kommandozeile eingeben?
ZitatBesonderheit des Error-Reading
Das Reading "error" enthält Fehlermeldungen oder Rückgabewerte von Befehlen, die nicht 0, "", undef. also logisch "falsch" entsprechen. Die Ausführung des Befehls

({my $var = 1})
setzt das Error-Reading

error      {my $var =1 }: 1
Diese falsche Fehlermeldung kann vermieden werden, durch Erzeugen eines Rückgabewertes, der logisch "falsch" entspricht.

({my $var = 1;; 0})
Die mit ";; 0" angehängte Null verhindert das Setzen des Error-Readings.
und wie kann ich das rückgängig machen falls es dadurch nicht weg ist? Bzw hat das nur auf dieses DOIF Auswirkungen?

Otto123

#6
Uih, da hab ich keine Idee. Du kannst Spasseshalber ein notify machen :)

define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}

Kann aber sein, der Event stimmt so noch nicht.

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

Ellert

Die Beispiele im Wiki sollen nur erläutern, wie der falsche Fehler zu Stande kommt und dass er bei Rückgabe von logisch 0 vermieden wird.

In Deinem Fall müsstest Du set mit der Funktion fhem aufrufen.

(Bedingung) {fhem("set Buderus RoomTemporaryDesiredTemp 17");;undef}

Ggf. kanst Du ein Semikolon weglassen.

Tabularasa

Zitat von: Otto123 am 17 Oktober 2018, 18:11:59
Uih, da hab ich keine Idee. Du kannst Spasseshalber ein notify machen :)

define n_Heizung Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}

Kann aber sein, der Event stimmt so noch nicht.

Gruß Otto
Auch wenn es noch nicht so aussieht, ich glaube mit DOIF komme ich besser klar ;D aber danke
Zitat von: Ellert am 17 Oktober 2018, 18:54:01
Die Beispiele im Wiki sollen nur erläutern, wie der falsche Fehler zu Stande kommt und dass er bei Rückgabe von logisch 0 vermieden wird.

In Deinem Fall müsstest Du set mit der Funktion fhem aufrufen.

(Bedingung) {fhem("set Buderus RoomTemporaryDesiredTemp 17");;undef}

Ggf. kanst Du ein Semikolon weglassen.

OK danke probiere ich morgen gleich aus

Damian

Perl-Modus dürfte unempfindlicher sein:

DOIF {if ([$SELF:warm]) {fhem_set"Buderus RoomTemporaryDesiredTemp 17"}}
attr DOIF_Reading warm:[Buderus:OutdoorTemp]>15
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#10
ZitatAuch wenn es noch nicht so aussieht, ich glaube mit DOIF komme ich besser klar ;D aber danke
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify.  :-\ :-[ :'(

Edit: Sorry da fehlte was Entscheidendes:
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}

Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so  ;)
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

Damian

Zitat von: Otto123 am 17 Oktober 2018, 21:05:47
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify.  :-\ :-[ :'(

Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so  ;)

Dann rate mal, warum ich DOIF_Readings ins Spiel gebracht habe. Als Tipp: Notify leistet nicht das Gewünschte in deiner Definition ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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

Tabularasa

#13
Zitat von: Otto123 am 17 Oktober 2018, 21:05:47
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify.  :-\ :-[ :'(

Edit: Sorry da fehlte was Entscheidendes:
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}

Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so  ;)

Das DOIF war so nicht ganz vollständig. Sondern so
([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)

Wie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
Ich probiere aber die DOIF Variannten von @Ellert und @Damian aber mal aus. Wie würde denn da das DOIF in Perl aussehen? So ungefähr??
{if ([$SELF:warm] and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45 and [07:00-22:00]) {fhem_set"Buderus RoomTemporaryDesiredTemp 17"}}
Elseif (Bedingung) {fhem_set ""}
Elseif {fhem_set"Buderus RoomTemporaryDesiredTemp -1"}

Otto123

#14
Zitat von: Tabularasa am 19 Oktober 2018, 15:55:43
Wie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
Das Schwarze ist die Schrift? Die weiße Zeile mit Code: davor und Inhalt in meinem Post?  :-\
Sorry, hab nicht alles gelesen ...
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

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

Damian

In beiden Fällen hast du so etwas eingebaut:

[":^actuator"]>55

Die Ereignisabfrage liefert nur wahr oder falsch aber keinen Wert.

Solche Verallgemeinerungen funktionieren nicht gut, denn auch wenn es funktionieren würde, wenn irgend ein actuator > 55 meldet und der nächste < 55, ist der vorherige vermutlich immer noch > 55. Da musst du dir etwas anderes überlegen.





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

Tabularasa

#31
Zitat von: Damian am 26 Oktober 2018, 11:21:56
In beiden Fällen hast du so etwas eingebaut:

[":^actuator"]>55

Die Ereignisabfrage liefert nur wahr oder falsch aber keinen Wert.

Ah ok, das erklärt es dann schon einigermaßen
Zitat von: Damian am 26 Oktober 2018, 11:21:56
auch wenn es funktionieren würde, wenn irgend ein actuator > 55 meldet und der nächste < 55, ist der vorherige vermutlich immer noch > 55. Da musst du dir etwas anderes überlegen.

das ist eigentlich auch so gewollt, denn wenn einer noch über >55 liegt ist es nicht warm genug und soll weiter geheizt werden. Kann man nicht auf wahr triggern und so den Zweig auslösen? Wäre meine Lieblingslösung ;D
Eine andere Idee hätte ich noch aber da weiß ich nicht wie ich das hin bekomme und ob es auch so zulässig funktioniert... Also den Durchschnitt aus allen 6 actuator Stellungen bilden und dann > zB 55. Ist das möglich? Aslo zB
DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:((([EZ:actuator]+[WZ:actuator]+[EZ1:actuator]+[WZ1:actuator]+[EZ2:actuator]+[WZ2:actuator])/6)>55)
Ginge das? Kann ich vor act in den DOIF_Reading ENTER drücken, also ein Zeilenumbruch machen oder muss das so in einer Zeile stehen?

Damian

Zitat von: Tabularasa am 26 Oktober 2018, 11:56:07
Ah ok, das erklärt es dann schon einigermaßendas ist eigentlich auch so gewollt, denn wenn einer noch über >55 liegt ist es nicht warm genug und soll weiter geheizt werden. Kann man nicht auf wahr triggern und so den Zweig auslösen? Wäre meine Lieblingslösung ;D
Eine andere Idee hätte ich noch aber da weiß ich nicht wie ich das hin bekomme und ob es auch so zulässig funktioniert... Also den Durchschnitt aus allen 6 actuator Stellungen bilden und dann > zB 55. Ist das möglich? Aslo zB
DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:((([EZ:actuator]+[WZ:actuator]+[EZ1:actuator]+[WZ1:actuator]+[EZ2:actuator]+[WZ2:actuator])/6)>55)
Ginge das?

Das ist trotzdem zu kurzsichtig und der Informationsgehalt geht gegen Null, denn wenn einer >55 meldet und paar Minuten später <55, dann könnte es der selbe sein oder auch ein anderer.

Das kann man elegant mit Aggregationsfunktionen lösen siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation

Dort sind einige Beispiele, die du auf deine Bedürfnisse anpassen kannst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Alles klar. Danke. Ich werde mich mal dran versuchen und melde mich mit einer Lösung oder Frage ;D