Hauptmenü

FHEM Steuert Heizungen nicht

Begonnen von Tardar, 23 Juni 2018, 19:16:19

Vorheriges Thema - Nächstes Thema

CoolTux

Ich habe meinen Namen gelesen  ;D


Du machst Dir das unnötig selber schwer. Man debugged nie den gesamten Code sondern immer nur Teile.
Versuch doch erstmal nur 2 Zeilen also mit einem DOELSEIF
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Du kombinierst Sachen miteinander, die es nicht gibt:

[ReadingsVal("XMI_158d0002091ead", "state", "")]

Die DOIF-Syntax für Readings lautet aber:

[<DEVICE>:<Reading>]


ReadingsVal("XMI_158d0002091ead", "state", "")

ist dagegen ein Aufruf einer Perl-Funktion, dieser triggert im Gegensatz zu DOIF-Syntax allerdings nicht das DOIF-Modul.

Bevor du weitere vier Tage kämpfst. Nimm dir eine halbe Stunde Zeit und lies dir aufmerksam die Einleitung hier: https://fhem.de/commandref_DE.html#DOIF , denn die hast du offenbar zu schnell überflogen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Oder aber, Sorry Damian, Du baust das ganze als wirkliche 99myUtils und triggerst mit Notify
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 24 Juni 2018, 15:34:37
Oder aber, Sorry Damian, Du baust das ganze als wirkliche 99myUtils und triggerst mit Notify

Das kann er machen, wenn er ohne Zeittrigger auskommt.

Er muss nur beachten, dass auch dort, solche Angaben nicht funktionieren:

[ReadingsVal("XMI_158d0002091ead", "state", "")]

Zeitintervalle in der Syntax:

[08:00-11:59]

nicht existieren.

Und er selbst verhindern muss, dass bei jedem Temperatur-Event ein set-Befehl ausgeführt wird.


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

Tardar

#19
Hey,

ich danke euch allen :)
Grundsätzlich funktioniert es nun (zumindest mit weniger Codezeilen :D).

Allerdings wird der Zeitraum, den ich eingrenzen möchte, falsch interpretiert.

Zwischen 16:00 und 17:59 HEUTE soll die Heizung so geschaltet werden.
Aktuell wird die 16:00 (da sie heute nicht mehr zutreffen kann !?) auf den 25.06. geprüft und die Bedingung trifft nicht.

Ich habe Euch mal einen Screenshot angefügt (Timer 01_c02 wird auf den morgigen, statt den heutigen tag gesetzt).

Weiß da noch wer Rat ? ;)

Damian

#20
Mit der Ausgaben von  "list <dein DOIF-Modul>" in der Kommandozeile kann man mehr erkennen.

Angaben der Art:

[XMI_158d0002091ead:&STATE,""] lassen sich einfach angeben: [XMI_158d0002091ead]

$we and [00:00-07:59] kannst du einfacher angeben [00:00-07:59|WE]

Noch ein Gedanke zu Triggern:

Grundsätzlich triggert alles was in eckigen Klammern vorkommt, soll die Angabe nur abgefragt werden, dann muss man ein Fragezeichen voranstellen z. B.
[?XMI_158d0002091ead]

Na ja, ich wiederhole mich, das habe ich eigentlich doch schon alles in die Commandref geschrieben ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tardar

Zitat von: Damian am 24 Juni 2018, 16:34:17
Mit der Ausgaben von  "list <dein DOIF-Modul>" in der Kommandozeile kann man mehr erkennen.

Angaben der Art:

[XMI_158d0002091ead:&STATE,""] lassen sich einfach angeben: [XMI_158d0002091ead]

$we and [00:00-07:59] kannst du einfacher angeben [00:00-07:59|WE]

Noch ein Gedanke zu Triggern:

Grundsätzlich triggert alles was in eckigen Klammern vorkommt, soll die Angabe nur abgefragt werden, dann muss man ein Fragezeichen voranstellen z. B.
[?XMI_158d0002091ead]

Na ja, ich wiederhole mich, das habe ich eigentlich doch schon alles in die Commandref geschrieben ;)

Ja schon :)
Aber es dürfte doch egal sein, ob ich mit $we & {zeitbereich} prüfe oder wie du es schreibst.
Oder hat das Auswirkungen auf die "Tage" die für die Zeit angenommen werden ?

Hier das aktuelle list:
Internals:
   DEF        ($we and (([XMI_158d0002091ead:&STATE,""] eq "open") or ([XMI_158d00020b5d5e:&STATE,""] eq "open") or ([XMI_158d0002092032:&STATE,""] eq "open") or ([XMI_158d00020b5d5d:&STATE,""] eq "open")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6)
DOELSEIF (($we and [16:00-17:59]) and (([XMI_158d0002091ead:&STATE,""] eq "closed") and ([XMI_158d00020b5d5e:&STATE,""] eq "closed") and ([XMI_158d0002092032:&STATE,""] eq "closed") and ([XMI_158d00020b5d5d:&STATE,""] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
DOELSE (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 30, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 30)
   MODEL      FHEM
   NAME       doif_Heizungssteuerung_Wochenende
   NR         64
   NTFY_ORDER 50-doif_Heizungssteuerung_Wochenende
   STATE      cmd_3
   TYPE       DOIF
   OLDREADINGS:
   READINGS:
     2018-06-24 16:34:20   Device          XMI_158d00020b5d5e
     2018-06-24 16:34:22   cmd             3
     2018-06-24 16:34:22   cmd_event       XMI_158d00020b5d5e
     2018-06-24 16:34:22   cmd_nr          3
     2018-06-24 16:34:22   durchTemp       22.5
     2018-06-24 16:34:20   e_XMI_158d00020b5d5e_STATE close
     2018-06-24 16:34:02   mode            enabled
     2018-06-24 16:34:22   state           cmd_3
     2018-06-24 16:34:02   timer_01_c02    25.06.2018 16:00:00
     2018-06-24 16:34:02   timer_02_c02    24.06.2018 17:59:00
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          $we and ((InternalDoIf($hash,'XMI_158d0002091ead','STATE','""') eq "open") or (InternalDoIf($hash,'XMI_158d00020b5d5e','STATE','""') eq "open") or (InternalDoIf($hash,'XMI_158d0002092032','STATE','""') eq "open") or (InternalDoIf($hash,'XMI_158d00020b5d5d','STATE','""') eq "open"))
     1          ($we and DOIF_time($hash,0,1,$wday,$hms)) and ((InternalDoIf($hash,'XMI_158d0002091ead','STATE','""') eq "closed") and (InternalDoIf($hash,'XMI_158d00020b5d5e','STATE','""') eq "closed") and (InternalDoIf($hash,'XMI_158d0002092032','STATE','""') eq "closed") and (InternalDoIf($hash,'XMI_158d00020b5d5d','STATE','""') eq "closed"))
   days:
   devices:
     0           XMI_158d0002091ead XMI_158d00020b5d5e XMI_158d0002092032 XMI_158d00020b5d5d
     1           XMI_158d0002091ead XMI_158d00020b5d5e XMI_158d0002092032 XMI_158d00020b5d5d
     all         XMI_158d0002091ead XMI_158d00020b5d5e XMI_158d0002092032 XMI_158d00020b5d5d
   do:
     0:
       0          set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6
     1:
       0          set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17
     2:
       0          set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 30, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 30
   helper:
     event      close,no_close: 0
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   XMI_158d00020b5d5e
     timerevent close,no_close: 0
     triggerDev XMI_158d00020b5d5e
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: XMI_158d00020b5d5e
       state: cmd_3
     timerevents:
       close
       no_close: 0
     timereventsState:
       state: close
       no_close: 0
     triggerEvents:
       close
       no_close: 0
     triggerEventsState:
       state: close
       no_close: 0
   internals:
     0           XMI_158d0002091ead:STATE XMI_158d00020b5d5e:STATE XMI_158d0002092032:STATE XMI_158d00020b5d5d:STATE
     1           XMI_158d0002091ead:STATE XMI_158d00020b5d5e:STATE XMI_158d0002092032:STATE XMI_158d00020b5d5d:STATE
     all         XMI_158d0002091ead:STATE XMI_158d00020b5d5e:STATE XMI_158d0002092032:STATE XMI_158d00020b5d5d:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
   localtime:
     0          1529935200
     1          1529855940
   readings:
   realtime:
     0          16:00:00
     1          17:59:00
   time:
     0          16:00:00
     1          17:59:00
   timeCond:
     0          1
     1          1
   timer:
     0          0
     1          0
   timers:
     1           0  1
   trigger:
   triggertime:
     1529855940:
       localtime  1529855940
       hash:
     1529935200:
       localtime  1529935200
       hash:
   uiState:
   uiTable:
Attributes:
   alias      test
   room       01_Logik
   userReadings durchTemp {(((ReadingsNum("Heizung_Computer", "1.ACTUAL_TEMPERATURE", "1000") + ReadingsNum("Heizung_Wohnzimmer", "1.ACTUAL_TEMPERATURE", "1000"))/2)-0.85)}

Damian

     2018-06-24 16:34:22   cmd_event       XMI_158d00020b5d5e
     2018-06-24 16:34:22   cmd_nr          3


Daran siehst du, dass XMI_158d00020b5d5e um 16:34:22 Uhr das Modul getriggert hat und weil es im dritten Zweig vorkommt und die dazugehörige Bedingung zum Triggerzeitpunkt wahr war, der Befehl von cmd_3 ausgeführt wurde. Eigentlich ganz einfach.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tardar

#23
Schon, aber die Triggerzeit liegt doch im geprüften Zeitraum (16:00 - 17:59).
Warum greift da dann das DOELSE (Heizung 30) anstatt der Command zuvor (Heizung 17) ? :)

Timer_01_c02 = 25.06. (morgen, warum nicht heute - zumal morgen kein Wochenende mehr ist ^^ - es soll ja der Zeitraum am Wochenende greifen, da macht das keinen Sinn, dass er von morgen ausgeht  ;D)
Timer_02_c02 = 24.06. (heute - passt)

Damian

ZitatNoch ein Gedanke zu Triggern:

Grundsätzlich triggert alles was in eckigen Klammern vorkommt, soll die Angabe nur abgefragt werden, dann muss man ein Fragezeichen voranstellen z. B.
[?XMI_158d0002091ead]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Und noch eine wichtige Info, die in der Einleitung der Commanref steht:

ZitatZu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

Sicher. Aber bitte vorher:
1. Perl lernen
2. Die komplizierten Sachen in ein ordentliches Perl-Unterprogrammn auslagern, z.B. in der 99_myUtils.pm

Sonst kann das m.E. nichts werden.

LG

pah

Tardar

Hey,

habs jetzt hinbekommen - es läuft.
Nur die Frage die sich mir stellt - ich habe Feiertage mit inkludiert und prüfe mit [Uhrzeit1:Uhrzeit2|WE] in der Bedingung.

In den timern bei den Readings wird allerdings als nächster der morgige Tag angegeben.
Nicht, dass mich das stört, weil die DOIF nur am Wochenende läuft, ist das normal oder lässt sich die Anzeige auf das "nächste Wochenende" setzen ?

Und ja - ich merk, dass ich mich langsam wieder mehr mit Programmierung beschäftigen sollte :)
Danke an alle, die geholfen haben bzw. versucht haben, mir zu helfen :)

Damian

Zitat von: Tardar am 24 Juni 2018, 21:13:44
Hey,

habs jetzt hinbekommen - es läuft.
Nur die Frage die sich mir stellt - ich habe Feiertage mit inkludiert und prüfe mit [Uhrzeit1:Uhrzeit2|WE] in der Bedingung.

In den timern bei den Readings wird allerdings als nächster der morgige Tag angegeben.
Nicht, dass mich das stört, weil die DOIF nur am Wochenende läuft, ist das normal oder lässt sich die Anzeige auf das "nächste Wochenende" setzen ?

Und ja - ich merk, dass ich mich langsam wieder mehr mit Programmierung beschäftigen sollte :)
Danke an alle, die geholfen haben bzw. versucht haben, mir zu helfen :)

Es wird jeden Tag geprüft, ob die Zeitangabe inklusive Wochentage bzw. Feiertage gültig ist und damit ob die Bedingung auf Wahrheit geprüft wird oder nicht, daher steht die Zeitangaben auf dem nächsten Tag.

Als Tipp kann ich nur empfehlen in kleinen Schritten anzufangen, denn zu der typischen sequentiellen Abarbeitung von Befehlen kommen Ereignis- und Zeittrigger hinzu, die man - auch als Programmierer - erst einmal verinnerlichen muss.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF