Neues Modul: 57_GCALVIEW Google Kalender Viewer (+Abfall Kalender)

Begonnen von mumpitzstuff, 04 Oktober 2017, 00:02:11

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Okay. Das sieht doch dann schon mal gut aus. Geh mal als pi User ins Verzeichnis /opt/fhem und lass dir mit:
ls -all

die Rechte anzeigen. Bei mir sieht es so aus:


-rw-r--r--  1 fhem dialout   2514 Oct 21 00:14 .gcalcli_cac
e
-rw-------  1 fhem dialout    849 Dec 23 15:52 .gcalcli_oau
h


Bei dir auch?

borsTiHD

Vielen Dank für dein Modul.
Funktioniert super.  ;D

Mach weiter so.  ;)

blasterx

@mumpitzstuff,

ich habe jetzt mal testweise in der 57_GCALVIEW.pm die Einträge zb  in Zeile 222
#my $calList = qx(gcalcli list --noauth_local_webserver < $filename);

in
#my $calList = qx(sudo gcalcli list --noauth_local_webserver < $filename);

geändert wenn ich das bei allen abfrage Befehlen mache
gcalcli list
geht es wunderbar.
Folgendes Problem habe ich aber noch das die Umlaute als Fragezeichen dargestellt werden.
Du hast ja im Modul
use Encode qw(encode_utf8 decode_utf8);

stehen, aber das kann ich nicht mit
use Encode qw(sudo encode_utf8 decode_utf8);

starten da kommt eine Fehlermeldung.
Gruß BlasterX
Gruß-BlasterX

mumpitzstuff

Hmm das mit dem sudo ist komisch. Naja wenns so geht, dann lass es erst mal so.

Bei dem encode kannst du kein sudo verwenden, das ist ein Perl Befehl und kein Shell Aufruf.

Normalerweise müssten alle Umlaute richtig angezeigt werden. Kannst du nähere Angaben machen welche Umlaute das sind und wo diese bei dir genau auftauchen? Im Subject in der Description oder woanders?

Ich hatte aber eigentlich alle Probleme mit Umlauten behoben und habe bisher von niemandem sonst dahingehend noch von Problemen gehört. Hängt das vielleicht mit deinen Änderungen zusammen? Versuch mal dein sudo nur dort zu verwenden, wo du einen gcalcli Aufruf siehst. Bei allen anderen Dingen bringt sudo nichts.

blasterx

#124
@mumpitzstuff,
Die Umlaute sind zb. bei Frühschicht (ü) und Spätschicht (ä) im Reading t_..._summary. Bei  t_..._description Fr?hschicht tritt der Fehler auch auf. Ich habe das sudo nur bei den gcalcli Aufrufen eingetragen.
Was mir noch aufgefallen ist ich habe 2 Schichtkalender einer von mir und einer von meiner Frau, meiner heist Schichten der von meiner Frau Schichten Diana. Wenn ich bei calendarFilter Schichten eingebe werden aber beide Kalender angezeigt kann es sein damit es am Leerzeichen bei Schichten Diana liegt?

Gruß BlasterX
Gruß-BlasterX

mumpitzstuff

Hat noch jemand Probleme bei Umlauten?

Das mit den Umlauten kann ich mir nicht erklären. Dahingehend habe ich Tests gemacht und die funktionieren bei mir. Hast du Warnings im Logfile? Kannst du mal Verbose 5 einstellen und dir die Ausgaben im Logfile ansehen? Entweder sind bei dir die Umlaute ganz komisch encodiert oder Perl Encode/Decode funktioniert nicht richtig. Hast du das Problem auch bei anderen Modulen?

Das mit dem Leerzeichen im Kalender muss ich mir ansehen, das könnte aber tatsächlich ein Bug sein.

blasterx

bei verbose 5steht im log
2017.12.28 12:37:32 5: GC_Mario_Schichten_SetNextTimer: set next timer
2017.12.28 12:37:32 5: GC_Mario_Schichten_DoRun: start running
2017.12.28 12:37:34 5: GC_Mario_Schichten: 2017-12-28 05:20 2017-12-28 06:00 https://www.google.com/calendar/event?eid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Urlaub Schichten xxxxxxxxxx@googlemail.com
2017-12-28 07:30 2017-12-28 16:00 https://www.google.com/calendar/event?eid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Fr?hschicht Schichten Diana xxxxxxxx@googlemail.com


Die xxx sind von mir eingesetzt worden.
In anderen Modulen habe ich keine Probleme mit Umlauten.

Gruß BlasterX
Gruß-BlasterX

mumpitzstuff

Also meine Vermutung ist, dass bereits gcalcli nur diese Fragezeichen an mein Modul weiter reicht. In diesem Fall wären mir die Hände gebunden. Kannst du bitte mal gucken, ob diese Fragezeichen auch auf dem Terminal angezeigt werden?

gcalcli agenda --detail_all --tsv

sollte dir die Termine der nächsten 5 Tage anzeigen. Bekommst du hier ebenfalls Fragezeichen angezeigt?

Wie hast du die Termine in deinem Google Kalender eingetragen? Im Browser oder mit einer speziellen App? Kannst du mal versuchen über deinen Browser einen weiteren Termin mit Umlauten einzutragen und zu gucken, ob hier die selben Probleme auftreten?

blasterx

Ein gesundes neues Jahr!
@mumpitzstuff

ich bin jetzt auf einen Raspberry 3 umgezogen und alles neu aufgesetzt. Jetzt geht alles wie es soll, die Abfrage ohne (sudo) und auch die Umlaute klappen.
Die Sache mit dem (sudo) war ein Rechte Problem beim Raspberry. Und das mit den Umlauten vermute ich damit in der Raspberry Grundeinstellung (raspi config) die Einstellung
(de_DE.UTF-8) nicht richtig gesetzt worden ist.
Danke für Deine Hilfe und Dein tolles Modul!

Gruß BlasterX
Gruß-BlasterX

borsTiHD

#129
Hallo zusammen und noch frohes Neues an alle,  ;D

erstmal sorry für den langen Text, aber ich möchte mein Problem gerne genau beschreiben und hoffe auch das es nicht verwirrend wird.


Ich hab das Modul jetzt einige Tage schon in Betrieb und finde es super.
Bisher bezog sich die Nutzung allerdings nur auf ein Reading, das mir die Termine ausgibt.

Das ganze würde ich jetzt zu einer automatischen Heizungssteuerung bei mir missbrauchen.
Also, ich möchte gerne anhand meiner Termine, die meinen Schichten entsprechen, meine Heizung steuern.
Vorher hab ich das ganze manuell anhand eines Dummy Schalters gelöst, dem ich quasi meine Schicht per Hand sage und er eine Funktion ausführt.
Im Sinne von "setTemp("$profil");" wobei Profil für das Heizungsprofil steht das ich setzen möchte.

Um das ganze jetzt mit deinem Modul zu handhaben, habe ich das Beispiel von "inoma" auf der ersten Seite genutzt:

Zitat von: inoma am 06 November 2017, 22:56:38
Hier mal eine sub, mit der kann man aus dem Kalender-Readings von 'today_00[1-9]_[be]time' sich ein 'at' event generieren. Falls das reading 'today_00[1-9]_summary' mit dem Trigger übereinstimmt, wird das 'at' zum start oder end Zeitpunkt generiert. Über den 2-ten parameter "Start oder Ende" kann man definieren ob das at event am Anfang oder am Ende vom Kalendereintrag generiert werden soll. Das ist case insensitiv wil ich das über lc() konvertiert habe.
Der Trigger muss mit dem Kalendereintrag matchen
Die Action kann dann eine beliebige fhem Aktion sein, hier wird der Schalter_Heizung eingeschaltet.

Ich bin kein Perl experte, geht bestimmt schöner, aber funktioniert bei mir.


##########################################################
# define GoogleCalendar_n notify GoogleCalendar:today_00[1-9]_[be]time:.* {Kalenderstart("$EVENT","Start oder Ende","Trigger","Action")}
# define GoogleCalendar_n notify GoogleCalendar:today_00[1-9]_[be]time:.* {Kalenderstart("$EVENT","Start","Besuch kommt","set Schalter_Heizung on")}
# define GoogleCalendar_n notify GoogleCalendar:today_00[1-9]_[be]time:.* {Kalenderstart("$EVENT","Ende","Besuch kommt","set Schalter_Heizung off")}
##########################################################
sub Kalenderstart ($$$$) {
  my ($Event,$StartOrEnd,$Trigger,$Action) = @_;
  my $startlcend = lc($StartOrEnd);
  my @EVENTarray = split(": ", $Event);
  my @EVENTsplit = ($startlcend eq "begin" || $startlcend eq "start" || $startlcend eq "anfang")?split("btime", $EVENTarray[0]):split("etime", $EVENTarray[0]);
  my $summary    = $EVENTsplit[0]."summary";
  my $Kalendertext = ReadingsVal("GoogleCalendar","$summary","nA");
  my @Triggerarray = ("0","1","2");
  my @Triggerarray = split(" ", $Trigger);
  my $devSpec      = $Triggerarray[0]."_".$Triggerarray[1]."_".$Triggerarray[2]."_".$StartOrEnd;
  if ($Kalendertext =~ /$Trigger/) {fhem("defmod $devSpec at $EVENTarray[1]:00 $Action;attr $devSpec room Calendar")}
}



Das habe ich "ein wenig" meinen Bedürfnissen umgebaut.
Derzeit sieht es so aus und beinhaltet ein paar Prüfungen der Variablen:

# Heizung Schichtplansteuerung
##########################################################
# define n_GoogleCalendar_X notify GoogleCalendar:today_00[1-9]_btime:.* {Schichtplansteuerung("$EVENT","Start oder Ende","Trigger","profil")}
# define n_GoogleCalendar_18T notify GoogleCalendar:today_00[1-9]_btime:.* {Schichtplansteuerung("$EVENT","Start","18T","Komfort")}
##########################################################
sub Schichtplansteuerung($$$$) {
  my ($Event,$StartOrEnd,$Trigger,$profil) = @_;
  my $startlcend = lc($StartOrEnd);
  my @EVENTarray = split(": ", $Event);
  my @EVENTsplit = ($startlcend eq "begin" || $startlcend eq "start" || $startlcend eq "anfang")?split("btime", $EVENTarray[0]):split("etime", $EVENTarray[0]);
  my $summary    = $EVENTsplit[0]."summary";
  my $Kalendertext = ReadingsVal("GoogleCalendar","$summary","nA");
  my $Sommer = ReadingsVal("HeizungsProfile","state","nA");
  my @Triggerarray = ("0","1","2");
  my @Triggerarray = split(" ", $Trigger);
  my $devSpec      = $Triggerarray[0]."_".$Triggerarray[1]."_".$Triggerarray[2]."_".$StartOrEnd;
 
  if($Kalendertext = $Trigger){
 
# Variable Prüfen
fhem( "set TelegrammBot message Trigger wurde ausgelöst: $Trigger" );
fhem( "set TelegrammBot message Kalendertext beinhaltet: $Kalendertext" );
fhem( "set TelegrammBot message EVENTsplit0 beinhaltet: $EVENTsplit[0]" );
fhem( "set TelegrammBot message Summary beinhaltet: $summary" );

if($Sommer ne "Sommer"){
setTemp("$profil");
fhem( "set TelegrammBot message ♨ Heizungsprofil wegen Schichtplan umgestellt: $devSpec > $profil eingestellt." );
}
  }
}
# // Heizung Schichtplansteuerung



Derzeit nur folgende drei Notifys eingerichtet zum Testen:
defmod n_GoogleCalendar_18T notify GoogleCalendar:today_00[1-9]_btime:.* {Schichtplansteuerung("$EVENT","Start","18T","Komfort")}
defmod n_GoogleCalendar_A notify GoogleCalendar:today_00[1-9]_btime:.* {Schichtplansteuerung("$EVENT","Start","A","Komfort")}
defmod n_GoogleCalendar_AA notify GoogleCalendar:today_00[1-9]_btime:.* {Schichtplansteuerung("$EVENT","Start","! A !","Komfort")}



Jetzt setze ich bei dem GoogleKalender ein "set update" um meine Events zu provozieren.
Für den heutigen Tag kommen dann folgende Events im Eventmonitor:

2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_bdate: 02.01.2018
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_btime: 00:00
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_daysleft: 0
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_daysleftLong: today
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_edate: 02.01.2018
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_etime: 00:00
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_location: Landgrabenweg 151, 53227 Bonn
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_description:
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_author: borstihd@gmail.com
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_source: Schichtplan
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_sourcecolor: black
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_summary: ! A !
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_timeshort: 00:00 - 00:00
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_weekday: Tuesday
2018-01-02 14:29:19 GCALVIEW GoogleCalendar today_001_url: link



Folgende Ausgaben bekomme ich jetzt mittels Telegramm:

ZitatTrigger wurde ausgelöst: 18T
Kalendertext beinhaltet: 18T
EVENTsplit0 beinhaltet: today_001_
Summary beinhaltet: today_001_summary
Trigger wurde ausgelöst: A
Kalendertext beinhaltet: A
EVENTsplit0 beinhaltet: today_001_
Summary beinhaltet: today_001_summary
Trigger wurde ausgelöst: ! A !
Kalendertext beinhaltet: ! A !
EVENTsplit0 beinhaltet: today_001_
Summary beinhaltet: today_001_summary

Jetzt hoffe ich ihr könnt mir weiterhelfen.
1. Wieso provozieren alle Notifys hier bei "if($Kalendertext = $Trigger)"  einen "Trigger" in der Funktion?
2. Wieso beinhaltet die Variable "Kalendertext" den Wert meines "Triggers", sollte dort drin nicht egt. bei allen drei ausgelösten Notifys der Summary Text aus dem Event stehen (also in meinem Beispiel ein "! A !")?

Könnt ihr mir bitte helfen?
Ich möchte egt das in diesem Beispiel "nur" der dritte Notify mit dem Trigger "! A !" reagiert.

Vielen Dank schonmal.  :)

Grüße
borsTiHD


PS: Meine eigene Funktion wird nicht ausgeführt, da "my $Sommer = ReadingsVal("HeizungsProfile","state","nA");" gleich "Sommer" ist, damit zum testen nicht ständig meine Heizung umgestellt wird.  ;D


mumpitzstuff

Hihi schöner Fehler.

=: Zuweisung
==: Vergleich (aber nur Zahlenwerte!)

Du möchtest an der Stelle Strings vergleichen und musst deshalb eq verwenden.

Versuch mal:

if($Kalendertext eq $Trigger){

Dein Code schreibt in $Kalendertext deinen Trigger rein. Der Wert ist ungleich 0 also immer True...

borsTiHD

Oh mein Gott...  ::)
Ja, jetzt wo du es sagst. *facepalm*

Ich danke dir tausendfach.  ;D
Das ganze jetzt ersetzt mit "eq" und es klappt.
Wenn man vor lauter Wald die Bäume nicht sieht.

Jamo

@borsTiHD

Du hattest mein Beispiel von der ersten seite benutzt:
ZitatUm das ganze jetzt mit deinem Modul zu handhaben, habe ich das Beispiel von "inoma" auf der ersten Seite genutzt:
Da ist noch ein Fehler drin, es werden ja nur 'at' für den jeweiligen Tag erzeugt, wenn Du aber einen Google Kalendereintrag auf 00:00 gesetzt hast, kann es sein das dieser Eintrag verpasst wird weil der Eintrag ja erst 'tomorrow' ist (der trigger ist ja auf GoogleCalendar:today_00[1-9]_[be]time).

1) Der trigger muss auf GoogleCalendar:to.*_00[1-9]_[be]time) geändert werden, damit today und tomorrow berücksichtigt werden
2) Man muss also abfragen ob der Kalendereintrag 'today' ist, dann sollte die startzeit in der Zukunft liegen, wenn der Eintrag 'tomorrow' ist, sollte die Startzeit kleiner als in 'jetzt sein', also: if (($hm lt $EVENTarray[1] && $EVENTarray[0] =~ 'today_.*') || ($hm gt $EVENTarray[1] && $EVENTarray[0] =~ 'tomorrow_.*'))

Ich habe das im Originalpost jetzt geändert.

Du musst auch dran denken das beim 'at' mit mehreren Befehlen das semikolon verdoppelt werden muss, ich habe auch dafür das Beispiel im ersten post geupdatet.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

blasterx

@ mumpitzstuff
hast du Dir das mit den Kalendern mit Leerzeichen mal angesehen bzw eine Lösung für das Problem?
ZitatWas mir noch aufgefallen ist ich habe 2 Schichtkalender einer von mir und einer von meiner Frau, meiner heist Schichten der von meiner Frau Schichten Diana. Wenn ich bei calendarFilter Schichten eingebe werden aber beide Kalender angezeigt kann es sein damit es am Leerzeichen bei Schichten Diana liegt?

Gruß BlasterX
Gruß-BlasterX

mumpitzstuff

Noch nicht, steht aber weiterhin nauf meinem Plan. Mein anderes Modulprojekt hat mich die letzten Tage den letzten Nerv gekostet...