Vergiss nicht zu Tanken...

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

nape1
Beiträge: 246
Registriert: 10.11.2014, 17:26
Wohnort: Kärnten

Re: Vergiss nicht zu Tanken...

Beitrag von nape1 » 24.05.2018, 18:08

Hallo, müsste so passen.
In Zeile 15 wird nur gewartet bis er die Daten fertig geladen hat.

Test mal Und Berichte dann.
LG nape1

Gesendet von meinem WAS-LX1 mit Tapatalk

Golf GTI
Beiträge: 12
Registriert: 22.05.2018, 01:39

Re: Vergiss nicht zu Tanken...

Beitrag von Golf GTI » 24.05.2018, 18:34

hallo geht immer noch nicht bleibt bei zeile 12 If stehen :cry: :cry:

nape1
Beiträge: 246
Registriert: 10.11.2014, 17:26
Wohnort: Kärnten

Re: Vergiss nicht zu Tanken...

Beitrag von nape1 » 24.05.2018, 18:37

Schick mir die ganzen Zeilen noch mal.
Aber bei privater Nachricht. Damit mir hier nicht alles zumüllen.

Gesendet von meinem WAS-LX1 mit Tapatalk

Golf GTI
Beiträge: 12
Registriert: 22.05.2018, 01:39

Re: Vergiss nicht zu Tanken...

Beitrag von Golf GTI » 29.05.2018, 23:36

ldittmar hat geschrieben:Schritt 3: Was steht heute an

Als nächstes sagt das Haus was heute so ansteht und wer Geburtstag hat. Da muss man erst ein bisschen rumspielen, aber das was raus kommt ist ziemlich cool. Das schwierigste war aber meine Frau davon zu überzeugen, die Termine im Kalender einzutragen… anfangs… jetzt meckert sie rum, wenn ich vergesse was einzutragen.

Gebraucht wird:
  • Google Calendar
  • Google Script
Mit Google Script werden die einzelnen Kalendereinträge eingelesen und einmal Täglich (morgens um 4 oder so) in die CCU geschrieben. Es ist ratsam mehrere Kalendern zu führen 1 pro Person + 1 Geburtstagskalender. Klingt kompliziert, aber Google macht das sehr gut und einfach.
Wenn dann die Daten in der CCU sind, kann der Tablet in der Küche mit der XML-Api drauf zugreifen und über Tasker-Sprachausgabe alles sagen.

Umsetzung.
Ich habe mich am Code von dwm orientiert (danke dir), um sämtliche Kalendereinträge in die CCU zu bringen.
Kurz zu Google Calendar: das Ding ist genial einfach zu bedienen. Selbst mit mehreren Kalendern ist es super händelbar. Die Android App ist auch einfach super! Wer es noch nicht probiert hat, sollte es unbedingt tun… selbst meine Frau, die anfangs total dagegen war, nutzt die App regelmäßig und trägt alle Termine rein.

Ich gehe davon aus, dass ihr schon mindestens ein Kalender angelegt habt und lege los… In meinem Beispiel sind es 6 Kalendern ;)

Jetzt die Google Script Seite öffnen und diesen Code eingeben.

Code: Alles auswählen

 function doGet(request) {
  var answer = "";

if (request.parameters.cmd == "all" )
  {
    answer = "person1=" + getEvents('xxxxxxxxxxxx@gmail.com', 'person1');
    answer += ",person2=" + getEvents('xxxxxxxxxxx@gmail.com', 'person2');
    answer += ",kind1=" + getEvents('xxxxxxxxxxx@group.calendar.google.com', 'kind1');
    answer += ",kind2=" + getEvents('xxxxxxxxxxx@group.calendar.google.com', 'kind2');
    answer += ",kind3=" + getEvents('xxxxxxxxxxxxx@group.calendar.google.com', 'kind3');
    answer += ",geburtstage=" + getEvents('xxxxxxxxxxxx.google.com', 'geburtstage');
  }
  else if (request.parameters.cmd == "person1" )
  {
    answer = getEvents('xxxxxxxxxxxx@gmail.com', 'person1');
  }
  else if (request.parameters.cmd == "person2" )
  {
    answer = getEvents('xxxxxxxxxxxxx@gmail.com', 'person2');
  }
  else if (request.parameters.cmd == "kind1" )
  {
    answer = getEvents('xxxxxxxxxxxxxxxxxx@group.calendar.google.com', 'kind1');
  }
  else if (request.parameters.cmd == "kind2" )
  {
    answer = getEvents('xxxxxxxxxxxxxxxxxxxx@group.calendar.google.com', 'kind2');
  }
  else if (request.parameters.cmd == "kind3" )
  {
    answer = getEvents('xxxxxxxxxxxxxxxxx@group.calendar.google.com', 'kind3');
  }
  else if (request.parameters.cmd == "geburtstage" )
  {
    answer = getEvents('xxxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com', 'geburtstage');
  }
  
  return ContentService.createTextOutput(answer);
}

function getEvents(calId, type){
  var cal = CalendarApp.getCalendarById(calId);
  
  var today = new Date();
  today.getTime();
  
  var events = cal.getEventsForDay(today);
  
  var result = "";
  var allDayText = false;
  var first = true;
   
  for (var i=0; i<events.length; i++)
  {
    if (!first)  {
      result = result + ", ";
    }
    
    if(events[i].isAllDayEvent()){      
      if(!allDayText && type != 'geburtstage'){
        result = result + "Heute ist ";
        allDayText = true;
      }
      result = result + events[i].getTitle();
    }else{  
      if(first){
        if(allDayText) {
          result = result + " und ";
        }
        if(type == 'kind1'){
          result = result + " Kind1 hat ";
        }else if(type == 'kind2'){
          result = result + " Kind2 hat ";
        }else if(type == 'kind3'){
          result = result + " Kind3 hat ";
        }
      }
      
      var date = events[i].getStartTime();
      var hour = Utilities.formatDate(date, "MET", "H");
      var min = Utilities.formatDate(date, "MET", "m");
      if(min == 0) {min = "";}
     
      result = result + "um " + hour + " Uhr " + min + " " + events[i].getTitle();
      first = false;
    }    
    
  }
  
  if(result != ""){
    result = result + ". ";
    result = result.replace(/ü/g, 'ue').replace(/ö/g, 'oe').replace(/ß/g, 'ss').replace(/ä/g, 'ae').replace(/Ö/g, 'Oe').replace(/Ü/g, 'ue').replace(/Ä/g, 'ae');
  }
  
  return (result);
}
Dieser Code muss natürlich noch angepasst werden. Die ganzen xxxxxx müssen durch die Google Calendar IDs ersetzt werden. Wo man die ID findet? Ganz einfach… schau mal hier. Beim Ergebnis sollte jeder Mal schauen ob das was raus kommt, das ist was man wirklich hören will. Bedenke dass Satzzeichen von der Sprachausgabe ignoriert werden. Außer ein Punkt! Da macht die Dame mal Pause :P

Zum Testen einfach auf „Veröffentlichen > Als Webapp einrichten“ … oben ist ein Link mit dem ihr es testen könnt.

https://script.google.com/macros/s/fgdf ... ec?cmd=all

Vergiss nicht nach dem exec ein ?cmd=all hinzuzufügen. Jetzt könnt ihr ein bisschen rumspielen.
Der Dateianhang 10-02-_2016_09-18-43.png existiert nicht mehr.
Der Zugriff zu Kalender muss leider auch für anonymer Nutzer sein, denn die CCU kann sich ja nicht einloggen.

Es ist jetzt so… Morgens sollen alle Termine durchgesagt werden. Damit das passiert, muss zuerst ein ganzer Text aufgebaut werden. Das kann man ja morgens machen… wenn noch alle schlafen… das Haus arbeitet ja 24h am Tag und das ist auch gut so. Wir können das eine Programm aus Schritt 2 nehmen (das um 04:25) und um einem Skript erweitern:

Code: Alles auswählen

string weck_text = "Guten Morgen Familie. ";
string weck_text_person1 = "Guten Morgen person1. ";
string weck_text_person2;

string calenderSkriptUrl = "https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec";

dom.GetObject("CUxD.CUX2801001:5.CMD_SETS").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -L " # calenderSkriptUrl # "?cmd=all");
dom.GetObject("CUxD.CUX2801001:5.CMD_QUERY_RET").State(1);
string stdout = dom.GetObject("CUxD.CUX2801001:5.CMD_RETS").State();
var pos1;
var pos2;

if(stdout.Find("person1=") == -1){ quit; }

pos1 = stdout.Find("person1=") + 8;
pos2 = stdout.Find(",person2") - pos1;
string value = stdout.Substr(pos1, pos2);

if(value == ""){
   weck_text_person1 = weck_text_person1 # "Fuer dich sind heute keine Kalendareintraege vorhanden. ";
}else{
   weck_text_person1 = weck_text_person1 # "Du hast heute folgendes vor. " # value;
   weck_text = weck_text# "person1 hat heute folgende Termine. " # value;
   weck_text_person2 = value;
}

pos1 = stdout.Find("person2=") + 8;
pos2 = stdout.Find(",kind1=") - pos1;
string temp = value;
value = stdout.Substr(pos1, pos2);

if(value == ""){
   weck_text_person2 = "Guten Morgen person2. Fuer dich sind heute keine Kalendareintraege vorhanden. ";
}else{
   weck_text_person2 = "Guten Morgen person2. Du hast heute folgendes vor. " # value;
   weck_text = weck_text# "person2 hat heute folgende Termine. " # value;
   weck_text_person1 = weck_text_person1 # "Dein Mann hat folgende Termine. " # value;
}

if(temp != ""){
   weck_text_person2 = weck_text_person2 # "Deine Frau hat folgende Termine. " # temp;
}

pos1 = stdout.Find("kind2=") + 6;
pos2 = stdout.Find(",kind3") - pos1;
temp = stdout.Substr(pos1, pos2);
pos1 = stdout.Find("kind3=") + 6;
pos2 = stdout.Find(",geburtstage") - pos1;
string temp2 = stdout.Substr(pos1, pos2);
pos1 = stdout.Find("kind1=") + 6;
pos2 = stdout.Find(",kind2") - pos1;
string temp3 = stdout.Substr(pos1, pos2);

if(temp.Length() != 0 || temp2.Length() != 0 || temp3.Length() != 0){
   var allgemein = ". Zur Erinnerung. ";
   if(temp.Length() != 0){
      allgemein = allgemein # " " # temp;
   }
   if(temp2.Length() != 0){
      allgemein = allgemein # " " # temp2;
   }
   if(temp3.Length() != 0){
      allgemein = allgemein # " " # temp3;
   }
   weck_text_person2 = weck_text_person2 # allgemein;
   weck_text = weck_text # allgemein;
   weck_text_person1 = weck_text_person1 # allgemein;
   
   allgemein = "";
}

pos1 = stdout.Find("geburtstage=") + 12;
pos2 = stdout.Length() - pos1;
value = stdout.Substr(pos1, pos2);

if(value != ""){
   temp = ". Und jetzt die Geburtstage. " # stdout.Substr(stdout.Find("geburtstage=") + "geburtstage=".Length(),stdout.Length());
   weck_text_person2 = weck_text_person2 # temp;
   weck_text_person1 = weck_text_person1 # temp;
   weck_text = weck_text # temp;
}

dom.GetObject("wecker_text_global").State(weck_text);
dom.GetObject("wecker_text_person1").State(weck_text_person1);
dom.GetObject("wecker_text_person2").State(weck_text_person2);

weck_text = "";
weck_text_person1 = "";
weck_text_person2 = "";
stdout = "";
temp = "";
temp2 = "";
temp3 = "";
value = "";
calenderSkriptUrl = "";
Es müssen 3 Systemvariablen (Text) angelegt werden. „wecker_text_global”, “wecker_text_person1“ und „wecker_text_person2“. Dazu sollte das ganze Skript nach euren Wunsch umgestaltet werden, damit ihr auch den Text bekommt, den ihr auch morgens hören wollt. Ich habe hier ein ganz einfaches Beispiel genommen. Man könnte aber z.B. noch Random-Texte hinzufügen, damit die Ansage nicht immer gleich klingt usw… die Möglichkeiten sind unendlich groß…
Jetzt brauchen wir mal wieder die ISE ID der 3 neuen Variablen, damit man es im Tab auslesen kann.
Jetzt zurück zu Tab! Wir müssen jetzt nur unser „Aufgewacht“ Task kurz umprogrammieren und fertig. Vor jede Zeile mit „Vorlesen“ (Zeilen 30,35 und 40) müssen noch folgendes hinzugefügt werden:
  • nach „http Get“ suchen und unter Server:Port http://[IP der CCU]/config/xmlapi/state.cgi?datapoint_id=xxxxx mit der ID für „wecker_text_global“ eingeben.
  • nach „Warte“ suchen „MS“ auf 100 stellen und ganz unten bei „bis“ %HTTPD schreiben und rechts davon den Vergleichsoperator auf „Ist gesetzt“ setzen.
  • nach „Variable Aufteilen“ suchen, unter „Name“ %HTTPD und unter „Teiler“ value=‘ eingeben.
  • nach „Variable Aufteilen“ suchen, unter „Name“ %HTTPD2 und unter „Teiler“ ‚/> eingeben.
  • nach „Variable Setzen“ suchen, unter „Name“ sowas wie %text_global und bei „Zu“ %HTTPD21 eingeben.
Natürlich für Perso1 und Perso2 die Werte der jeweiligen Systemvariablen holen.

Als letztes die Zeile „Vorlesen“ ändern und anstatt „Guten Morgen xxx“ die variable %text_xxxx eintragen, und fertig ist die Sprachausgabe der Termine.

Ich hoffe ich konnte euch bis jetzt ein bisschen inspirieren :wink: ! Die Odyssee geht weiter :p
Wer kann mir Helfen bekomme felermeldung
und ich kann das nicht eintragen ergiss nicht nach dem exec ein ?cmd=all hinzuzufügen.
Dateianhänge
Skript.jpg

nape1
Beiträge: 246
Registriert: 10.11.2014, 17:26
Wohnort: Kärnten

Re: Vergiss nicht zu Tanken...

Beitrag von nape1 » 29.05.2018, 23:54

Habs mir fast, gedacht das du dich wieder meldest. :D

Golf GTI
Beiträge: 12
Registriert: 22.05.2018, 01:39

Re: Vergiss nicht zu Tanken...

Beitrag von Golf GTI » 30.05.2018, 00:05

tach auch

also ab da geht es schon mal nicht weiter
Zum Testen einfach auf „Veröffentlichen > Als Webapp einrichten“ … oben ist ein Link mit dem ihr es testen könnt.

https://script.google.com/macros/s/fgdf ... ec?cmd=all

Vergiss nicht nach dem exec ein ?cmd=all hinzuzufügen. Jetzt könnt ihr ein bisschen rumspielen.
das hinzufügen get nicht

kruemmel
Beiträge: 1
Registriert: 17.06.2018, 10:28

Re: Vergiss nicht zu Tanken...

Beitrag von kruemmel » 17.06.2018, 10:38

Hallo,

verfolge das Thema sehr interessiert und anzeige der Termine in Systemvariable funkioniert auch soweit.
Benötige aber keine Sprachausgabe und auf meiner Anzeige kommen diese auch wie Sie möchten.
Wie kann man die Termine geordnet in die Systemvariable der CCU schreiben ohne grosses schnick schnack.

Danke schon mal im vorraus

thorkillar
Beiträge: 48
Registriert: 24.01.2017, 16:46

Re: Vergiss nicht zu Tanken...

Beitrag von thorkillar » 24.09.2018, 10:07

Moin, klingt echt interessant.
Habe jetzt bisher nur Seite 1 gelesen.
Kann mir jemand sagen, ob es als iOS Haushalt mit Alexa
Lohnt, den Rest zu lesen ?
1000 dank
Vielen DANK
Thorkillar

Antworten

Zurück zu „Projektvorstellungen“