Fhem Heizungssteuerung mit Calendar

Begonnen von zweiundzwanzig, 24 Dezember 2015, 13:36:16

Vorheriges Thema - Nächstes Thema

zweiundzwanzig

ich habe eine Menge Räume, die ich auf diese Art- und Weise mittels eines Google Calenders steuern möchte.
Sehe ich das richtig, dass das bei mehreren, sich überschneidenden TErminen für verschiedene Räume nicht geht?
Was wäre die eleganteste Lösung? Ein eigenes notify für ON / OFF pro Raum?

# Kalender so einrichten, dass Termine mit dem Namen von Räumen diese auf Tagestemperatur schalten
define SwitchActorOn notify CGWHausmeisterKalender:modeStarted.* { my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get CGWHausmeisterKalender summary $uid");; if(defined $actor) { fhem("set $actor desiredTemperature 19") } }
attr SwitchActorOn verbose 5

define SwitchActorOff notify CGWHausmeisterKalender:modeEnded.* { my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get CGWHausmeisterKalender summary $uid");; if(defined $actor) { fhem("set $actor desiredTemperature 15") } }
attr SwitchActorOff verbose 5
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden

Ellert

Schreibe doch statt Deiner Angaben den kompletten Befehl in den Kalender, dann benötigst Du nur ein notify und führst den kompletten Befehl aus { fhem($action) }. Dann bist Du nicht auf bestimmte Geräte und Parameter festgelegt.


zweiundzwanzig

Der Kalender muss von ganz normalen :-) Menschen bedient werden. Das klappt leider nicht.
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden

Ellert

ZitatSehe ich das richtig, dass das bei mehreren, sich überschneidenden TErminen für verschiedene Räume nicht geht?

Raum1 7.00 an 22:00 aus
Raum2 7.30 an 22:30 aus

Meinst Du solche Überschneidung? Das dürfte kein Problem sein, wenn jede Zeit eine eigene UID hat.

zweiundzwanzig

#4
Es ging mir um Termine, die zur gleichen Zeit starten oder enden. Die werden im Calendarmodul durch Semikolon getrennt mit ihrer UID angegeben. So geht es. Man muss das EVTPRT1 splitten:

EINTRAG im FhemWebinterface DEF des NOTIFY:
für an:
CGWHausmeisterKalender.modeStarted:.+ {my $reading="$EVTPART0"; my @uids=split(";", "$EVTPART1");foreach my $uid (@uids) {my $actor= fhem("get CGWHausmeisterKalender summary $uid"); if(defined $actor) { fhem("set $actor desiredTemperature comfort") } } }
für aus:
CGWHausmeisterKalender.modeEnded:.+ {my $reading="$EVTPART0"; my @uids=split(";", "$EVTPART1");foreach my $uid (@uids) {my $actor= fhem("get CGWHausmeisterKalender summary $uid"); if(defined $actor) { fhem("set $actor desiredTemperature auto") } } }

Das funktioniert, produziert nur immer noch jedes Mal einen seltsamen Fehler, den ich auf REGEXP-Ebene nicht verstehe...

2015.12.28 09:44:00 3 : get CGWHausmeisterKalender summary rg64i9n80tt3904la1ivjrh554googlecom : Raum_Kaffeebar
2015-12-28 09:44:00 MAX Kaffeebar_1 desiredTemperature auto
2015-12-28 09:44:00 MAX Kaffeebar_3 desiredTemperature auto
2015-12-28 09:44:00 MAX Kaffeebar_2 desiredTemperature auto
2015-12-28 09:44:00 structure Raum_Kaffeebar desiredTemperature auto
2015.12.28 09:44:00 3 : Hausmeister_CalSwitch_On return value: Global symbol "$EVTPART1" requires explicit package name at (eval 163) line 1.
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender changed: rg64i9n80tt3904la1ivjrh554googlecom end
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender lastCheck: 2015-12-28 09:44:00
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeUpcoming:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeAlarm:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeAlarmed:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeAlarmOrStart:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeChanged: rg64i9n80tt3904la1ivjrh554googlecom
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeStart:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeStarted:
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeEnd: p67o9m1ga2rmng3lckh1elhgaggooglecom;rg64i9n80tt3904la1ivjrh554googlecom
2015-12-28 09:44:00 Calendar CGWHausmeisterKalender modeEnded: rg64i9n80tt3904la1ivjrh554googlecom


Hier soll eigentlich nur auf "modeEnded" reagiert werden. Das klappt ja auch, anscheinend wird aber das NOTIFY mit "modeStarted" auch ausgelöst und gibt dann den Fehler mit  "Hausmeister_CalSwitch_On return value: Global symbol "$EVTPART1" requires explicit package name at (eval 163) line 1." zurück. Beim "Anschalten" durch einen Termin passiert das gleiche übrigens umgekehrt.

Ich probiere da jetzt seit 3 Tagen dran rum aber finde keine Lösung.

Ich habe z.B. folgendes im NOTIFY versucht: CGWHausmeisterKalender.modeStarted: .+
und folgendes: CGWHausmeisterKalender.modeStarted:/s.+
und das : CGWHausmeisterKalender.modeStarted:/s(.+)

Dann wird das Notify aber leider gar nicht mehr ausgelöst.
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden

Ellert

#5
ZitatGlobal symbol "$EVTPART1" requires explicit package name at (eval 163) line 1.
deutet daraufhin, dass $EVTPART1 nicht existiert.
Die Ereignissteilvariablen werden nur erzeugt, wenn das Gesamtereignis Leerzeichen enthält. Ist das der Fall?
s. http://fhem.de/commandref_DE.html#notify , 3. Aufzählungspunkt
Zitatmy $reading="$EVTPART0";;
das scheint irgendwie sinnlos, $reading wird nie weiterverarbeitet.

Das Pluszeichen kommt mir fehlplatziert vor, ich sehe sonst nur das Sternzeichen.

zweiundzwanzig

#6
Ich habe jetzt das .+ gegen ..+ ausgetauscht und das funktioniert jetzt. Es gibt keine Fehlermeldungen mehr und modeStarted und modeEnded werden verarbeitet wenn danach eine UID steht. 

Ich verstehe zwar nicht warum dann \s.+ nicht funktioniert hat aber vielleicht kann das ja ein REGEXP-erte erklären? Der REGEXP soll doch nach ".....mode:" erst ein Leerzeichen und dann mindestens ein weiteres Zeichen erkennen. Damit das NOTIFY nur auf modeStarted/Ended reagiert, wenn auch eine UID dahinter steht.

Nebenbei hast du natürlich Recht. "my $reading="$EVTPART0";;" kann man wohl rausnehmen. Das habe ich aus dem Beispiel in der commandref übernommen.
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden

Ellert

ZitatIch habe z.B. folgendes im NOTIFY versucht: CGWHausmeisterKalender.modeStarted: .+
und folgendes: CGWHausmeisterKalender.modeStarted:/s.+
und das : CGWHausmeisterKalender.modeStarted:/s(.+)

Dann wird das Notify aber leider gar nicht mehr ausgelöst.

Nur nebenbei angemerkt: Du hattest nicht \s sondern /s verwendet.

zweiundzwanzig

*facepalm*

Danke für den Hinweis! Schon peinlich aber so lernt man dann halt  :D
2x MAX CuBe mit a-culf im Moritzbetrieb
1x MAX CuBe mit a-culf im Homematicbetrieb
60x MAX Heizkörperthermostat plus | 2x HM Schaltaktoren | 1x MAX Wandthermostat
1x FHEM Ubuntu Server auf VMWare
24 Räume, die durch ical Kalender geheizt werden

juelich

Liebe Nutzer von FHEM - ich freue mich, dass FHEM so eine große Nutzergemeinde hat und ständig weiterentwickelt wird. Was ich nicht verstehe, dass plötzlich nach Jahren mit einem Update FHEM so verändert wird, dass viele der bisher verwendeten Scripte nicht mehr funktionieren. Ich bin - wie man hier im Forum liest - nicht der einzige mit diesen Problemen. Ich habe in jahrelanger Fummelarbeit eine für meine Verhältnisse gute Heizungssteuerung über mehrere Googleclander hinbekommen.Plötzlich schaltete keine Heizung mehr, dann wurden keine Emails mehr verschickt, jetzt kommen die Fehlermeldungen, die in diesem Thread beschrieben wurden - muss das alles wirklich sein? Es ist doch nicht jeder der ein bisschen Hausautomatisierung machen will gleich ein PERL-Experte. Undd ann ist die Commandref (auf die ja immer gerne verwiesen wird) in diesem Punkt ja auch nicht eindeutig:

1. So steht tatsächlich:

Achtung: Folgende Vorgehensweise ist abgekündigt, funktioniert bis featurelevel 5.6 und wird in einem zukünftigen Release von FHEM nicht mehr unterstützt. Wenn keine der oben genannten Variablen ($NAME/$EVENT/usw.) in der Anweisung gefunden wird, werden Platzhalter ersetzt.

aber in der Commandref steht weiterhin als Beispiel für das Calendarmodul:

define SwitchActorOn notify MyCalendar:modeStarted.* { my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get MyCalendar summary $uid");; if(defined $actor) { fhem("set $actor on") } }

An diesem Beispiel habe ich mich (und viele andere hier auch!) orientiert:

Kalender_Wohnzimmer:modeStarted.* {
my $reading="$EVTPART0";
my $uid= "$EVTPART1";
my $dtemp;
my $termin= fhem("get Kalender_Wohnzimmer summary $uid");
if (defined($termin)) {
my ($dtemp,undef)= split(/ /,fhem("get Kalender_Wohnzimmer summary $uid"));
fhem("set hz.wohnzimmer desired-temp $dtemp");
log 1, "Temperatur Wohnzimmer $dtemp";}
;;}

Was muss ich denn nun ändern, damit unter FHEM 5.7 der Fehler mit den explicit packages nicht auftaucht?

Ich habe vieles proboert (auch mit ..+ hier aus diesem Thread, es funktioniert bei mir nicht.

Viele Grüße und einen guten Rusch ins neue Jahr

Markus

juelich

Ich habe es mit Hilfe aus dem Forum nun selber hinbekommen:

Das Problem liegt im Calendar-Modul selber. Laut Commandref sollte das Notify eigentlich wie beschrieben nur aktiv werden, wenn ein Termin beginnt. Dem ist aber nicht so, das Notify wird bei jedem Aktualisieren des Kalender aktiviert - mit der Folge, dass ein leeres $EVENT mitgeliefert wird (es ist ja kein aktiver Termin vorhanden) und damit $EVTPART1 nicht definiert ist.
An anderer Stelle im Forum habe ich die dafür nötige Lösung als:

Kalender_Arbeit:modeStarted.*googlecom.* gefunden.
Damit wird das Notify tatsächlich nur einem beginnenden Termin aktiv und die Fehlermeldungen sind verschwunden.
In diesem Sinne

Allen ein frohes und gesundes neues Jahr 2016

Markus