Calendar zur Heizungssteuerung - Notify-Problem...

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

Vorheriges Thema - Nächstes Thema

MatthiasR

Hallo zusammen,

ich habe einen Kalender aufgesetzt, um meine Heizungssteuerung mit Heating Control gezielt zu übersteuern. Den Kalender kann ich problemlos lesen, aber ich habe ein Problem mit den notifys. Hier der Code:


define Kalender_Heizung_aktiv_notify notify Kalender_Heizung:modeStarted.* {\
if (defined %EVTPART1) {\
   fhem("set Kalender_Heizung_aktiv On");;\
   my $summary=fhem("get Kalender_Heizung summary %EVTPART1");;\
   fhem("Set Kalender_Heizung_Temperatur $summary");;\
   Log 1, "Kalender_Heizung aktiv, $summary";;\
  }\
}


Ziel ist es, bei Vorhandensein eines Kalendereintrags die Beschreibung als Temperatur zu übernehmen. Über die beiden dummys Kalender_Heizung_aktiv und Kalender_Heizung_Temperatur möchte ich später (wenn das hier geht) die Ausführung von Heating Control übersteuern.

Ich kriege aber bei dem Code oben im Logfile bei jeder Kalenderaktualisierung ein


2013.04.26 20:58:46 3: Kalender_Heizung_aktiv_notify return value: syntax error at (eval 3869) line 1, near "modeStarted:"
syntax error at (eval 3869) line 1, near "} }"


Ich finde keinen Syntaxfehler (und schon gar nicht zwei). Weiss da jemand Rat?

Danke & Gruß
Matthias

UliM

Hi,
sehe auch keien Fehler. Fang doch mal vereinfacht an a la

define Kalender_Heizung_aktiv_notify notify Kalender_Heizung:modeStarted.* {Log 1, "%EVTPART1"}

und bau's dann nach und nach wieder auf.

Vll kommst Du dem Problem ja dadurch auf die Spur.

Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

stromer-12

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

crissiloop

Hallo,

laut dem Beitrag Link ist die neue Schreibweise "$EVTPART1".
Die Variante mit % sollte wohl auch noch funktionieren. Aber für die Zukunft ist es sicher hilfreich die neue Version zu verwenden.

Aber einen Syntaxfehler wüsste ich jetzt auch nicht, wobei ich da sicher noch kein Experte bin.

Als Hinweis vielleicht auch noch, dass ich meine Notifys immer im DEF-Fenster bearbeite und nicht die fhem.cfg. Damit spare ich mir die doppelten Semikolons und Backslashes am Zeilenende.
Und für meinen Google-Kalender verwende ich folgendes Notify
define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {
Kalenderstart("$EVENT");

Wobei Kalenderstart eine Funktion in meiner 99_MyUtils.pm ist welche mit dem Paramter $EVENT aufgerufen wird.

Gruß Christian
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

Puschel74

Hallo,

entweder hab ich wieder Tomaten auf den Augen oder fehlt hier

define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {
Kalenderstart("$EVENT");


nicht ein } ??

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

crissiloop

natürlich!
Sorry meine Schuld beim Kopieren.
in der fhem.cfg sieht es natürlich so aus:
define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\
Kalenderstart("$EVENT");;\
}
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

sky64

Ich weiß nicht ob es hilft. Bei mir ist die Kalenderabfrage anders aufgebaut.
Ich verwende aber z.Z. auch nur die Information Eintrag "vorhanden" / "nicht vorhanen"
(Das "schicht.ics" liegt lokal auf dem RPi und kann mit Thunderbird bearbeitet werden)

define Schicht Calendar ical url http://192.168.30.64/calendar/schicht.ics 3600
attr Schicht event-on-change-reading modeStarted,modeEnded,modeChanged,modeUpcoming
define check_isSchicht at +*00:05:00 { fhem "set isSchicht ". (ReadingsVal("Schicht","modeStart","") =~ "[0-9]" ? 1: 0 ) }

Das (ReadingsVal("Schicht","modeStart","") liefert die UUID des entsprechenden Kalendereintrags.
Wie man den Inhalt dieses Eintrags bekommt weiß ich leider nicht.
Ein (ReadingsVal("Schicht","19760e4c1e1f4804bbb99bff86ba5ff9","")) liefert bei mir ein leeres Ergebnis.
Wobei ein "get Schicht text 19760e4c1e1f4804bbb99bff86ba5ff9" sehr wohl "27.04.13 08:00 Normal_WE " liefert.

Gruß Ronald

FHEM auf Ubuntu-VM (VMware), Heizung FHEM auf Raspi
Module: Volkszähler, ESPEASY, RFXtrx433, LaCrosseGateway, jeeLink, EMT7110, IRBlaster, LuftdatenInfo, MQTT, ESPDuino, Shelly, Abfallanzeige, (OilFox), Weatherman,  KeyValueProtocol
Modbus für Fronius Gen24-PV incl. ForeCast mit DWD und SolCast

MatthiasR

Hallo zusammen,

vielen Dank allen für die zahlreichen Antworten! Das ist ja wirklich super hier.

Zur richtigen Lösung führt eine gute Kombination aus vielen der Postings.

Aber zunächst mal: bei mir geht $EVTPART1 etc. nicht, ich bekomme immer eine Fehlermeldung a la "explicit package name required". Woran liegt das? - Ich bin vorläufig bei der "%"-Variante geblieben.

Dann ist mir aufgegangen, dass die %... ja durch fhem im Code ersetzt werden, also ein if (defined %EVTPART1) nicht richtig funktionieren kann, denn nach der Ersetzung steht da irgendein Murks.

Dann habe ich gesehen, dass ein Großteil der Probleme daher rührte, dass bei jedem Kalender-Update leere modeStarted und modeEnded - Events kommen (und wahrscheinlich die anderen auch, auf die teste ich aber nicht). Ich habe daher die Regexp auf z.B. Kalender_Heizung:modeStarted.*googlecom.* eingeschränkt. Das beseitigt eine Menge Probleme (oder zumindest vermeintliche) im Logfile.

Die eigentliche Abfrage für modeStarted sieht jetzt so aus:


Kalender_Heizung:modeStarted.*googlecom.* {
  my $uuid = "%EVTPART1";
  my $summary = fhem("get Kalender_Heizung summary $uuid");
  if (defined $summary) {
     fhem("set Kalender_Heizung_Temperatur $summary");
     fhem("set Kalender_Heizung_aktiv On");
     Log 1, "Kalender_Heizung aktiv, Temperatur: $summary degC";
  } else {
     Log 1, "Kalender_Heizung aktiv: FEHLER - summary leer bei UUID $uuid"
  }
}


Und analog für Kalender_Heizung_inaktiv_notify.

Jetzt muss ich nur noch HeatingControl beibiegen, dass es ggf. überschrieben werden kann.

Bis hierher - vielen Dank allen!

Gruß
Matthias

Rohan

Hallo Matthias,

Zitat von: MatthiasR schrieb am So, 28 April 2013 20:42... bei mir geht $EVTPART1 etc. nicht, ich bekomme immer eine Fehlermeldung a la "explicit package name required". Woran liegt das? - Ich bin vorläufig bei der "%"-Variante geblieben. ...

So lange gibt es diese Umstellung noch nicht (wobei die "alte" Verfahrensweise noch eine beschränkte Zeit unterstützt wird), daher meine Fragen:

- Welche Fhem-Version nutzt du bzw. wann war dein letztes Update?

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

MatthiasR

Hi Thomas,

ich habe mir das daraufhin nochmal angeschaut, denn ich bin im Development-Zweig auf der letzten Version von gestern. Die $-Versionen gehen sehr wohl, also z.B. ein Test:

Kalender_Heizung:modeStarted.*googlecom.* {
  Log 1, "test EVENT:";
  if (defined $EVENT) { Log 1, "EVENT: " . $EVENT; };
  if (defined $NAME) { Log 1, "NAME: " . $NAME; };
  if (defined $EVTPART0) { Log 1, "EVTPART0: " . $EVTPART0; };
  if (defined $EVTPART1) { Log 1, "EVTPART1: " . $EVTPART1; };
}


Wenn ich hier aber eine Zeile

 if (defined $EVTPART2) { Log 1, "EVTPART2: " . $EVTPART2; };


hinzufüge, schlägt die gesamte Ausführung mit diesem ominösen Kalender_Heizung_test_notify return value: Global symbol "$EVTPART2" requires explicit package name at (eval 290) line 1. fehl.

Wie kann man denn prüfen, ob die genannte Variable existiert oder nicht? if (defined $xxx) scheint ja gerade nicht zu funktionieren!

Danke & Gruß
Matthias

crissiloop

Hallo Matthias,

also $EVTPART2 gibt es beim Ereignis eines Kalenders nicht.
Das EVTPART trennt das EVENT bei vorhandenen Leerzeichen auf. Und beim Kalenderereignis sind nur 2 Parts vorhanden. Wie es bei anderen Ereignissen ausschaut weiß ich aber nicht.

Die Frage ist doch aber, ob diese Abfrage überhaupt notwendig ist? Denn dein Notify löst doch sowieso nur aus, wenn ein Ereignis vom Typ modeStarted auftritt.
Nach Hinweisen im Forum trenne ich mein $EVENT selber in die Teile auf:

my @Ereignisarray = split(/.*:\s/,$EVENT);
        my $Ereignisteil1 = $Ereignisarray[1];
        Log 3, "Eventpart 1: $Ereignisteil1";


Klappt bei mir in meiner 99_myUtils.pm bisher problemlos.

Gruß
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

AnonymousHolger

Hallo Matthias,

ich interessiere mich auch gerade für eine Umsetzung verschiedener Heizprofile über Kalendereinträge für verschiedene Räume.

Leider stehe ich aktuell noch sowohl mit der Kalender, als auch mit der Heating_Control Funktion "Auf Kriegsfuss".

Kannst du ggf. einmal, dass was bei dir schon funktioniert (inkl. die Kalender ICS) in den CodeSnippets posten oder als PN  schicken ? Vielleicht platzt bei mir dann endlich der "Anfangsknoten".

Danke

Gruss

Holger

crissiloop

FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

AnonymousHolger


AnonymousHolger

Hallo,

habe noch ein Problem ... :-( ...

Nach FHEM Update und Verwendung des Beispiels von Matthias, bekomme ich jedoch schon beim REreadcfg folgende Fehlermeldungen bzgl. der 57_Calender Moduls :-( ...


Use of uninitialized value in substitution (s///) at ./FHEM/57_Calendar.pm line 347.
Use of uninitialized value $uid in hash element at ./FHEM/57_Calendar.pm line 616.
Use of uninitialized value $uid in hash element at ./FHEM/57_Calendar.pm line 616.
Use of uninitialized value $uid in hash element at ./FHEM/57_Calendar.pm line 616.
Use of uninitialized value $uid in hash element at ./FHEM/57_Calendar.pm line 616.
Use of uninitialized value in numeric ne (!=) at ./FHEM/57_Calendar.pm line 666.
Use of uninitialized value in numeric ne (!=) at ./FHEM/57_Calendar.pm line 666.
Use of uninitialized value in hash element at ./FHEM/57_Calendar.pm line 621.


So wiederholt es sich dann kontinuierlich :-( ... (FHEM Gestern upgedated und neu gestartet - auf FB7390)

Weiterhin möchte ich auch eine sehr einfache Änderung der FHT Programmierung in Zusammenspiel von Calendar Funktion und Home_Control machen.

Plan:
FHTs laufen im Manual Modus (der AutoModus hat eine sinnvolle Grundprogrammierung, für den Fall, dass FHEM mal "Down" ist)
Über Home_Control werden die einzelnen Schaltpunkte definiert (über "desired Temp" zu den definierten Schaltpunkten)
Die Parameter holt sich FHEM - Home_Control aus einer ICS Datei, die für die jeweiligen Tage die Parameter definiert hat.

Die ICS Kalenderdatei erselle ich mir mittels eines Excel DAtei mit Makros.
-> Vorgabe Standard Heizprogramm für Wochentage
-> Vorgabe Heizprogramm für Wochenende / Freie Tage
-> Vorgabe Heizprogramm für Sondereinstellung / Heimarbeit / Gäste /
-> Bei Abwesenheit wird alles auf Nachttemperatur geregelt.
-> Auswertung der Ferien und Feiertagskalender wird mit in die Planung eingebunden.


---> Ergebnis wäre dann eine (oder eine DAtei Pro Zimmer) ICS DAtei die pro Tag den "Home_Control" String im Kalendereintrag Subject verwendet.

D.h. über das parsen der Eintragsubjects soll dann der Home_Control String z.B. für FHT_Wohnzimmer verwendet werden.

Vorteil:
Der Kalender ist z.B. auch standardmässig im Kalender oder Google einsehbar, ohne Zugriff auf FHEM. (z.B von der Arbeit).
Hat damit also auch einen WAF, wenn man als Frau den Syntax versteht.

Was meint Ihr .... ?

Die ganze "Perl" syntax ist mir selbst nach vielen Stunden noch ein Grauss. Über das Excel Programm kann ich für verschiedene Wochen/Monate im Voraus die Programmierung der FHTs planen und auch noch im Kalender darstellen.

Wenn es dann die Möglichkeit gibt die Kalenderseinträge dementsprechend zu tracen, wäre das super ... habe aufgrund der beschriebenen CalenderProbleme aber noch keine Möglichkeit zu prüfen.










Dietmar63

Meinst du Home Control oder Heating_Control?

Home Control kenne 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

AnonymousHolger


Dietmar63

ich würde die HC folgendermaßen  für jeden Raum in der fhem.cfg fest definieren:

define HeizungKueche_wt       Heating_Control HeizungKueche 05:35|25 06:15|22 06:50|18  (heizungAnAus("An", 0))
define HeizungKueche_we       Heating_Control HeizungKueche 06:45|25 07:30|22 09:00|19  (heizungAnAus("An", 1))
define HeizungKueche_uz_wt    Heating_Control HeizungKueche 05:35|25 06:15|22 06:50|16  (heizungAnAus("Ueb", 0))
define HeizungKueche_uz_we    Heating_Control HeizungKueche 06:45|25 07:30|22 08:30|16  (heizungAnAus("Ueb", 1))
define HeizungKueche_Aus      Heating_Control HeizungKueche So|00:05|off                (heizungAnAus("Aus", undef))


bei mir ist die Funktion heizungAus so definiert:

sub heizungAnAus($$) {
   my ($myState,  $testWe) = @_;

   #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");
   }
   $testWe = $we if (!defined($testWe));

   my $state = ReadingsVal("Heizung", "state", "Aus");
   my $ret = ($state eq $myState && $testWe == $we);
   return $ret;
}


so dass immer das Reading des dummys Heizung angibt in welchem Modus die Heizungen laufen sollen.

das dummy Heizung ist so definiert:


define Heizung                dummy
attr   Heizung                icon icoTermHaus
attr   Heizung                room  Wohnzimmer
attr   Heizung                group Commands
attr   Heizung                webCmd Aus:Ueb:An


so ist es mir schon allein über die Oberfläche möglich durch das Ändern des dummys die Heizung in die verschiedenen Modi Aus, (Ueb)ergangszeit bzw. An zu versetzen.

Wenn das über die Oberfläche läuft musst du das dummy nur noch über die Calenderfunktion verändern.
Das Modul Calender kenne ich nicht. Aber die FM deutet darauf hin, dass deine Kalendereinträge nicht richtig geparst werden können. Alle FM beziehen sich auf Abfragen der uid, der zentralen Identifikation eines ical-Kalendereintrags.

Das Problem mußt du also dort bei der Definition der Kalendereinträge suchen.
Probier mal mehr herauszufinden, indem du den loglevel des Calenders auf 3 setzt.
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 Erklärung.

Wenn ich deinen Code richtig interpretiere:
Dummy Heizung kann An / Aus oder Ueb sein
Den Wert Heizung setzt du dann z.B. Manuell oder Kalender
In Abhängigkeit von Status Wochenend oder Feiertag und Satus Heizung, wird eines deiner Heizprofile ausgewählt.

Ist wohl in der Tat der bessere Ansatz, als alle Heizungsparameter im Kalender zu übergeben. Ich übergebe im Kalenderevant dann halt nur die Flags.

Ich definiere mir dann, wie in deinem Beispiel ein paar Standardprofile (Wochentag, WE, Übergangszeit, Abwesend/HeizungAUs), die dann ja nachdem welche Flags (Dummies) gesetzt sind, angezogen werden.

Dann kann ich in meiner KalenderDatei z.B. diese Flags (Dummies) definieren.

Eine Zeile deines Codes verstehe ich jedoch nicht

Heating_Control HeizungKueche So|00:05|off                (heizungAnAus("Aus", undef))

Was bedeuted der So|00:05|off ???? sollte hier nicht immer mir einer Zeit begonnen werden ?



 

Dietmar63

Es handelt sich um die Definition Heizung "Aus".

in der Übersicht hatte ich noch folgendes nicht erklärt.
Es gibt bei mir noch ein notify, das bei eine Änderung des dummys Heizung die Funktion Heating_Control_SetAllTemps() ausführt.

Sie aktualisiert dann alle HC(liegen in Form eines hash vor) und wertet die aktuellen Urzeiten und den dummy-Parameter aus, und setzt die aktull gültige Temperatur.

Im Status Heizung "Aus" wird dann bei mir in der Regel die Temperatur von Sonntag 00:05 Uhr eingestellt, egal wann man das dummy  Heizung "Aus" stellt. Der Eintrag So|00:05|off gilt dann für die ganze Woche. Gleiches gilt dann auch wenn ich die das dummy Heizung wieder "An" stelle. Dann wird die für alle Definitionen gültige Temperatur eingestellt.

define HeizStatus2            notify 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

AnonymousHolger

Hallo Dietmar,

habe nun die ersten Schritte vorgenommen, habe aber wohl noch ein prinzipielles Problem.

Für den Anfang habe ich einmal folgendes definiert:


define FHT_UG_WohnZ_Control heating_control FHT_UG_WohnZ 06:30|24.0|07:30|21.5|15:25|24.0|22:30|19.0
attr FHT_UG_WohnZ_Control room 1_HEIZUNG
attr FHT_UG_WohnZ_Control group HEIZUNGAKTUELL


Erwartungsgemäss sollte also zu den entpsrechenden Schaltzeiten ein Kommando an die FHT abgesetzt werden.

Define scheint korrekt angenommen zu sein (siehe 1.screenshot), aber ich erhalte um 15:25 keine Ansteuerung der FHT_UG_WohnZ :-( (siehe 2.screenshot vom Log).

Wo liegt mein Denkfehler ?

Gruss

Holger

stromer-12

Zitat von: AnonymousHolger schrieb am So, 26 Mai 2013 16:22Für den Anfang habe ich einmal folgendes definiert:


define FHT_UG_WohnZ_Control heating_control FHT_UG_WohnZ 06:30|24.0|07:30|21.5|15:25|24.0|22:30|19.0

Wo liegt mein Denkfehler ?
Zu viele Pipes gesetzt.


define FHT_UG_WohnZ_Control heating_control FHT_UG_WohnZ 06:30|24.0 07:30|21.5 15:25|24.0 22:30|19.0

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

AnonymousHolger

Stimmt ;-) ... Tomaten auf den Augen ;-) .. Danke .... dann mach ich mal weiter und melde mich bei weiteren Problemen  ;-).

AnonymousHolger

Hallo Dietmar,

jetzt habe ich die möglichen Profile für unterschiedliche Randbedingungen eingepflegt

(Gäste da, ZuHause (entgegen der üblichen Arbeitsrhythmen), Homeoffice (Büro auch heizen, ...), Abwesend, und natürlich Wochenend, ...)

Deine Routine für die MyUtils habe ich entsprechend um meine zus. Parameter erweitert.

Scheint zu funktionieren (keine Fehlereinträge).

Das ganze schaut dann in meiner Übersicht folgendermassen aus (siehe Screenshot).

Die Parameter (bis auf Wochenend/Feiertag) kann/will ich manuell (ggf später über Kalenderabfrage) setzen.

Unübersichtlich bleibt aber auf diese Weise aktuell die Info, welches Profil bzgl. der Bedingungen aktiv ist, bzw. Inaktiv ist.

Hast du dafür Tips ?


### Sub Heizungsprofil in 99_MyUtils ReturnValues:
### Heizungsprofil(Jahreszeit(Sommer,Uebergang,Winter), WochenEnd_Feiertag(0,1), Gaeste(Ja,Nein), Homeoffice(Ja,Nein), zuHause (Ja,Nein), Abwesend (Ja,Nein)

############ Start OG GaesteZimmer & Bad Einstellung bei Nutzung (Gaeste = Ja) oder nicht (Gaeste = Nein)
####### Gäste & nichtAbwesend = "G"
define FHT_OG_Bad_Control_G heating_control FHT_OG_Bad 07:00|22.00 09:30|18.0 22:00|21.0 22:30|18.0 (Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
attr FHT_OG_Bad_Control_G room 1_HEIZUNG
attr FHT_OG_Bad_Control_G group HEIZUNGAKTUELL
define FHT_OG_SchlafZ_Control_G heating_control FHT_OG_SchlafZ 07:30|21.0 09:30|18.0 22:00|21.0 22:30|18.0 (Heizungsprofil(undef, undef, "Ja", undef, undef, "Nein"))
attr FHT_OG_SchlafZ_Control_G room 1_HEIZUNG
attr FHT_OG_SchlafZ_Control_G group HEIZUNGAKTUELL
######## keineGäste & nichtAbwesend = "nG"
define FHT_OG_Bad_Control_nG heating_control FHT_OG_Bad 05:00|16.0 (Heizungsprofil(undef, undef, "Nein", undef, undef, "Nein"))
attr FHT_OG_Bad_Control_nG room 1_HEIZUNG
attr FHT_OG_Bad_Control_nG group HEIZUNGAKTUELL
define FHT_OG_SchlafZ_Control_nG heating_control FHT_OG_SchlafZ 05:05|16.0 (Heizungsprofil(undef, undef, "Nein", undef, undef, "Nein"))
attr FHT_OG_SchlafZ_Control_nG room 1_HEIZUNG
attr FHT_OG_SchlafZ_Control_nG group HEIZUNGAKTUELL
############# 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:35|21.5 18:00|14.0 (Heizungsprofil(undef, undef, undef, "Ja", undef, "Nein"))
attr FHT_OG_AZ_Control_H room 1_HEIZUNG
attr FHT_OG_AZ_Control_H group HEIZUNGAKTUELL
####### kein Homeoffice & nichtAbwesend = "nH"
define FHT_OG_AZ_Control_nH heating_control FHT_OG_AZ 05:10|16.0 (Heizungsprofil(undef, undef, undef, "Nein", undef, "Nein"))
attr FHT_OG_AZ_Control_nH room 1_HEIZUNG
attr FHT_OG_AZ_Control_nH group HEIZUNGAKTUELL
############# Ende OG GaesteZimmer & Bad




Dietmar63

Da hast du recht - ich steuere nur zwei Heizungen Küche und Wohnzimmer und habe nicht eine so detailierte Logik nötig.
Es gibt zur Zeit nichts was das darstellen kann.

Da ich der Autor des Moduls HC bin, werde ich mir etwas einfallen lassen.
Eine Idee habe ich schon.

Bei mir sieht die Übersicht so aus:

(siehe Anhang / see attachement)

Den Temeraturwerten kann man nicht ansehen, dass die ensprechenden HC nicht aktiv sind.
Es handelt sich immer um die Temperaturen, die geschaltet wären, wenn die Bedinung true wäre.

Ich könnte den state auf "inactive" setzen, wenn die Bedingung "false" ergibt.
Wenn es funzt 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

Dietmar63

Wie sähe das aus? Das °C stammt von einem stateformat.

 
(siehe Anhang / see attachement)


Ich werde die Änderung noch ein wenig prüfen und dann einchecken.
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

Ich finde .... das sieht sogar sehr gut aus ;-) ....

Da mache ich gerne den BetaTester ;-).

Dietmar63

neue Version von HC eingecheckt - bitte prüfen, ob es ok ist.
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

Super, habs schon installiert.

Aktuell zeigt es für alle meine Profile Inactive an, aber das schiebe ich erst einmal auf meine fehlerhafte Routine in der MyUtils.

Ich werde Morgen noch einmal ausführlicher debuggen und mich dann noch mal melden

Vielen Dank für die schnelle Unterstützung.

Gruss

Holger

AnonymousHolger

Hallo Dietmar,

habe ein einfaches Beispiel definiert:

Dummy "Gaeste" steht auf "Ja" und Dummy "Abwesend" steht auf "Nein".


####### Gäste & nichtAbwesend = "G"
define FHT_OG_Bad_Control_G Heating_Control FHT_OG_Bad 07:00|22.00 09:30|18.0 22:00|21.0 22:30|18.0
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|21.0 09:30|18.0 22:00|21.0 22:30|18.0 ($Gaeste eq "Ja" && $Abwesend eq "Nein")
attr FHT_OG_SchlafZ_Control_G group HEIZUNGAKTUELL
attr FHT_OG_SchlafZ_Control_G room 1_HEIZUNG


Obwohl die FHT_OG_Bad_Control_G aufgrund der fehlenden Bedingung immer active sein sollte, wird es als inactive angezeigt.
Gleiches gilt für FHT_OG_SchlafZ_Control_G für die die Bedingung eigenlich erfüllt sein sollte.

Siehe Screenshot ...


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)

Dietmar63

Gib mal beide Vergleichswerte in in einer Zeile aus. Dann kann man einfacher vergleichen.

  Log 3, "Gaeste---------$G--->$state2";

Bitte für alle State's.

Du musst dann Zeilen mit gleichen Werten finden, obwohl sie es deiner Meinung nach nicht sein sollten.
Es ist manchmal nicht einfach in fhem den bug ohne echten Debugger zu finden.

Ich habe viel probiert, ob man den state für alle möglichen Kombinationsmöglichkeiten von HC korrekt auf active/inaktiv setzen kann.

Es geht nicht:
Das liegt daran, dass HC Perlcode generiert, dem ich(per Analyse) nicht ansehen kann, ob er ausgeführt werden wird.
Der Code wird generiert und an das Perllaufzeitsystem übergeben. Den Rest erledigt Perl.

Jetzt gibt es die Möglichkeit ich lasse den Code in HC so wie er ist(funktioniert in 70% der Fälle), dann wird es aber immer wieder jemanden auffallen, wenn es nicht funktioniert und hier einen Fehler melden, der mit hohem Aufwand bearbeitet werden muss.
Ich denke darüber nach, die Erweiterung zu streichen.

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

Ich habe den Fehler gefunden:

##### 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);

   $WE = $we if (!defined($WE));
   Log 3, "WE-----$we------->$WE";
   my $state1 = ReadingsVal("JahresZeit", "state", "Winter");
   $JZ = $state1 if (!defined($JZ));
   Log 3, "JahresZeit----$JZ-------->$state1";
   my $state2 = ReadingsVal("Gaeste", "state", "Nein");
   $G= $state2 if (!defined($G));
   Log 3, "Gaeste-------$G----->$state2";
   my $state3 = ReadingsVal("Homeoffice", "state", "Nein");
   $HO = $state3 if (!defined($HO));
   Log 3, "HomeOffice-----$HO------->$state3";
   my $state4 = ReadingsVal("ZuHause", "state", "Nein");
   $ZH = $state4 if (!defined($ZH));
   Log 3, "ZuHause-----$ZH------->$state4";
   my $state5 = ReadingsVal("Abwesend", "state", "Nein");
   $AW = $state5 if (!defined($AW));
   Log 3, "Abwesend------$AW------>$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;
}


in der Zeile
my ($JZ, $WE, $G, $HO, $ZH, $AW)  = @_;
fehlt bei dir die Zuweisung: "= @_"

dann greifen die Zeilen
$AW = $state5 if (!defined($AW));

und es wird immer true zurückgegeben.
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,

Vielen Dank für dein Durchhaltevermögen !!

Jetzt läuft es ... und zwar Super !!!

Ich bin total begeistert.

Nun muss ich nur noch die Anbindung vom Kalender machen um die Trigger bzgl. der einzelnen Profile über den Kalender zu setzen.

Auch die Anzeige der aktiven Profile funktioniert mit der aktuellen Version von dir prima (man muss halt immer eine Bedingung definieren).

Jetzt muss ich die ganze Sache noch ein wenig aufräumen.

Logging habe ich auch noch einmal aufgehübscht sodass ich im Log immer genau sehen kann, wann welches Profil gesetzt wurde.


(siehe Anhang / see attachement)


(siehe Anhang / see attachement)