Hauptmenü

Google Kalender Problem

Begonnen von mannitb303, 13 Februar 2017, 23:03:54

Vorheriges Thema - Nächstes Thema

mannitb303

Hallo,
wollte nun endlich mein schon laufendes System etwas aufpimpen. Habe also meinen Google Kalender über das Calender Modul und über CALVIEW integriert. Nun habe ich aber das Problem das ich total auf dem Schlauch stehe. Folgendes Problem:
Habe an verschiedenen Tagen in der Woche frei. Habe an verschiedenen Tagen in der Woche einen halben Tag frei und habe natürlich auch mal Urlaub. Mochte an den Tagen die Heizung so steuern das es immer schön warm ist.
Beispiel meines Arbeitsplans: Habe am Dienstag um 15:00 Feierabend, am Donnerstag fange ich um 12:00 an und am Freitag habe ich frei. Habe das soin meinen Kalender eingetragen. Normalerweise geht die Heizung um 8:30 aus (zum Lüften) um 10:00 geht sie auf 18 Grad. Jetzt möchte ich das abhängig davon wie ich arbeiten muss eben anders geregelt wird. Ich habe nun 3 Dummys angelegt eines für Feierabend, Urlaub und Frei nit jeweils ja - nein option. Beim auslesen des Kalenders wird also entsprechend Feierabend auf ja gesetzt. Wie werte ich dieses aber aus innerhalb einer IF ELSE Abfrage? Kann ich nach den define direkt ein IF einbauen oder muss da noch ein notify rein? (define Feierabend_On IF (Feierabend_Dummy:state eq "ja")  )

Danke

Gruss
Stefan

Thorsten Pferdekaemper

Hi,
zu welchem Zeitpunkt werden denn diese Dummys jeweils gesetzt?
Außerdem: Kannst Du Deiner Heizung Wochenpläne oder sowas vorgeben? Allgemein gefragt: Was kann Deine Heizung?
Gruß,
   Thorsten
FUIP

bugster_de

Hi,

ich würde mal sagen du bist initial falsch "abgebogen". Es ist für dich selbst zwar wichtig, welchen Zustand Du hast (Feierabend, Frei, Urlaub). Die Heizung interessiert aber nur der Zustand "heizen" oder "nicht-heizen". Sprich mit deinen drei dummie machst Du dir das Leben vermutlich etwas zu schwer.
Um es aber trotzdem zu lösen, heißt in diesem Fall der Trick Wahrheitstabelle: sprich du mußt alle Kombinationen deiner Dummies darauf prüfen, was denn der abgeleitet Zustand deiner Heizung sein soll

extrem vereinfacht:
if( urlaub || frei || feierabend ) {
heizung = on;
} elsif( heizung && !frei && !feierabend ) {
heizung = off;
} else {
heizung = off;
}


Dieser Code muß per notify bei jeder Zustandsänderung von einem deiner drei dummies dann getriggert werden.

betateilchen

bei meiner Partnerin kommt die Heizungssteuerung auch aus einem Google Kalender.

Dort habe ich das einfach so gelöst, dass jeweils kurz nach Mitternacht für diesen Tag, basierend auf dem eingetragenen "Dienst", mehrere at definiert werden, in denen die Heizungen in Wohnzimmer und Bad an- und abgedreht werden.

"Dienst" ist dabei flexibel zu sehen, da kann natürlich auch "frei" oder "abwesend" stehen, die entsprechende Auswertung erfolgt in einer Funktion innerhalb der 99_myUtils.pm.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mannitb303

Hallo,
danke für eure Antworten.
@ Thorsten: Ja Wochenpläne geht schon, habe die Homematic Heizkörperregler. Möchte es aber über den Kalender machen, da es auch mal kurzfristig zu änderungen kommen kann.

@bugster_de: Klar die Heizung soll nur Heizen aber es hängt ja noch mehr hintendran. Im Moment läuft es so das um 7:00 die Heizung heizt (das es Warm ist wenn ich aufstehe :) )um 8:15 geht die Sonos an als Wecker und die Heiung geht komplet aus zum lüften. Um 9:30 geht die Sonos aus und die Heizung auf 18 Grad da gehe ich ausser Haus. Um 19:15 geht die Heizung auf 22 Grad das wenn ich Feierabend hab um 20:00 es warm ist. Um 0:30 geht die Heizung auf 18 Grad zum schlafen. Im Urlaub bzw. an meinem freien Tag soll es komplett anders gesteuert werden, ebenso am Sonntag und im Urlaub. Ich dachte dabei an eine IF ElSE verknüpfung, alsl IF FREI dann ...... ELSE ...... Was ich nicht verstehe ist das ich ein IF ELSE ja innerhalb eine define machen muss, oder kann ich das ohne define (also z.b deinen Code C&P in die fhem.cfg)? Wenn ich nochmal ein define anlegedann muss es doch über ein notify getriggert werden, d.h der Kalender triggert meinen Dummy ond der Dummy mein notify???

Und wie kann ich die mir alle Readings aus dem Kalender anzeigen lassen, so das ich die Start und Endzeit sehe, bei z.b Arbeiten von 12 - 18 Uhr?

Danke
Bin etwas verwirrt?

Thorsten Pferdekaemper

Hi,
Du verwirrst mich auch. Also ein notify besteht im Wesentlichen aus einem Trigger und einem oder mehreren Befehlen. Dieser Befehl kann auch FHEM-IF enthalten oder Perl-Coding, dann geht das Perl-if.
Ich wollte erstmal mit dem Trigger anfangen, deswegen meine Frage wann denn diese Dummys gesetzt werden. Darauf kann man dann aufbauen.
Gruß,
   Thorsten
FUIP

mannitb303

Hi,

also ich habe folgendes eingebaut:

define Heizung_Feierabend notify Feierabend IF ([Feierabend:state] eq "on") (set KiZi_Clima desired-temp 20,set Wz_Clima desired-temp 22.0,set SchZi_Clima desired-temp 22.0,set Feierabend off)


Wobei Feierabend ein Dummy Schalter On/Off ist. Habe es mal eingebaut wenn ich mal spontan früher Feierabend hab.
Nun möchte ich aber die Termin Start und Endzeit auswerten. Aber was ist die beste Methode? Wie z.b am Donnerstag da fange ich um 12 Uhr an zu arbeiten, also muss ja die Sonos nicht um 8:15 angehen und auch die Heizung muss nicht um 8:15 zum lüften ausgehen. Wenn ich jetzt in den Kalender "Arbeiten 12:00 - 20:00" eintrage, dann weiss FHEM ja nicht was es vor der Zeit machen soll. Also müsste ich doch schauen wann ich Anfange zu Arbeiten und dementsprechend vor 12:00 handeln.....

Gruss
Stefan

betateilchen

Zitat von: mannitb303 am 14 Februar 2017, 21:18:13
Wenn ich jetzt in den Kalender "Arbeiten 12:00 - 20:00" eintrage,


  • Du hast das Prinzip eines elektronischen Kalenders überhaupt nicht verstanden. Man trägt nicht ein "Arbeiten 12:00 - 20:00" sondern "Arbeiten" und legt diesen "Termin" in die passenden Uhrzeiten IM Kalender. Dann weiß FHEM sehr wohl die Start- und Endezeit.
  • Und wenn man das richtig gemacht hat, kann man auch über das Kalendermodul die entsprechenden Zeiten abfragen. Wie das geht, steht in der Dokumentation zum Kalendermodul. Dort sind sogar funktionierende Beispiele für notify drin. UNd auch beschrieben, wie man beispielsweise eine Erinnerung eine bestimmte Zeit VOR Beginn des Termins auswerten kann. Also alles, was Du brauchst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thorsten Pferdekaemper

Ah... Natürlich hatte ich vermutet, dass Stefan genau das gemacht hat und dass diese Dummys dann während der entsprechenden Zeit dann halt "ja" oder "nein" als Wert haben. Meine Frage war darauf ausgerichtet, das zu bestätigen oder eben nicht. Wenn das nicht so ist, dann gibt es tatsächlich ein mehr prinzipielles Problem.
Gruß,
   Thorsten
FUIP

mannitb303

Hi,

natürlich habe ich nicht 12- 20 Arbeiten eingetragen sondern schon in das entspechende Zeitfenster. ;D.Dann muss ich nochmal in der Doku schauen.
Aber zu meinem Beispiel an Donnerstag, wenn ich jetzt Startzeit 12:00 und bei Endzeit 20:00 Arbeiten eintrage. Dann muss es ja eigentlich schon um 8:00 so gesteuert werden das eben die Sonos nicht angeht und die Heizung eben erst um 12:00 runtergeschaltet wird. Kann ich das Stunden vorher schon auswerten oder soll ich dann lieber von 8:00 bis 12:00 Frei eintragen, was ist denn einfacher?

Gruß

Stefan

Otto123

Hallo Stefan,

Kalender kennen Termine und Erinnerung/Alarm. Also Termin um 10:00 Uhr. Du brauchst ein Stunde bis hin - Erinnerung eine Stunde vorher. Erinnerung ist Bestandteil des Termins und kein extra Termin.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Thorsten Pferdekaemper

Hi,
ich weiß zwar nicht, ob das Problem inzwischen gelöst ist, aber ich fand es interessant, da ich mich noch nie mit Calendar und CALVIEW befasst habe.
Soweit ich verstanden habe, geht es darum, irgend etwas zu einer Zeit f(t) auszulösen, wenn im Kalender ein bestimmter Eintrag mit Startzeit t steht, wobei f(t) < t.
Also z.B. f(t) = t - 2 Stunden.
Ich denke mal, dass betateilchens Ansatz für seine Freundin das kann. Also nehmen wir mal an, dass die Termine "Arbeit" heißen. Dann kann man sich so ein Array aller dieser Termine beschaffen:

{split(/;;/,fhem("get testCalendar find Arbeit"))}

Leider scheint diese Liste nicht zeitlich sortiert zu sein. Also muss man sich den nächsten dieser Termine per Perl auswählen. ...dann aus dessen Zeit unser f(t) berechnen und damit ein "at" füttern.

Allerdings erscheint es mir etwas seltsam, dass das so kompliziert ist. Möglicherweise gibt es dazu eine einfachere Lösung...

Gruß,
   Thorsten
FUIP

mannitb303

Hallo,

nach längerem testen und lesen habe ich nun das Beispiel aus der Wiki https://wiki.fhem.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies getestet. Leider passiert gar nichts, außer einer Fehlermeldung im Log.

2017.02.19 23:10:00 5 : Cmd: >{\Kalenderstart("$EVENT");\}<
2017.02.19 23:10:00 1 : ERROR evaluating my $EVENT='start: xxxxgooglecom ';my $NAME='Kalender_Stefan_Arbeit';my $EVTPART1='xxxxgooglecom';my $EVTPART0='start:';my $SELF='Kalender_Stefan_Arbeit_Start';my $TYPE='Calendar';{\Kalenderstart("$EVENT");\}: syntax error at (eval 347) line 1, at EOF
2017.02.19 23:10:00 3 : Kalender_Stefan_Arbeit_Start return value: syntax error at (eval 347) line 1, at EOF

Ich habe das Beispiel so wie es ist genommen, habe den Kalender in den Subroutinen geändert und die Dummys angepasst.

define Kalender_Stefan_Arbeit_Start notify Kalender_Stefan_Arbeit:start:.*googlecom.* {\Kalenderstart("$EVENT");;\}

define Feierabend_Dummy dummy
attr Feierabend_Dummy devStateIcon 1
attr Feierabend_Dummy room Controll
attr Feierabend_Dummy setList ja nein
attr Feierabend_Dummy webCmd ja:nein

Ausserdem habe ich die 99_myUtils.pm erstellt


sub
Kalenderstart ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Stefan_Arbeit summary uid=$uid 1");
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_Dummy ja");
}
if ($Kalendertext =~ /Frei/) {
fhem("set Frei_Dummy ja");
}
if ($Kalendertext =~ /Feierabend/) {
fhem("set Feierabend_Dummy ja");
}
}
}


Habe im Google Kalender dann Start und Endzeit gesetzt und als Beschreibung Feierabend eingetragen. Der Dummy wird aber nicht gesetzt.
Hier nochmal mehr aus dem Log

2017.02.19 23:41:00 5 : Starting notify loop for RG_Kalender_Stefan_Arbeit_Ansicht, 1 event(s), first is Kalender_Stefan_Arbeit_Ansicht.2017.02.19-23:41:00: <html>19.02.2017&nbsp;&nbsp;&nbsp;&nbsp;23:41:00&nbsp;&nbsp;&nbsp;&nbsp; Feierabend</html>
2017-02-19 23:41:00 readingsGroup RG_Kalender_Stefan_Arbeit_Ansicht Kalender_Stefan_Arbeit_Ansicht.2017.02.19-23:41:00: 19.02.2017    23:41:00     Feierabend
2017.02.19 23:41:00 5 : End notify loop for RG_Kalender_Stefan_Arbeit_Ansicht
2017-02-19 23:41:00 CALVIEW Kalender_Stefan_Arbeit_Ansicht 2017.02.19-23:41:00: Feierabend
2017-02-19 23:41:00 CALVIEW Kalender_Stefan_Arbeit_Ansicht today_00123:41:00: Feierabend
2017.02.19 23:41:00 5 : End notify loop for Kalender_Stefan_Arbeit_Ansicht
2017.02.19 23:41:00 5 : Triggering Kalender_Stefan_Arbeit_Start
2017.02.19 23:41:00 4 : Kalender_Stefan_Arbeit_Start exec {\Kalenderstart("$EVENT");;\}
2017.02.19 23:41:00 5 : Cmd: >{\Kalenderstart("$EVENT");\}<
2017.02.19 23:41:00 1 : ERROR evaluating my $NAME='Kalender_Stefan_Arbeit';my $EVENT='start: xxxxgooglecom ';my $EVTPART1='xxxxgooglecom';my $EVTPART0='start:';my $SELF='Kalender_Stefan_Arbeit_Start';my $TYPE='Calendar';{\Kalenderstart("$EVENT");\}: syntax error at (eval 496) line 1, at EOF
2017.02.19 23:41:00 3 : Kalender_Stefan_Arbeit_Start return value: syntax error at (eval 496) line 1, at EOF


Habe keine Idee mehr.....



Otto123

Hi,

wenn ich Dich richtig verstehe ist das der Inhalt Deiner 99_myUtils.pm?
Das wäre dann kompletter Murks :)

Bitte diesen Artikel als Grundlage beachten -> https://wiki.fhem.de/wiki/99_myUtils_anlegen

Jedes Zeichen Semikolon und Klammer sowie die Position Deiner Sub ist wichtig!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

mannitb303

Hi,

ja ist allerdings nur der Teil welchen ich aus der Wiki fur die Dummysteuerung (s.o.) übernommen hab. Die komplette lautet:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub
Kalenderstart ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Stefan_Arbeit summary uid=$uid 1");
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_Dummy ja");
}
if ($Kalendertext =~ /Frei/) {
fhem("set Frei_Dummy ja");
}
if ($Kalendertext =~ /Feierabend/) {
fhem("set Feierabend_Dummy ja");
}
}
}
sub Kalenderende ($) {
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids = split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Stefan_Arbeit summary uid=$uid 1");
if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_Dummy nein");
}
if ($Kalendertext =~ /Frei/) {
fhem("set Frei_Dummy nein");
}
if ($Kalendertext =~ /Feierabend/) {
fhem("set Feierabend_Dummy nein");
}


}
}

1;


Den Code selbst habe ich wie gesagt aus dem Wiki übernommen und auf meinen Kalender angepasst.

Gruß

Stefan