Homematic und Google Apps

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

deifel
Beiträge: 256
Registriert: 27.05.2014, 11:10
Hat sich bedankt: 7 Mal

Re: Homematic und Google Apps

Beitrag von deifel » 12.10.2016, 16:16

Vielen Dank für Deine Antwort!
Den Codeschnipsel habe ich angehängt (am Schluss) und bekomme folgende Meldung beim Ausführen des Scriptes ausgegeben:

Code: Alles auswählen

 1
string
Wie gesagt funktioniert der Zugriff über den Browser problemlos.
Die Variable hat folgende Werte:
Name: Urlaub
Typ: Logikwert
ist wahr= 1
ist falsch= 2

Screenshot davon ist im Anhang.
Wäre toll, wenn Du mir einen Tipp zur Lösung hast:)
Danke im Voraus für Deine Hilfe!!
Dateianhänge
Urlaub.jpg
Urlaub.jpg (20.97 KiB) 2909 mal betrachtet

robsdobs
Beiträge: 510
Registriert: 08.08.2015, 22:52
Danksagung erhalten: 1 Mal

Re: Homematic und Google Apps

Beitrag von robsdobs » 12.10.2016, 16:41

deifel hat geschrieben:Vielen Dank für Deine Antwort!
Den Codeschnipsel habe ich angehängt (am Schluss) und bekomme folgende Meldung beim Ausführen des Scriptes ausgegeben:

Code: Alles auswählen

 1
string
Hat die Variable als Rückgabewert wirklich nur "1" oder " 1"? --> also "[Leerzeichen]1".

Zumindest in deinem geposteten Ausschnitt ist vor der 1 ein Leerzeichen.

Damit ist der Vergleich auf nur "1" natürlich immer falsch.
sehr selten im Forum

BadenPower

Re: Homematic und Google Apps

Beitrag von BadenPower » 12.10.2016, 16:55

robsdobs hat geschrieben: Zumindest in deinem geposteten Ausschnitt ist vor der 1 ein Leerzeichen.
Damit ist der Vergleich auf nur "1" natürlich immer falsch.
Genau dies herauszufinden war Zweck des Skriptes.

Und wenn der Fragesteller per Copy&Paste gearbeitet hat, dann ist dort auch tatsächlich ein Leerzeichen.

Vielleicht hätte ich das WriteLine aber erweitern sollen, damit es klarer wird.

Code: Alles auswählen

WriteLine("x" # v # "x");

deifel
Beiträge: 256
Registriert: 27.05.2014, 11:10
Hat sich bedankt: 7 Mal

Re: Homematic und Google Apps

Beitrag von deifel » 12.10.2016, 17:24

Danke für Eure Hilfe!
Ich konnte Problem 1 beheben und bin durch Euch auf die Spur gekommen :)
Es lag aber nicht wie vermutet an dem Leerzeichen, sondern an den Anführungszeichen bei der 1.
Mit folgendem Script lauft es jetzt (einfach die "" weglassen):

Code: Alles auswählen

!! Hier wird der Google Kalender per CURL abgefragt
var url="https://script.google.com/macros/s/MEINEID/exec";
var cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "?cmd=urlaub";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

var oUrlaub = dom.GetObject("Urlaub");

if ( v == 1 ) 
{
    oUrlaub.State ( true );
}
else
{
    oUrlaub.State ( false );
}


Danke Euch!
Das Problem mit meinem Script zur Abfrage des Mülls habe ich damit leider nicht lösen können.
Vielleicht schaffe ich das auch mit Eurer Hilfe!?

Ich frage mit folgendem Script den Status des nächsten Restmüll ab (Browser):

Code: Alles auswählen

https://script.google.com/macros/s/MEINEID/exec?cmd=muell&color=grey
Funktioniert perfekt und er sagt mir morgen, heute oder eben das Datum.
Ich möchte das Ergebnis ebenfalls in eine Variable schreiben (ähnlich wie bei Urlaub).
Bei dem Script komme ich nicht weiter (vermutlich wegen der Kodierung / Ascii).
Wenn ich folgendes Script teste:

Code: Alles auswählen

!! Hier wird der Google Kalender per CURL abgefragt
var url="https://script.google.com/macros/s/MEIDEID/exec";
var cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "?cmd=muell&color=grey";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();

WriteLine(v);
WriteLine(v.Type());
Dann bekomme ich:

Code: Alles auswählen

1.4
string
Ändere ich den CMD-Befehl auf Urlaub ab, dann klappt es wieder...
Also mit:

Code: Alles auswählen

!! Hier wird der Google Kalender per CURL abgefragt
var url="https://script.google.com/macros/s/MEINEID/exec";
var cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace-ascii /var/log/curl.trace -s -k -L " # url # "?cmd=urlaub";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();


WriteLine(v);
WriteLine(v.Type());
lautet die Ausgabe korrekterweise:

Code: Alles auswählen

0
string
Oder halt eine 1 bei eingetragenem Urlaub.

Aber weshalb funktioniert die Abfrage auf "muell" nicht? Im Browser bekomme ich ganze Wörter zurück (Morgen, Heute, etc.).

Ich hoffe, ich konnte das Problem vernünftig beschreiben... und ihr könnt mir evtl. helfen...

Vielen Dank schonmal
Zuletzt geändert von deifel am 12.10.2016, 23:12, insgesamt 1-mal geändert.

BadenPower

Re: Homematic und Google Apps

Beitrag von BadenPower » 12.10.2016, 17:51

deifel hat geschrieben:Es lag aber nicht wie vermutet an dem Leerzeichen, sondern an den Anführungszeichen bei der 1.
Mit folgendem Script lauft es jetzt (einfach die "" weglassen):
Es liegt nicht an den Anführungszeichen, welche in Deinem Code verwendet werden, sondern am Leerzeichen, denn ganz klar erkenntlich ist es ein String, welcher zurückgegeben wird.

Das was Du jetzt gemacht hast funktioniert zwar, ist aber eigentlich nicht richtig und funktioniert nur deshalbe, weil die Rega eine automatische Typumwandlung hat und aus dem String " 1" die Zahl 1 macht.

.

deifel
Beiträge: 256
Registriert: 27.05.2014, 11:10
Hat sich bedankt: 7 Mal

Re: Homematic und Google Apps

Beitrag von deifel » 12.10.2016, 21:08

Also das Leerzeichen kam wohl vom kopieren. Ich erhalte mit "1" als Rückmeldung entweder 0 oder 1 - aber ohne Leerzeichen. Daran dürfte es also nicht liegen. Habe auch mal testweise mit Leerzeichen versucht, der Fehler bleibt bestehen. Eigenartig... Aber letztendlich funktioniert es ohne die ""...
Hast Du evtl. eine Idee, woran der Fehler bei der Müllabfrage liegen könnte?

BadenPower

Re: Homematic und Google Apps

Beitrag von BadenPower » 12.10.2016, 21:25

deifel hat geschrieben:Hast Du evtl. eine Idee, woran der Fehler bei der Müllabfrage liegen könnte?
Da es sich beim Müll nicht um ein Skriptproblem handelt, sondern das Problem bei der Erstellung der Rückgabe durch CUxD unter Verwendung mit curl handelt, bin ich leider hier raus.

Was ich Dir aber sagen kann, das ist, dass bei Dir übermorgen die gelbe Tonne und morgen die Grüne geleert wird und die Graue heute dran war.

.

deifel
Beiträge: 256
Registriert: 27.05.2014, 11:10
Hat sich bedankt: 7 Mal

Re: Homematic und Google Apps

Beitrag von deifel » 12.10.2016, 23:20

Habe es korrigiert ;)
Sorry...
Den Fehler habe ich auch weg bekommen.
Es lag am Script in der CCU.
Jetzt muss ich es nur noch schaffen, das Ergebnis in die Variable zu schreiben (also eins zu eins).
Kann mir jemand den Befehl nennen?

Bis hier hin bin ich gekommen:

Code: Alles auswählen

!! Hier wird der Google Kalender per CURL abgefragt
var url="https://script.google.com/macros/s/MEINEID/exec";
var cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -L '" # url # "?cmd=muell&color=grey'";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var v = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var oRestmuell = dom.GetObject("Restmuell");

WIe packe ich das jetzt noch in die Variable?

Vielen Dank nochmals

BadenPower

Re: Homematic und Google Apps

Beitrag von BadenPower » 13.10.2016, 09:27

deifel hat geschrieben:Habe es korrigiert ;)
Den Fehler habe ich auch weg bekommen.
Es lag am Script in der CCU.
Jain.
Es lag am fehlerhaften Aufruf von curl.
Dieser Aufrufbefehl steht zwar im Skript, aber der Fehler ist kein eigentlicher Fehler des Skriptes.
deifel hat geschrieben:Habe es korrigiert ;)
WIe packe ich das jetzt noch in die Variable?
Ich nehme an, dass Deine Systemvariable "Restmuell" heißt und vom Typ Zeichenkette ist.
Wenn ja, dann fehlt nur noch eine Zeile, welche Deine Variable befüllt.

Code: Alles auswählen

oRestmuell.State(v);
So eine Kleinigkeit würde man locker selbst herausfinden, wenn man sich die Mühe machen würde, die Skriptdoku zu lesen.

.

deifel
Beiträge: 256
Registriert: 27.05.2014, 11:10
Hat sich bedankt: 7 Mal

Re: Homematic und Google Apps

Beitrag von deifel » 13.10.2016, 09:54

Guten Morgen,

ich danke Dir, habe es nun geschafft. Es ist für Dich eine Kleinigkeit, aber ich habe mich stundenlang damit schon rumgeschlagen, da ich Anfänger in der Materie bin.
Das einzige Problem, das jetzt noch besteht ist die Tatsache, dass unser Mülldienstleister in seinem Kalender einmal "Restmüll 1100L" und dann noch "Restmüll" stehen hat.
Ich muss das Google Script jetzt noch so anpassen, dass mir die "Restmüll 1100L" nicht gesucht werden, sondern nur die "Restmüll".
Könntest Du mir evtl. kurz einen Tipp geben oder sagen, wo bzw. an welcher Stelle ich das anpassen kann?

Mein Script sieht aktuell so aus:

Code: Alles auswählen

function doGet(request) {
  var answer = "1.4";
  var d = 1 * request.parameters.d;
  if (isNaN(d)){
    d = 0;
  };
  if ( request.parameters.pwd == "XXXXXXX")
  {
    if ( request.parameters.cmd == "urlaub" )
    {
      answer = getVacation(d);
    }
    else if (request.parameters.cmd == "urlaub_ex" )
    {
      answer = getVacationEx(d);
    }
    else if (request.parameters.cmd == "events" )
    {
      answer = getEventsOfDay(d);
    }
    else if (request.parameters.cmd == "eventstomorrow" )
    {
      answer = getEventsOfDay(1);
    }
    else if ((request.parameters.cmd == "muell") && (request.parameters.color))
    {
      if (request.parameters.mode == "nextdate") 
      {
        answer = FormatedEventDate(findNextMuell(request.parameters.color));
      }
      else if (request.parameters.mode == "indays") 
      {
        answer = DaysUntilEvent(findNextMuell(request.parameters.color));
      }
      else 
      {
        answer = DaysUntilEventNice(findNextMuell(request.parameters.color));
      }
    }
  }    
  return ContentService.createTextOutput(answer);
}

function getEventsInRange(aStart, aEnd)
{
  var events = CalendarApp.getDefaultCalendar().getEvents(aStart, aEnd);
  var result = new Array;
  var eventStart = 0;
  var eventEnd = 0;
  var startTime = aStart.getTime();
  var endTime = aEnd.getTime();
  for (var i=0; i<events.length; i++)
  {
    //Zeiten testen (bug bei allDayEvents)
    //ich verzichte auf Anpassung von Start/Endzeit auf UTC, bei Abfage von ganzen Tagen sind die korrekten Events enthalten, 
    //die zusätlich von angrenzenden Tagen enthaltenen Events werden hier aussortiert.
    if ((events[i].getEndTime().getTime() > startTime) && (events[i].getStartTime().getTime() < endTime))
    {
      result.push(events[i]);  
    }
  }
  return result;
}

function daysEvents( aDate )
{
  var startOfDay = new Date(aDate);
  startOfDay.setHours(0);
  startOfDay.setMinutes(0);
  startOfDay.setSeconds(0);
  startOfDay.setMilliseconds(0);  
  var endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000);
  return getEventsInRange(startOfDay, endOfDay);
}

function findNext( aPattern )
{
  var patt=new RegExp(aPattern,'i');
  var startDate = new Date();
  var endDate = new Date(startDate.getTime() + (24*60*60*1000*30));
  
  var events = getEventsInRange(startDate, endDate);
  for (var i=0; i<events.length; i++)
  {
    //check event title
    if (patt.test(events[i].getTitle()))
    {
      return events[i];
    }
  }
}

function findNextGreen()
{
  return findNext("Flach|Papiermüll|Papiermuell");
}

function findNextGrey()
{
  return findNext("graue Tonne|Restmüll|Restmuell");
}

function findNextYellow()
{
  return findNext("gelber Sack|gruener Punkt|gelbe Säcke|gelbe Saecke");
}

function findNextBrown()
{
  return findNext("braune Tonne|Biogut|Biomüll|Biomuell");
}

function findNextBlue()
{
  return findNext("Rund|Rundmüll");
}

//Events am Tag aDay ab heute (0 = heute, 1 = morgen...)
function eventsOfDay(aDay)
{
  var now = new Date();
  var day = new Date(now.getTime() + (1000*3600*24*aDay)); 
  var events = daysEvents( day );
  return events;
}

function findNextMuell( aColor )
{
  if (aColor == 'grey')
  {
    return findNextGrey();
  }
  else if (aColor == 'green')
  {
    return findNextGreen();
  }
  else if (aColor == 'blue')
  {
    return findNextBlue();
  }

  else if (aColor == 'yellow')
  {
    return findNextYellow();
  }

  else if (aColor == 'brown')
  {
    return findNextBrown();
  }
}

//Urlaub am Tag aDay (0 = heute, 1=morgen...)
function getVacation( aDay )
{
  var events = eventsOfDay( aDay );
  
  var result = "0";
  
  //add here your search definitions for vacation description and location 'home'
  var pattVacation=new RegExp('urlaub|vacation|frei','i');
  // var pattHome=new RegExp('hause|home','i');

  
  for (var i=0; i<events.length; i++)
  {
    var theTitle=events[i].getTitle();
    if ( pattVacation.test(events[i].getTitle()) && events[i].isAllDayEvent() )
    {
      result="1";
      break;
    }
  }
  
  return (result);
}

// added from http://homematic-forum.de/forum/viewtopic.php?f=31&t=11386#p84827

function getVacationEx( aDay )
//creates a bit mask including todays and tomorrows vacation information
{
  //init bit mask and flags
  var result = 0x0; //0000 - initial value
  var vacationToday = 0x1; // 0001 - today is an vacation day
  var atHomeToday = 0x2; // 0010 - vacation today is at home
  var vacationTomorrow = 0x4; // 0100 - tomorrow is an vacation day
  var atHomeTomorrow = 0x8; // 1000 - vacation tomorrow is at home
  
  //add here your search definitions for vacation description and location 'home'
  var pattVacation=new RegExp('urlaub|vacation|frei|homeoffice','i');
  var pattHome=new RegExp('hause|home','i');
  
  //get information about today's vacation
  var eventsToday = eventsOfDay(aDay);
  for (var i=0; i<eventsToday.length; i++)
  {
    //check event title
    if (pattVacation.test(eventsToday[i].getTitle()))
    {
      result = result | vacationToday;
      //
      if (pattHome.test(eventsToday[i].getTitle()) || pattHome.test(eventsToday[i].getLocation())|| pattHome.test(eventsToday[i].getDescription()))
      {
        result = result | atHomeToday;
      }
    }
  }
  
  //get information about tomorrow's vacation
  var eventsTomorrow = eventsOfDay(aDay + 1);
  for (var i=0; i<eventsTomorrow.length; i++)
  {
    if (pattVacation.test(eventsTomorrow[i].getTitle()))
    {
      result = result | vacationTomorrow;
      if (pattHome.test(eventsTomorrow[i].getTitle()) || pattHome.test(eventsTomorrow[i].getLocation())|| pattHome.test(eventsTomorrow[i].getDescription()))
      {
        result = result | atHomeTomorrow;
      }
    }
  }
  return (result.toString());
}

function getEventsOfDay( aDay )
{
  var events = eventsOfDay(aDay);
  
  var result = "";
   
  for (var i=0; i<events.length; i++)
  {
    if ( result.length > 0)  {
      result = result+";";
    }
    result = result + events[i].getTitle().toLowerCase();
  }
  
  return result;
}

function FormatedEventDate( aEvent )
{
  if (aEvent) 
  {
    var timezone = CalendarApp.getDefaultCalendar().getTimeZone();
    var res = Utilities.formatDate(aEvent.getStartTime(), timezone, "dd.MM.yyyy"); 
    return res;
  }
}

function DaysUntilEvent( aEvent )
{
  if (aEvent)
  {
    var startOfToday = new Date();
    startOfToday.setHours(0);
    startOfToday.setMinutes(0);
    startOfToday.setSeconds(0);
    startOfToday.setMilliseconds(0);   
    var differenceInMillis = aEvent.getStartTime() - startOfToday.getTime();
    return Math.floor( differenceInMillis /1000/60/60/24 );
  }
}

function DaysUntilEventNice( aEvent )
{
  result = '';
  var days = 1 * DaysUntilEvent(aEvent);
  if (!isNaN(days))
  {
    if (days == 0)
    {
      result = 'Heute';
    }
    else if (days == 1)
    {
      result = 'Morgen';
    }
    else if (days == 2)
    {
      result = 'Übermorgen';
    }
    else
    {
      result = 'In ' + days + ' Tagen';
    }
  }
  else
  {
    result = 'nicht gefunden';
  }
  return result;
}
Ich gehe mal davon aus, dass ich irgendwo in diesem Bereich eine Anpassung vornehmen muss:

Code: Alles auswählen

function findNextGrey()
{
  return findNext("graue Tonne|Restmüll|Restmuell");
}
Ist das korrekt? Also anstelle findNext irgendwo explizit auf den Begriff einschränken oder die Länge begrenzen!?

Vielen Dank im Voraus

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“