Calendar zur Heizungssteuerung - Notify-Problem...

Begonnen von MatthiasR, 26 April 2013, 21:12:11

Vorheriges Thema - Nächstes Thema

Dietmar63

Ich sehe mir den Fall heute abend nochmals an.
Nach einem Neustart heute morgen hatte ich ein ähnliches Problem. Gestern Abend lief es so wie erwartet.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

mgernoth

Hallo Dietmar,

das setzen von "state" auf "inactive" bereitet Probleme, wenn man in einem Notify, welches auf die Änderung der Bedingung lauscht auch gleich die Temperatur setzen will:


define Steuerung_H_AZ Heating_Control Thermostat_AZ ... (Value("Modus_Heizung") eq "Normal")
...
define Notify_Modus_Heizung_AZ notify Modus_Heizung { if ("$EVENT" eq "Normal") { fhem "set Thermostat_AZ desiredTemperature ".Value("Steuerung_H_AZ") } ... }


Das hat bisher problemlos funktioniert, führt jetzt aber zu:

2013-05-28 16:56:12 MAX Thermostat_AZ desiredTemperature inactive


Kannst Du evtl. die desiredTemperature noch in einem zusätzlichen Reading ablegen, welches auch bei inaktivem Zustand den Temperaturwert enthält?

Danke & Gruß
  Michael

Dietmar63

warum hast du das so gemacht?
die Definition
define Steuerung_H_AZ Heating_Control Thermostat_AZ ... (Value("Modus_Heizung") eq "Normal")

sollte doch von sich aus dafür sorgen, dass
Thermostat_AZ desiredTemperature 20.0
ausgeführt wird. Der notify ist nicht wirklich notwendig.
Was verstehe ich nicht?



Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Hallo Holger,

($Gaeste eq "Ja" && $Abwesend eq "Nein")


kann so nicht funktionieren, weil die Bedingung mit den Variablen $Gaeste und $Abwesend im Kontext von HC zur Ermittlung von active/inactive ausgeführt wird. In diesem Kontext stehen die Variabeln nicht zur Verfügung. Es sollte eingentlich zu einem Fehler kommen, aber bei der Perlfunktion eval ist die strenge Syntaxprüfung abgeschaltet, so dass auch kein Fehler im Log auftaucht.

Es ist nach meiner detailierten Analyse sowieso etwas schwieriger als auf dem ersten Blick gedacht den Status inactive/active in allen Fällen zu ermitteln.

Die Bedingung bzw. das Kommando in HC wird im Kontext fhem aufgerufen:

  if ($command && AttrVal($hash->{NAME}, "disable", 0) == 0) {
    $command =~ s/@/$hash->{DEVICE}/g;
    $command =~ s/%/$newDesTemperature/g;
    $command = SemicolonEscape($command);
    Log $loglevel, $mod."command: $command";
    my $ret  = AnalyzeCommandChain(undef, $command);
    Log 3, "ret------------>$ret";
    Log GetLogLevel($name,3), $ret if($ret);
  }


Entscheidend ist die Zeile
my $ret  = AnalyzeCommandChain(undef, $command);
Sie führt komplexe fhem-Kommandos aus, wie sie beispielsweise auch im at-Kommando angegeben werden können.

In HC wird ein solches Kommando aus der Bedingung bzw. dem Command, das auch eine Perlausdurck sein kann {}
aufgebaut und an AnalyzeCommandChain übergeben.

Um nun active/inactive ermitteln zu können bin ich zunächst auf die Idee gekommen, die Bedingung per Perl-eval Kommando auszuführen, und das Ergebnis nach state zu schreiben. Mir war klar, dass diese Vorgehensweise nur für die Variante Bedingung funktionieren würde - Das stimmt aber auch nur zum Teil, weil in der Bedingung für die korrekte Ermittlung des inactive/active Status nur Konstanten an eine Funktion übergeben werden dürfen. Der Rest muss dann in der Funktion erledigt werden. Also Readings lesen ... .
In Perl-Kommands {} kann man gar nicht mehr ermittlen, ob die Temperatur/Parameter gesetzt wird oder nicht, weil das Parsen des Bedingumgsteils des Perl-Ausdrucks erfolgen müßte - sehr schwer möglich.

Ich werde den Schnellschuss erst einmal wieder zurücknehmen und nachdenken.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Jetzt habe ich es verstanden:

Du kannst es einfacher haben: Ruf einfach Heating_Control_SetAllTemps() auf. Dann wird in allen definierten HC die Temperatur/Parameter gesetzt. Die Erweiterung gibt es noch nicht lange.

Beispiel:

define HeizStatus2            notify Modus_Heizung:.*                          {Heating_Control_SetAllTemps()}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

mgernoth

Hallo Dietmar,

Zitat von: Dietmar63 schrieb am Di, 28 Mai 2013 19:56Jetzt habe ich es verstanden:

Du kannst es einfacher haben: Ruf einfach Heating_Control_SetAllTemps() auf. Dann wird in allen definierten HC die Temperatur/Parameter gesetzt. Die Erweiterung gibt es noch nicht lange.

Super, Danke :-)
Das macht genau das, was ich erreichen will.

Danke (auch für das tolle Modul)
  Michael

AnonymousHolger

Hallo Dietmar,

danke für die Erklärung, auch wenn diese meine Kenntnisse von Perl teilweise übersteigt.

Verstanden habe ich, dass meine Parameterabfrage so von HC nicht ausgewertet werden kann.
Du hattest ja aber einige andere Beispiele für Bedingungen angegeben. Funktionieren diese Beispiele korrekt ?
Dann würde ich bei meiner Erstellung der Bedingungen auf diesen Beispielen aufbauen.

Für mich stellt sich die Frage, ob in dem Zusammenhang dann nur die Anzeige Active / Inactive nicht korrekt funktioniert, oder die generelle Definition von Bedingungen für einzelne Profile.

Kannst du das noch einmal kurz rückmelden ?

Danke für deine Mühen. Das Modul ist wirklich Prima !!!

Gruss

Holger

Dietmar63

folgende Bedingungen sollten funktionieren:
(Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
schick mal den Funktionscode von Heizungsprofil - dann prüfe ich, ob ich etwas finde, das eventuell auch nicht funktioniert.

grundsätzlich problematisch ist Code wie dieser:
(Heizungsprofil($gast, undef, "Ja", undef, undef, "Nein"))
Die Variable $gast ist nicht definiert.

ich habe eine Idee, das Ganze robuster zu gestalten.
Wenn ich es geschafft habe melde ich mich.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

AnonymousHolger

Hallo Dietmar,

anbei meine Routine.

Leider kann es hier noch viele Fehler geben. Bin nicht so Perl fit und hab aktuell keinen Ansatz fürs Debugging ...


##### Meine Routine für Heizungsparameter
sub
Heizungsprofil($$$$$$) {
   my ($JahresZeit,  $Wochentag_Feiertag, $Gaeste, $HomeOffice, $ZuHause, $Abwesend) = @_;#

   #we ermitteln (kopierter Code)
   my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
   my $we = (($wday==0 || $wday==6) ? 1 : 0);
   if(!$we) {
     my $h2we = $attr{global}{holiday2we};
     $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
   }
   $Wochentag_Feiertag = $we if (!defined($Wochentag_Feiertag));

   my $state1 = ReadingsVal("JahresZeit", "state", "Winter");
   my $state2 = ReadingsVal("Gaeste", "state", "Nein");
   my $state3 = ReadingsVal("Homeoffice", "state", "Nein");
   my $state4 = ReadingsVal("ZuHause", "state", "Nein");
   my $state5 = ReadingsVal("Abwesend", "state", "Nein");

   my $ret = ($state1 eq $JahresZeit && $Wochentag_Feiertag == $we && $state2 eq $Gaeste && $state3 eq $HomeOffice && $state4 eq $ZuHause && $state5 eq $Abwesend);
   return $ret;
}
##### Ende Meine Routine für Heizungsparameter

Dietmar63

könnte funktionieren.

ich würde nach jeder Zuweisung den Inhalt der Variablen loggen.
Dann hast du Sicherheit.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

AnonymousHolger

Hallo Dietmar,

mit dem Loggen bin ich noch nicht weitergekommen, wollte aber einmal mit eine "Dummy-Funktion" die Auswahl der Profile testen.

Wenn ich meine Routine zum Debuggen folgendermassen anpasse:

##### Meine Routine für Heizungsparameter
sub
Heizungsprofil($$$$$$) {
    my $ret = ("Sommer", 0, "Ja", "Ja", "Ja", "Nein");
    return $ret;
}
##### Ende Meine Routine für Heizungsparameter


Müsste ich dann nicht testen können, wann die einzelnen Profile aktiv werden  ?

Meine Abfrage der Profile sieht wie folgt aus:

####### Gäste & nichtAbwesend = "G"
define FHT_OG_Bad_Control_G Heating_Control FHT_OG_Bad 07:30|12.0 (Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
attr FHT_OG_Bad_Control_G group HEIZUNGAKTUELL
attr FHT_OG_Bad_Control_G room 1_HEIZUNG
define FHT_OG_SchlafZ_Control_G Heating_Control FHT_OG_SchlafZ 07:30|12.5 (Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
attr FHT_OG_SchlafZ_Control_G group HEIZUNGAKTUELL
attr FHT_OG_SchlafZ_Control_G room 1_HEIZUNG
######## keineGäste & nichtAbwesend = "nG"
define FHT_OG_Bad_Control_nG Heating_Control FHT_OG_Bad 07:30|13.0 (Heizungsprofil(undef, undef, "Nein", undef, undef, "Nein"))
attr FHT_OG_Bad_Control_nG group HEIZUNGAKTUELL
attr FHT_OG_Bad_Control_nG room 1_HEIZUNG
define FHT_OG_SchlafZ_Control_nG Heating_Control FHT_OG_SchlafZ 07:30|13.5 (Heizungsprofil(undef, undef, "Nein", undef, undef, "Nein"))
attr FHT_OG_SchlafZ_Control_nG group HEIZUNGAKTUELL
attr FHT_OG_SchlafZ_Control_nG room 1_HEIZUNG
############# Ende OG GaesteZimmer & Bad

############ Start OG Arbeitszimmer mit und ohne Homeoffice Definition
####### Homeoffice & nichtAbwesend = "H"
define FHT_OG_AZ_Control_H Heating_Control FHT_OG_AZ 07:30|14.0 (Heizungsprofil(undef, undef, undef, "Ja", undef, "Nein"))
attr FHT_OG_AZ_Control_H group HEIZUNGAKTUELL
attr FHT_OG_AZ_Control_H room 1_HEIZUNG
####### kein Homeoffice & nichtAbwesend = "nH"
define FHT_OG_AZ_Control_nH Heating_Control FHT_OG_AZ 07:30|14.5 (Heizungsprofil(undef, undef, undef, "Nein", undef, "Nein"))
attr FHT_OG_AZ_Control_nH group HEIZUNGAKTUELL
attr FHT_OG_AZ_Control_nH room 1_HEIZUNG
############# Ende OG GaesteZimmer & Bad

############ Start UG Definitionen
####### Badezimmer Wochentag & nichtAbwesend = WT
define FHT_UG_Bad_Control_WT Heating_Control FHT_UG_Bad 07:30|15.0 (Heizungsprofil(undef, 0, undef, undef, undef, "Nein"))
attr FHT_UG_Bad_Control_WT group HEIZUNGAKTUELL
attr FHT_UG_Bad_Control_WT room 1_HEIZUNG
####### Badezimmer Wochenend/Feiertag & nichtAbwesend = WE
define FHT_UG_Bad_Control_WE Heating_Control FHT_UG_Bad 07:30|15.5 (Heizungsprofil(undef, 1, undef, undef, undef, "Nein"))
attr FHT_UG_Bad_Control_WE group HEIZUNGAKTUELL
attr FHT_UG_Bad_Control_WE room 1_HEIZUNG

####### Kueche Wochentag & nichtAbwesend = WT
define FHT_UG_Kueche_Control_WT Heating_Control FHT_UG_Kueche 07:30|16.0 (Heizungsprofil(undef, 0, undef, undef, undef, "Nein"))
attr FHT_UG_Kueche_Control_WT group HEIZUNGAKTUELL
attr FHT_UG_Kueche_Control_WT room 1_HEIZUNG
####### Kueche Wochenend/Feiertag & nichtAbwesend = WE
define FHT_UG_Kueche_Control_WE Heating_Control FHT_UG_Kueche 07:30|16.5 (Heizungsprofil(undef, 1, undef, undef, undef, "Nein"))
attr FHT_UG_Kueche_Control_WE group HEIZUNGAKTUELL
attr FHT_UG_Kueche_Control_WE room 1_HEIZUNG


####### KiZi Wochentag & nichtAbwesend = WT
define FHT_UG_KiZi_Control_WT Heating_Control FHT_UG_KiZi 07:30|17.0 (Heizungsprofil(undef, 0, undef, undef, "Nein", "Nein"))
attr FHT_UG_KiZi_Control_WT group HEIZUNGAKTUELL
attr FHT_UG_KiZi_Control_WT room 1_HEIZUNG
####### KiZi Wochentag + ZuHause & nichtAbwesend = WTH
define FHT_UG_KiZi_Control_WTH Heating_Control FHT_UG_KiZi 07:30|17.5 (Heizungsprofil(undef, 0, undef, undef, "Ja", "Nein"))
attr FHT_UG_KiZi_Control_WTH group HEIZUNGAKTUELL
attr FHT_UG_KiZi_Control_WTH room 1_HEIZUNG
####### KiZi WochenEnd/Feiertag & nichtAbwesend = WE
define FHT_UG_KiZi_Control_WE Heating_Control FHT_UG_KiZi 07:30|18.0 (Heizungsprofil(undef, 1, undef, undef, undef, "Nein"))
attr FHT_UG_KiZi_Control_WE group HEIZUNGAKTUELL
attr FHT_UG_KiZi_Control_WE room 1_HEIZUNG

####### SchlafZ & nichtAbwesend
define FHT_UG_SchlafZ_Control Heating_Control FHT_UG_SchlafZ 07:30|18.5 (Heizungsprofil(undef, undef, undef, undef, undef, "Nein"))
attr FHT_UG_SchlafZ_Control group HEIZUNGAKTUELL
attr FHT_UG_SchlafZ_Control room 1_HEIZUNG

####### WohnZ Wochentag & nichtAbwesend & nicht ZuHause= WT
define FHT_UG_WohnZ_Control_WT Heating_Control FHT_UG_WohnZ 07:30|19.0 (Heizungsprofil(undef, 0, undef, undef, "Nein", "Nein"))
attr FHT_UG_WohnZ_Control_WT group HEIZUNGAKTUELL
attr FHT_UG_WohnZ_Control_WT room 1_HEIZUNG
####### WohnZ Wochentag & nichtAbwesend & nicht ZuHause= WTH
define FHT_UG_WohnZ_Control_WTH Heating_Control FHT_UG_WohnZ 07:30|19.5 (Heizungsprofil(undef, 0, undef, undef, "Ja", "Nein"))
attr FHT_UG_WohnZ_Control_WTH group HEIZUNGAKTUELL
attr FHT_UG_WohnZ_Control_WTH room 1_HEIZUNG
####### WohnZ Wochenend/Feiertag & nichtAbwesend = WE
define FHT_UG_WohnZ_Control_WE Heating_Control FHT_UG_WohnZ 07:30|20.0 (Heizungsprofil(undef, 1, undef, undef, undef, "Nein"))
attr FHT_UG_WohnZ_Control_WE group HEIZUNGAKTUELL
attr FHT_UG_WohnZ_Control_WE room 1_HEIZUNG

############ Start Abwesenheits Definition für alle Heizkörper
define FHT_OG_Bad_Control_OFF Heating_Control FHT_OG_Bad 07:30|20.5 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_OG_Bad_Control_OFF group HEIZUNGAKTUELL
attr FHT_OG_Bad_Control_OFF room 1_HEIZUNG
define FHT_OG_SchlafZ_Control_OFF Heating_Control FHT_OG_SchlafZ 07:30|21.0 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_OG_SchlafZ_Control_OFF group HEIZUNGAKTUELL
attr FHT_OG_SchlafZ_Control_OFF room 1_HEIZUNG
define FHT_OG_AZ_Control_OFF Heating_Control FHT_OG_AZ 07:30|21.5 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_OG_AZ_Control_OFF group HEIZUNGAKTUELL
attr FHT_OG_AZ_Control_OFF room 1_HEIZUNG
define FHT_UG_Bad_Control_OFF Heating_Control FHT_UG_Bad 07:30|22.0 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_UG_Bad_Control_OFF group HEIZUNGAKTUELL
attr FHT_UG_Bad_Control_OFF room 1_HEIZUNG
define FHT_UG_Kueche_Control_OFF Heating_Control FHT_UG_Kueche 07:30|22.5 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_UG_Kueche_Control_OFF group HEIZUNGAKTUELL
attr FHT_UG_Kueche_Control_OFF room 1_HEIZUNG
define FHT_UG_KiZi_Control_OFF Heating_Control FHT_UG_KiZi 07:30|23.0 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_UG_KiZi_Control_OFF group HEIZUNGAKTUELL
attr FHT_UG_KiZi_Control_OFF room 1_HEIZUNG
define FHT_UG_SchlafZ_Control_OFF Heating_Control FHT_UG_SchlafZ 07:30|23.5 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_UG_SchlafZ_Control_OFF group HEIZUNGAKTUELL
attr FHT_UG_SchlafZ_Control_OFF room 1_HEIZUNG
define FHT_UG_WohnZ_Control_OFF Heating_Control FHT_UG_WohnZ 07:30|24.0 (Heizungsprofil(undef, undef, undef, undef, undef, "Ja"))
attr FHT_UG_WohnZ_Control_OFF group HEIZUNGAKTUELL
attr FHT_UG_WohnZ_Control_OFF room 1_HEIZUNG


Leider scheint das nicht zu funktionieren. Es scheinen unabhängig vom Return wert Alle Profile "aktiv" (es wird die Temp angezeigt). Im fhem Log finde ich dann praktisch auch für alle Defines den Set Befehl der FHT Temperatur ...

2013.05.30 13:24:38 2: FHT set FHT_OG_AZ desired-temp 14.5
2013.05.30 13:24:38 2: FHT set FHT_UG_Kueche desired-temp 16.0
2013.05.30 13:24:38 2: FHT set FHT_OG_SchlafZ desired-temp 12.5
2013.05.30 13:24:38 2: FHT set FHT_UG_KiZi desired-temp 18.0
2013.05.30 13:24:38 2: FHT set FHT_UG_Kueche desired-temp 16.5
2013.05.30 13:24:38 2: FHT set FHT_UG_Bad desired-temp 15.0
2013.05.30 13:24:38 2: FHT set FHT_OG_AZ desired-temp 14.0
2013.05.30 13:24:39 2: FHT set FHT_UG_KiZi desired-temp 17.0
2013.05.30 13:24:39 2: FHT set FHT_UG_KiZi desired-temp 17.5
2013.05.30 13:24:39 2: FHT set FHT_UG_Bad desired-temp 15.5
2013.05.30 13:24:39 2: FHT set FHT_OG_Bad desired-temp 13.0
2013.05.30 13:24:40 2: FHT set FHT_UG_WohnZ desired-temp 20.0
2013.05.30 13:24:40 2: FHT set FHT_UG_WohnZ desired-temp 19.5
2013.05.30 13:24:40 2: FHT set FHT_UG_SchlafZ desired-temp 23.5
2013.05.30 13:24:40 2: FHT set FHT_OG_SchlafZ desired-temp 21.0
2013.05.30 13:24:40 2: FHT set FHT_UG_Kueche desired-temp 22.5
2013.05.30 13:24:40 2: FHT set FHT_OG_Bad desired-temp 20.5
2013.05.30 13:24:40 2: FHT set FHT_UG_KiZi desired-temp 23.0
2013.05.30 13:24:41 2: FHT set FHT_UG_Bad desired-temp 22.0
2013.05.30 13:24:41 2: FHT set FHT_OG_AZ desired-temp 21.5
2013.05.30 13:24:41 2: FHT set FHT_UG_WohnZ desired-temp 24.0
2013.05.30 13:24:41 2: FHT set FHT_UG_WohnZ desired-temp 19.0


Dietmar63

Deine Dummyfunktion liefert vermutlich immer "true" zurück.

perl hat eine etwas merkwürdige Verschlüsselung für true und false:
http://alvinalexander.com/blog/post/perl/what-values-true-false-perl-if-then-boolean

Deine Zuweisung
my $ret = ("Sommer", 0, "Ja", "Ja", "Ja", "Nein");


wird wahrscheinlich einen Text > "" nach $ret einstellen, so dass zwischen den HC keine Differenzierung stattfinden kann.
Ich würde gleich mit dem Original arbeiten und nach jeder Zuweisung den Wert der geänderten Variabel in Heizungsprofil logen:

Log 3, "state1----------->$state1";
...


ich habe mir für diese immer wieder auftretende Aufgabe  ein Makro im Editor(pspad/windows 7) erstellt.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

AnonymousHolger

Hallo Dieter,

danke für die Geduld.

Ich hab meine Routine schon x-fach umgebaut wegen Fehlermeldungen und wollte daher einfach einmal nur die Parameterrückgabe testen.

Jetzt habe ich einmal die Logs eingebaut und meine ursprüngliche Routine wiederhergestellt.

--> Die einzelnen Parameter werden korrekt gelogged, aber ich weiss nicht, woher die Fehlermeldung kommt :-( ....


##### Meine Routine für Heizungsparameter
sub
Heizungsprofil($$$$$$) {
   my ($JZ, $WE, $G, $HO, $ZH, $AW);
   #we ermitteln (kopierter Code)
   my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
   my $we = (($wday==0 || $wday==6) ? 1 : 0);
   if(!$we) {
     my $h2we = $attr{global}{holiday2we};
     $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
   }
   $WE = $we if (!defined($WE));
   Log 3, "WE------------>$WE";
   my $state1 = ReadingsVal("JahresZeit", "state", "Winter");
   Log 3, "JahresZeit------------>$state1";
   my $state2 = ReadingsVal("Gaeste", "state", "Nein");
   Log 3, "Gaeste------------>$state2";
   my $state3 = ReadingsVal("Homeoffice", "state", "Nein");
   Log 3, "HomeOffice------------>$state3";
   my $state4 = ReadingsVal("ZuHause", "state", "Nein");
   Log 3, "ZuHause------------>$state4";
   my $state5 = ReadingsVal("Abwesend", "state", "Nein");
   Log 3, "Abwesend------------>$state5";
   my $ret = ($state1 eq $JZ && $WE == $we && $state2 eq $G && $state3 eq $HO && $state4 eq $ZH && $state5 eq $AW);
   Log 3, "ret------------>$ret";
   return $ret;
}
##### Ende Meine Routine für Heizungsparameter


Der sich daraus ergebende Log sobald ich einen der Dummies ändere:

2013.05.30 17:50:15 3: WE------------>0
2013.05.30 17:50:15 3: JahresZeit------------>Sommer
2013.05.30 17:50:15 3: Gaeste------------>Ja
2013.05.30 17:50:15 3: HomeOffice------------>Nein
2013.05.30 17:50:15 3: ZuHause------------>Ja
2013.05.30 17:50:15 3: Abwesend------------>Ja
Use of uninitialized value $JZ in string eq at ./FHEM/99_MyUtils.pm line 118.
2013.05.30 17:50:15 3: ret------------>


Aufgrund eines Fehlers in der Routine wird kein sinnvoller Returnvalue definiert :-(

Die Fehlermeldung "Use of unitialized .." bezieht sich auf die folgende Zeile aus der obigen Routine :-( ....


my $ret = ($state1 eq $JZ && $WE == $we && $state2 eq $G && $state3 eq $HO && .........



Dietmar63

ja das stimmt.

es gibt bestimmt einen Aufruf von Heizungsprofil mit undef.
Ein Vergleich mit einer Variablen undef ist nicht möglich und wird mit der fm quittiert.

Weil das bei mir mit der Variablen $WE auch so sein kann, habe ich die Zeile
$WE = $we if (!defined($WE));

eingefügt. Trick 17: Sie sorgt dafür, dass $WE wenn undef übergeben wird, auf $we gesetzt wird. Dauduch wird die spätere Abfrage darauf true.

Du musst diese Mimik für alle mit potenziellem undef übergebenen Variablen ergänzen, nachdem das du das Reading eingelesen hast: $state2 eq $G

my $state2 = ReadingsVal("Gaeste", "state", "Nein");
$G = $state2 if (!defined($G));
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

AnonymousHolger

Hallo Dietmar,

danke für die Info, dann hab ich die Zeile des Codes auch verstanden ;-).

Fehlermeldung ist weg, aber trotz der korrekten Dummystati ergibt meine Routine immer einen RET = 1 ... :-( obwohl eigenlich ein Ret = 0 kommen müsste.

Selbst wenn die Abfrage immer eine eindeutig falsche Erfüllung geben sollte, ist REt immer 1 :-( ..

Aktuelle Abfrage (sollte wenn "Gäste = Ja" und Abwesenheit = "Nein" ein True geben, ansonsten ein "False"


####### Gäste & nichtAbwesend = "G"
define FHT_OG_Bad_Control_G Heating_Control FHT_OG_Bad 07:30|12.0 (Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
attr FHT_OG_Bad_Control_G group HEIZUNG_CONTROL
attr FHT_OG_Bad_Control_G room 1_HEIZUNG

############ Start OG Arbeitszimmer mit und ohne Homeoffice Definition
####### kein Homeoffice & nichtAbwesend = "nH"
define FHT_OG_AZ_Control_nH Heating_Control FHT_OG_AZ 00:10|16.0
attr FHT_OG_AZ_Control_nH group HEIZUNG_CONTROL
attr FHT_OG_AZ_Control_nH room 1_HEIZUNG
############# Ende OG GaesteZimmer & Bad


##### Meine Routine für Heizungsparameter
sub
Heizungsprofil($$$$$$) {
   my ($JZ, $WE, $G, $HO, $ZH, $AW);
   #we ermitteln (kopierter Code)
   my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
   my $we = (($wday==0 || $wday==6) ? 1 : 0);
   if(!$we) {
     my $h2we = $attr{global}{holiday2we};
     $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
   }
   $WE = $we if (!defined($WE));
   Log 3, "WE------------>$WE";
   my $state1 = ReadingsVal("JahresZeit", "state", "Winter");
   $JZ = $state1 if (!defined($JZ));
   Log 3, "JahresZeit------------>$state1";
   my $state2 = ReadingsVal("Gaeste", "state", "Nein");
   $G= $state2 if (!defined($G));
   Log 3, "Gaeste------------>$state2";
   my $state3 = ReadingsVal("Homeoffice", "state", "Nein");
   $HO = $state3 if (!defined($HO));
   Log 3, "HomeOffice------------>$state3";
   my $state4 = ReadingsVal("ZuHause", "state", "Nein");
   $ZH = $state4 if (!defined($ZH));
   Log 3, "ZuHause------------>$state4";
   my $state5 = ReadingsVal("Abwesend", "state", "Nein");
   $AW = $state5 if (!defined($AW));
   Log 3, "Abwesend------------>$state5";
   my $ret = ($state1 eq $JZ && $WE == $we && $state2 eq $G && $state3 eq $HO && $state4 eq $ZH && $state5 eq $AW);
   Log 3, "ret------------>$ret";
   return $ret;
}
##### Ende Meine Routine für Heizungsparameter


Ergebnis: im Log:
2013.05.30 23:38:57 3: WE------------>0
2013.05.30 23:38:57 3: JahresZeit------------>Winter
2013.05.30 23:38:57 3: Gaeste------------>Nein
2013.05.30 23:38:57 3: HomeOffice------------>Nein
2013.05.30 23:38:57 3: ZuHause------------>Ja
2013.05.30 23:38:57 3: Abwesend------------>Nein
2013.05.30 23:38:57 3: ret------------>1


Weiterhin ist mir aufgefallen, dass das (fälschlicherweise) aktive Heatingprofil mit Temperatur angezeigt wird. Die Heating_Control Einträge ganz ohne Bedingung sind aber als "inaktiv" dargestellt und natürlich aktiv.

So jetzt gehts in die Kiste ... vielleicht löst das Bier und der Schlaf die Denkblockade ;-).

Siehe Screenshot

(siehe Anhang / see attachement)