Hallo zusammen,
ich hab gedacht, dass ich die Steuerung endlich hinbekommen habe ;)
Leider funktioniert es aktuell nicht.
Bevor ich noch Stunden davorsitze und suche - mag jemand von Euch einmal einen Blick auf meine Steuerung (DOIF) werfen ?
Bin zwar noch Neuling, hoffe aber dass Ihr evtl. den Fehler seht :)
my $durchschnittsTemperatur = ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")
my $einFensterOffen = ([XMI_158d0002091ead:state] eq "open" or [XMI_158d00020b5d5e:state] eq "open" or [XMI_158d0002092032:state] eq "open" or [XMI_158d00020b5d5d:state] eq "open")
my $alleFensterGeschlossen = ([XMI_158d0002091ead:state] eq "close" && [XMI_158d00020b5d5e:state] eq "close" && [XMI_158d0002092032:state] eq "close" && [XMI_158d00020b5d5d:state] eq "close")
my $heizungAufSechsGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6)
my $heizungAufSiebzehnGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
my $heizungAufFuenfUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 25); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 25)
my $heizungAufZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 20); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 20)
my $heizungAufVierUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 24); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 24)
my $heizungAufZweiUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 22); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 22)
DOIF ($we)
DOIF ($einFensterOffen)
$heizungAufSechsGrad
DOELSEIF (([00:00-07:59]) && $alleFensterGeschlossen)
$heizungAufSiebzehnGrad
DOELSEIF (([08:00-23:59]) && ($durchschnittsTemperatur >= 24) && $alleFensterGeschlossen)
$heizungAufSiebzehnGrad
DOELSEIF (([08:00-11:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufFuenfUndZwanzigGrad
DOELSEIF (([12:00-14:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufZwanzigGrad
DOELSEIF (([15:00-19:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufVierUndZwanzigGrad
DOELSEIF (([20:00-23:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufZweiUndZwanzigGrad
durchTemp wird aus einem userReading erzeugt:
durchTemp {return ((ReadingsNum("Heizung_Computer", "1.ACTUAL_TEMPERATURE", "1000") + ReadingsNum("Heizung_Wohnzimmer", "1.ACTUAL_TEMPERATURE", "1000"))/2)}
Ich habe die Vermutung, dass Formate nicht ganz passen.
Damit meine ich, dass die durchTemp ein float ist (Bsp. 22.85) und ggf. die Prüfung im DOIF damit nicht richtig umgehen kann.
Ich danke euch =)
Wo hast du das denn stehen?
Du hast bestimmt Fehler im fhem-Log!?
DOIF ist ein fhem-Modul und KEIN perl-Befehl muss also definiert werden und landet dann in der fhem.cfg...
...Variablen deklarieren/definieren und benutzen ist perl -> muss in eine Sub in myUtils etc.
Gemischt wie bei dir gibt es so keine Stelle in fhem wo das so hin kommen kann.
Einsteiger Doku gelesen!?
EDIT: Anmerkung (am Rande) was nutzt du zur Steuerung, also HW!? HW für Heizungssteuerung kann alles/einiges von dem was du per fhem steuerst/steuern willst "selbst" (Wochenprogramm, Fenstererkennung, ...). Was passiert, wenn fhem mal abstürzt, hängt, falsch programmiert wurde oder einfach nur die HW defekt geht?! Dann steuert nichts mehr die Heizung...
Gruß, Joachim
Hey,
aktuell habe ich in einem separaten Raum ein DOIF Device angelegt, indem ich das alles konfiguriert habe.
Im Log sind keine Fehler zu finden.
Ich nutze HMIP Thermostate und Tür- / Fensterkontakte von XIAOMI.
Zur Steuerung nutze ich aktuell nur FHEM und wenn das nicht funktioniert halt manuell am Thermostat oder über die CCU.
Ansonsten keine separate Hardware.
Danke schonmal für deine Mühe
Hi,
Machst Du mal bitte ein list von deinem DOIF Device
Gruß Otto
Zitat von: Otto123 am 23 Juni 2018, 19:42:14
Hi,
Machst Du mal bitte ein list von deinem DOIF Device
Gruß Otto
Hi,
natürlich, gern.
Internals:
CFGFN
DEF my $durchschnittsTemperatur = ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")
my $einFensterOffen = ([XMI_158d0002091ead:state] eq "open" or [XMI_158d00020b5d5e:state] eq "open" or [XMI_158d0002092032:state] eq "open" or [XMI_158d00020b5d5d:state] eq "open")
my $alleFensterGeschlossen = ([XMI_158d0002091ead:state] eq "close" && [XMI_158d00020b5d5e:state] eq "close" && [XMI_158d0002092032:state] eq "close" && [XMI_158d00020b5d5d:state] eq "close")
my $heizungAufSechsGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6)
my $heizungAufSiebzehnGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
my $heizungAufFuenfUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 25); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 25)
my $heizungAufZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 20); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 20)
my $heizungAufVierUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 24); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 24)
my $heizungAufZweiUndZwanzigGrad = (set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 22); (set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 22)
DOIF ($we)
DOIF ($einFensterOffen)
$heizungAufSechsGrad
DOELSEIF (([00:00-07:59]) && $alleFensterGeschlossen)
$heizungAufSiebzehnGrad
DOELSEIF (([08:00-23:59]) && ($durchschnittsTemperatur >= 24) && $alleFensterGeschlossen)
$heizungAufSiebzehnGrad
DOELSEIF (([08:00-11:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufFuenfUndZwanzigGrad
DOELSEIF (([12:00-14:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufZwanzigGrad
DOELSEIF (([15:00-19:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufVierUndZwanzigGrad
DOELSEIF (([20:00-23:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen)
$heizungAufZweiUndZwanzigGrad
MODEL Perl
NAME doif_Heizungssteuerung_Wochenende
NR 1225
NTFY_ORDER 50-doif_Heizungssteuerung_Wochenende
STATE initialized
TYPE DOIF
READINGS:
2018-06-23 19:18:54 durchTemp 22.85
2018-06-23 17:10:32 durchschnittstemperatur 1
2018-06-23 19:18:54 mode enabled
2018-06-23 19:18:54 state initialized
Regex:
attr:
cmdState:
wait:
waitdel:
condition:
0
devices:
helper:
globalinit 1
last_timer 0
sleeptimer -1
itimer:
perlblock:
0 heizungAufZweiUndZwanzigGrad
uiState:
uiTable:
Attributes:
alias Heizungssteuerung Sa-So, Feiertags
room 01_Logik
userReadings durchTemp {return ((ReadingsNum("Heizung_Computer", "1.ACTUAL_TEMPERATURE", "1000") + ReadingsNum("Heizung_Wohnzimmer", "1.ACTUAL_TEMPERATURE", "1000"))/2)}
verbose 5
Sorry , ich kenne mich dem Perl Modell nicht aus. Aber schon zweimal DOIF im Code erscheint mir falsch.
Gruß Otto
Naja... auch mit Perl Modus, muss die Perl Syntax respektiert werden...
Zitat von: amenomade am 23 Juni 2018, 23:18:15
Naja... auch mit Perl Modus, muss die Perl Syntax respektiert werden...
Da hilft nur das Studium der Commandref, sonst ist viel Mühe umsonst. ;)
Zitat von: amenomade am 23 Juni 2018, 23:18:15
Naja... auch mit Perl Modus, muss die Perl Syntax respektiert werden...
Genau und der beginnt schon mal damit {} ::)
Ich habe mir mal ein Beispiel in der Doku (https://commandref.fhem.de/commandref_DE.html#DOIF_Perl_Modus)hergenommen damit ich weiß wie es prinzipiell aussehen muss.
Also mein Tipp: der Perl Block gehört in diese Klammern {<Hier steht Perl>} Das heisst nicht das der Codes dann irgendetwas tut. :o
Und ich würde den Perlcode im DOIF nicht mit den Codeworten DOIF (mehrfach) DOELSEIF usw. (klassische DOIF Zweige) kombinieren. Hab ich so in der Doku nicht gefunden.
Das userReadings ist ja offenbar intakt.
Gruß Otto
Zitat von: Otto123 am 23 Juni 2018, 23:46:34
Genau und der beginnt schon mal damit {} ::)
Ich habe mir mal ein Beispiel in der Doku (https://commandref.fhem.de/commandref_DE.html#DOIF_Perl_Modus)hergenommen damit ich weiß wie es prinzipiell aussehen muss.
Also mein Tipp: der Perl Block gehört in diese Klammern {<Hier steht Perl>} Das heisst nicht das der Codes dann irgendetwas tut. :o
Und ich würde den Perlcode im DOIF nicht mit den Codeworten DOIF (mehrfach) DOELSEIF usw. (klassische DOIF Zweige) kombinieren. Hab ich so in der Doku nicht gefunden.
Das userReadings ist ja offenbar intakt.
Gruß Otto
Genau, das userReading funktioniert - zeigt den korrekten Wert auch in den Readings an.
Habe den Code nochmal angepasst:
Internals:
DEF { # Variablendeklaration
my $durchschnittsTemperatur = ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0");
my $einFensterOffen = (([XMI_158d0002091ead:state] eq "open") or ([XMI_158d00020b5d5e:state] eq "open") or ([XMI_158d0002092032:state] eq "open") or ([XMI_158d00020b5d5d:state] eq "open"));
my $alleFensterGeschlossen = (([XMI_158d0002091ead:state] eq "close") && ([XMI_158d00020b5d5e:state] eq "close") && ([XMI_158d0002092032:state] eq "close") && ([XMI_158d00020b5d5d:state] eq "close"));
my $heizungCAufSechsGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6");
my $heizungWAufSechsGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6");
my $heizungCAufSiebzehnGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17");
my $heizungWAufSiebzehnGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17");
my $heizungCAufFuenfUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 25");
my $heizungWAufFuenfUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 25");
my $heizungCAufZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 20");
my $heizungWAufZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 20");
my $heizungCAufVierUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 24");
my $heizungWAufVierUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 24");
my $heizungCAufZweiUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 22");
my $heizungWAufZweiUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 22");
# Funktionen ausführen
if ($we){
if ($einFensterOffen){
$heizungCAufSechsGrad;
$heizungWAufSechsGrad;
} elsif (([00:00-07:59]) && $alleFensterGeschlossen){
$heizungCAufSiebzehnGrad;
$heizungWAufSiebzehnGrad;
} elsif (([08:00-23:59]) && ($durchschnittsTemperatur >= 24) && $alleFensterGeschlossen){
$heizungCAufSiebzehnGrad;
$heizungWAufSiebzehnGrad;
} elsif (([08:00-11:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufFuenfUndZwanzigGrad;
$heizungWAufFuenfUndZwanzigGrad;
} elsif (([12:00-14:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufZwanzigGrad;
$heizungWAufZwanzigGrad;
} elsif (([15:00-19:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufVierUndZwanzigGrad;
$heizungWAufVierUndZwanzigGrad;
} else (([20:00-23:59]) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufZweiUndZwanzigGrad;
$heizungWAufZweiUndZwanzigGrad;
}
}
}
MODEL Perl
NAME doif_Heizungssteuerung_Wochenende
NR 64
NTFY_ORDER 50-doif_Heizungssteuerung_Wochenende
STATE initialized
TYPE DOIF
OLDREADINGS:
READINGS:
2018-06-24 00:44:26 durchTemp 22.5
2018-06-24 00:44:26 mode enabled
2018-06-24 00:44:26 state initialized
2018-06-24 00:44:26 timer_01_c01 25.06.2018 00:00:00
2018-06-24 00:44:26 timer_02_c01 24.06.2018 07:59:00
2018-06-24 00:44:26 timer_03_c01 24.06.2018 08:00:00
2018-06-24 00:44:26 timer_04_c01 24.06.2018 23:59:00
2018-06-24 00:44:26 timer_05_c01 24.06.2018 08:00:00
2018-06-24 00:44:26 timer_06_c01 24.06.2018 11:59:00
2018-06-24 00:44:26 timer_07_c01 24.06.2018 12:00:00
2018-06-24 00:44:26 timer_08_c01 24.06.2018 14:59:00
2018-06-24 00:44:26 timer_09_c01 24.06.2018 15:00:00
2018-06-24 00:44:26 timer_10_c01 24.06.2018 19:59:00
2018-06-24 00:44:26 timer_11_c01 24.06.2018 20:00:00
2018-06-24 00:44:26 timer_12_c01 24.06.2018 23:59:00
Regex:
condition:
0 # Variablendeklaration
my $durchschnittsTemperatur = ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0");
my $einFensterOffen = ((ReadingValDoIf($hash,'XMI_158d0002091ead','state') eq "open") or (ReadingValDoIf($hash,'XMI_158d00020b5d5e','state') eq "open") or (ReadingValDoIf($hash,'XMI_158d0002092032','state') eq "open") or (ReadingValDoIf($hash,'XMI_158d00020b5d5d','state') eq "open"));
my $alleFensterGeschlossen = ((ReadingValDoIf($hash,'XMI_158d0002091ead','state') eq "close") && (ReadingValDoIf($hash,'XMI_158d00020b5d5e','state') eq "close") && (ReadingValDoIf($hash,'XMI_158d0002092032','state') eq "close") && (ReadingValDoIf($hash,'XMI_158d00020b5d5d','state') eq "close"));
my $heizungCAufSechsGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6");
my $heizungWAufSechsGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 6");
my $heizungCAufSiebzehnGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17");
my $heizungWAufSiebzehnGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17");
my $heizungCAufFuenfUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 25");
my $heizungWAufFuenfUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 25");
my $heizungCAufZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 20");
my $heizungWAufZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 20");
my $heizungCAufVierUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 24");
my $heizungWAufVierUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 24");
my $heizungCAufZweiUndZwanzigGrad = fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 22");
my $heizungWAufZweiUndZwanzigGrad = fhem("set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 22");
# Funktionen ausführen
if ($we){
if ($einFensterOffen){
$heizungCAufSechsGrad;
$heizungWAufSechsGrad;
} elsif ((DOIF_time($hash,0,1,$wday,$hms)) && $alleFensterGeschlossen){
$heizungCAufSiebzehnGrad;
$heizungWAufSiebzehnGrad;
} elsif ((DOIF_time($hash,2,3,$wday,$hms)) && ($durchschnittsTemperatur >= 24) && $alleFensterGeschlossen){
$heizungCAufSiebzehnGrad;
$heizungWAufSiebzehnGrad;
} elsif ((DOIF_time($hash,4,5,$wday,$hms)) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufFuenfUndZwanzigGrad;
$heizungWAufFuenfUndZwanzigGrad;
} elsif ((DOIF_time($hash,6,7,$wday,$hms)) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufZwanzigGrad;
$heizungWAufZwanzigGrad;
} elsif ((DOIF_time($hash,8,9,$wday,$hms)) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufVierUndZwanzigGrad;
$heizungWAufVierUndZwanzigGrad;
} elseif ((DOIF_time($hash,10,11,$wday,$hms)) && ($durchschnittsTemperatur < 24) && $alleFensterGeschlossen){
$heizungCAufZweiUndZwanzigGrad;
$heizungWAufZweiUndZwanzigGrad;
}
}
days:
devices:
0 XMI_158d0002091ead XMI_158d00020b5d5e XMI_158d0002092032 XMI_158d00020b5d5d
all XMI_158d0002091ead XMI_158d00020b5d5e XMI_158d0002092032 XMI_158d00020b5d5d
helper:
globalinit 1
last_timer 12
sleeptimer -1
interval:
0 -1
1 0
10 -1
11 10
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
intervalfunc:
itimer:
localtime:
0 1529877600
1 1529819940
10 1529863200
11 1529877540
2 1529820000
3 1529877540
4 1529820000
5 1529834340
6 1529834400
7 1529845140
8 1529845200
9 1529863140
perlblock:
0
readings:
0 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
realtime:
0 00:00:00
1 07:59:00
10 20:00:00
11 23:59:00
2 08:00:00
3 23:59:00
4 08:00:00
5 11:59:00
6 12:00:00
7 14:59:00
8 15:00:00
9 19:59:00
time:
0 00:00:00
1 07:59:00
10 20:00:00
11 23:59:00
2 08:00:00
3 23:59:00
4 08:00:00
5 11:59:00
6 12:00:00
7 14:59:00
8 15:00:00
9 19:59:00
timeCond:
0 0
1 0
10 0
11 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timer:
0 0
1 0
10 0
11 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1 2 3 4 5 6 7 8 9 10 11
triggertime:
1529819940:
localtime 1529819940
hash:
1529820000:
localtime 1529820000
hash:
1529834340:
localtime 1529834340
hash:
1529834400:
localtime 1529834400
hash:
1529845140:
localtime 1529845140
hash:
1529845200:
localtime 1529845200
hash:
1529863140:
localtime 1529863140
hash:
1529863200:
localtime 1529863200
hash:
1529877540:
localtime 1529877540
hash:
1529877600:
localtime 1529877600
hash:
uiState:
uiTable:
Attributes:
alias Heizungssteuerung Sa-So, Feiertags
room 01_Logik
userReadings durchTemp {return ((ReadingsNum("Heizung_Computer", "1.ACTUAL_TEMPERATURE", "1000") + ReadingsNum("Heizung_Wohnzimmer", "1.ACTUAL_TEMPERATURE", "1000"))/2)}
So dürfte das für PERL ok sein - nach dem,was ich in der Doku gelesen habe-
Jetzt sehe ich auch die programmierten Timer mit Endzeiten:
timer_01_c02 25.06.2018 00:00:00
timer_02_c02 24.06.2018 07:59:00
timer_03_c02 24.06.2018 08:00:00
timer_04_c02 24.06.2018 23:59:00
timer_05_c02 24.06.2018 08:00:00
timer_06_c02 24.06.2018 11:59:00
timer_07_c02 24.06.2018 12:00:00
timer_08_c02 24.06.2018 14:59:00
timer_09_c02 24.06.2018 15:00:00
timer_10_c02 24.06.2018 19:59:00
timer_11_c02 24.06.2018 20:00:00
timer_12_c02 24.06.2018 23:59:00
Nur die Thermostate werden nicht angesteuert.
Wenn ich manuell den Wert setze im FHEM-Command funktioniert es.
Wenn man sich für den Perl-Modus entscheidet, dann sind gewisse Mindestkenntnisse in Programmierung nicht unwichtig.
z. B.
if ($einFensterOffen){
$heizungCAufSechsGrad;
$heizungWAufSechsGrad;
...
Die Angaben beginnend mit $ sind Variablen. Sie beinhalten irgendwelche Werte, die zuvor dort abgelegt wurden. Bei der Angabe z. B. $heizungCAufSechsGrad wird der Inhalt (der Wert) der Variablen zurückgeliefert und nicht mehr. Es wird natürlich zu diesem Zeitpunkt kein fhem-Befehl ausgeführt. Den musst du schon an der Stelle angeben, wo er ausgeführt werden soll. Also
if ($einFensterOffen){
fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6");
fhem("set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 6");
...
Moin,
na bloß gut, das Damian das auch so sieht :D
Ich hatte schon gedacht er hat da was ganz Besonderes eingebaut oder ich habe diese "Funktion von Perl" einfach noch nie gesehen.
Gruß Otto
Im Prinzip geht so etwas über Referenzen auf Subroutinen, aber damit wollen wir an dieser Stelle erst gar nicht anfangen, wenn die Bedeutung einer Variablen noch nicht klar ist. Man kann natürlich für jeden fhem-Aufruf eine eigene Subroutine definieren, was aber in diesem Fall nicht gerade sinnvoll ist, da man sie nur einmal aufruft.
Hi Tardar,
da Du ja nun noch mit CoolTux das Problem structure deiner Fensterkontakte besprochen hast solltest Du vielleicht grundlegend mal sagen:
Liegt Dir die Perl Programmierung oder hast Du Kenntnis in anderen Sprachen?
Willst Du es eher "Abstrakter" also weniger Programm Kauderwelch?
Pack mal Deine Aufgabe in kleine Teilaufgaben und löse die Stück für Stück.
Definiere mal genau was jetzt geht und welche Aufgabe Du dringend lösen willst.
Welche Komponenten spielen eine Rolle und über welche Wege sind die jetzt in FHEM eingebunden.
Diesen völlig wirr erscheinenden Mammut Codeblock hier wird Dir keiner auflösen. Aber bei konkreten Fragen wirst Du auch Hilfe bekommen.
Schau dir die DOIF Dokumentation an (nicht Perl Modell), da stehen für das was Du machen willst, die meisten Dinge in einzelnen Programmzweigen fix und fertig.
Gruß Otto
Grundkenntnisse - das mit den Variablen muss am stundenlangen grübeln gelegen haben - ist ja mittlkerweile der 4. Tag :D (darf man keinem erzählen^^)
Zitat von: Otto123 am 24 Juni 2018, 12:27:26
Hi Tardar,
da Du ja nun noch mit CoolTux das Problem structure deiner Fensterkontakte besprochen hast solltest Du vielleicht grundlegend mal sagen:
Liegt Dir die Perl Programmierung oder hast Du Kenntnis in anderen Sprachen?
Willst Du es eher "Abstrakter" also weniger Programm Kauderwelch?
Pack mal Deine Aufgabe in kleine Teilaufgaben und löse die Stück für Stück.
Definiere mal genau was jetzt geht und welche Aufgabe Du dringend lösen willst.
Welche Komponenten spielen eine Rolle und über welche Wege sind die jetzt in FHEM eingebunden.
Diesen völlig wirr erscheinenden Mammut Codeblock hier wird Dir keiner auflösen. Aber bei konkreten Fragen wirst Du auch Hilfe bekommen.
Schau dir die DOIF Dokumentation an (nicht Perl Modell), da stehen für das was Du machen willst, die meisten Dinge in einzelnen Programmzweigen fix und fertig.
Gruß Otto
Hi, ja - wenn man den Code irgendwie venünftig debuggen könnte und sehen, wo Fehler auftreten sollte das machbar sein.
Da ich nicht weiß ob/wie das geht erschwert das ganze sich enorm.
Habs jetzt rein aus nem DOIF geschrieben, rein ohne PerlCode
Internals:
DEF DOIF ($we and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "open") or ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "open") or ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "open") or ([ReadingsVal("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 ([00:00-07:59]) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
DOELSEIF ($we and ([08:00-23:59]) and ([ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")] >= 24) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
DOELSEIF ($we and ([08:00-11:59]) and ([ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")] < 24) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 25, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 25)
DOELSEIF ($we and ([12:00-14:59]) and ([ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")] < 24) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 20, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 20)
DOELSEIF ($we and ([15:00-19:59]) and ([ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")] < 24) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 24, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 24)
DOELSEIF ($we and ([20:00-23:59]) and ([ReadingsNum("doif_Heizungssteuerung_Wochenende", "durchTemp", "0")] < 24) and (([ReadingsVal("XMI_158d0002091ead", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5e", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d0002092032", "state", "")] eq "closed") and ([ReadingsVal("XMI_158d00020b5d5d", "state", "")] eq "closed")))
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 22, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 22)
DOELSE
(set Heizung_Computer datapoint 1.SET_POINT_TEMPERATURE 17, set Heizung_Wohnzimmer datapoint 1.SET_POINT_TEMPERATURE 17)
MODEL Perl
NAME doif_Heizungssteuerung_Wochenende
NR 64
NTFY_ORDER 50-doif_Heizungssteuerung_Wochenende
STATE initialized
TYPE DOIF
OLDREADINGS:
READINGS:
2018-06-24 14:59:56 durchTemp 22.25
2018-06-24 14:59:56 mode enabled
2018-06-24 14:59:56 state initialized
Regex:
condition:
0
devices:
helper:
globalinit 1
last_timer 0
sleeptimer -1
itimer:
perlblock:
0
uiState:
uiTable:
Attributes:
alias Heizungssteuerung Sa-So, Feiertags
room 01_Logik
userReadings durchTemp {(((ReadingsNum("Heizung_Computer", "1.ACTUAL_TEMPERATURE", "1000") + ReadingsNum("Heizung_Wohnzimmer", "1.ACTUAL_TEMPERATURE", "1000"))/2)-0.85)}
Aber es funktioniert dennoch nicht.
Hab auch kein struct angelegt, daher die vielen Prüfungen in den Bedingungen.
Bin gespannt, ob ich das in diesem Leben noch hinbekomm :-X
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 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.
Oder aber, Sorry Damian, Du baust das ganze als wirkliche 99myUtils und triggerst mit Notify
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.
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 ? ;)
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 ;)
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)}
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.
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)
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]
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.
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
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 :)
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.