Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Integrere Google-kalender med HomeSeer (med PHP/JSON)


ZoRaC

Anbefalte innlegg

@Moskus har et script som holder orden på offentlige fridager:

 

Dessverre holder ikke denne styr på dager du er hjemme utover de offentlige fridagene - sykedag, innklemt dag, vinterferie, høstferie, påskeferie, sommerferie, osv, osv. Dvs at hvis du bruker dette til å styre senking av temperatur når du er på jobb, så blir det veldig kaldt disse dagene! :( 

 

Min løsninger er å lage en egen Google Calendar for "huset", som jeg leser av via Google sitt API (med PHP) og oppdaterer HomeSeer utifra det.

Jeg kjører på Linux, men ser ingenting i veien for at samme løsning kan kjøres på Windows. :) 

 

PS: 

Dette bruker PHP fra kommandolinje, så man trenger ikke kjøre en webserver med PHP-støtte eller åpne noen porter i brannmurer, osv. :) 

 

1. Aller først, implementer @Moskus sitt script fra lenken over og sjekke at det virker.

 

2. Deretter er det bare følg denne guiden og se at du får tilgang til å lese ut data fra din primære Google-kalender:

https://developers.google.com/google-apps/calendar/quickstart/php

Sitat

php quickstart.php
Upcoming events:
Test av API (2018-02-25T17:30:00+01:00)

 

3. Så lager du en egen "hus-kalender".

Gå deretter inn på innstillinger for kalenderen og finn kalender-ID'en:

image.png.29767335b2f7ec520b9354285ca47dd3.png


4. Legg inn dette scriptet som "HomeSeer.php" (og rediger de 4 øverste linjene):

Spoiler



<?php
////////////////////////////////////////////////////////////////////////////////
$calendarId = '[email protected]';
$deviceID = 123;
$friTekst = array('syk', 'ferie', 'sykt barn', 'fri', 'fridag', 'planleggingsdag');
$pathToScript = '/HomeSeer/scripts/google';
////////////////////////////////////////////////////////////////////////////////


require_once $pathToScript . '/vendor/autoload.php';
define('APPLICATION_NAME', 'Google Calendar - HomeSeer');
define('CREDENTIALS_PATH', $pathToScript . '/calendar-php-homeseer.json');
define('CLIENT_SECRET_PATH', $pathToScript . '/client_secret.json');
// If modifying these scopes, delete your previously saved credentials by deleting "calendar-php-homeseer.json"
define('SCOPES', implode(' ', array(
  Google_Service_Calendar::CALENDAR_READONLY)
));

if (php_sapi_name() != 'cli') {
  throw new Exception('This application must be run on the command line.');
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient() {
  $client = new Google_Client();
  $client->setApplicationName(APPLICATION_NAME);
  $client->setScopes(SCOPES);
  $client->setAuthConfig(CLIENT_SECRET_PATH);
  $client->setAccessType('offline');

  // Load previously authorized credentials from a file.
  if (file_exists(CREDENTIALS_PATH)) {
    $accessToken = json_decode(file_get_contents(CREDENTIALS_PATH), true);
  } else {
    // Request authorization from the user.
    $authUrl = $client->createAuthUrl();
    printf("Open the following link in your browser:\n%s\n", $authUrl);
    print 'Enter verification code: ';
    $authCode = trim(fgets(STDIN));

    // Exchange authorization code for an access token.
    $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);

    // Store the credentials to disk.
    if(!file_exists(dirname(CREDENTIALS_PATH))) {
      mkdir(dirname(CREDENTIALS_PATH), 0700, true);
    }
    file_put_contents(CREDENTIALS_PATH, json_encode($accessToken));
    printf("Credentials saved to %s\n", CREDENTIALS_PATH);
  }
  $client->setAccessToken($accessToken);

  // Refresh the token if it's expired.
  if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    file_put_contents(CREDENTIALS_PATH, json_encode($client->getAccessToken()));
  }
  return $client;
}


// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Calendar($client);

// Print the next 10 events on the user's calendar.
$optParams = array(
  'maxResults' => 10,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('c', strtotime("today midnight")),
  'timeMax' => date('c', (strtotime("tomorrow midnight")-1))
);

$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) == 0) {
  print "No upcoming events found.\n";
} else {
  print "Upcoming events:\n";
  foreach ($results->getItems() as $event) {
    $start = $event->start->dateTime;
    if (empty($start)) {
      $start = $event->start->date;
    }
    printf("%s (%s)\n", $event->getSummary(), $start);

    foreach ($friTekst as $needle) {
      if (stripos($event->getSummary(), $needle) !== FALSE) {
	sendJSON($deviceID, 100);
      }
   }
  }
}

function sendJSON($refID, $value) {
  $url = 'http://localhost/JSON?request=controldevicebyvalue&ref='.$refID.'&value='.$value;
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $exec = curl_exec($ch);
  curl_close($ch);
}


 

5. Legg til et event i "hus-kalenderen" og sjekk at den listet opp når du nå kjører "php HomeSeer.php".

 

6. Sett opp følgende event:

image.thumb.png.305ca560ea908b7ba44d6b68cc2f99c4.png

 

Da skal "fridag"-devicen oppdateres seg basert på kalenderen i tillegg til faste fridager fra scriptet til @Moskus. :) 

  • Like 3
Lenke til kommentar
Del på andre sider

  • 7 måneder senere...
8 timer siden, Guahtdim skrev:

Hmmm, dette lukter litt plugin mat. Iallefall den delen å kunne sjekke en Google kalender for inneværende dag.

 

Ja, takk! :)

 

Det finnes en gData-plugin (tror den heter noe sånt), men den vedlikeholdes ikke lengre og jeg tror ikke den funker mot Google sin nye autentiseringsløsning...

Lenke til kommentar
Del på andre sider

4 minutter siden, Guahtdim skrev:

40$. Ikke så dyrt med tanke på hvor mange timer man bruker på en plugin. 

 

Jeg brukte vel 1-2 timer på kalenderfunksjonen, så da var ikke 40$ verdt det. Særlig siden den ikke virker på mitt OS...

Lenke til kommentar
Del på andre sider

4 timer siden, Guahtdim skrev:

Jeg kan ikke garanterer at det jeg lager fungerer i *Nix. Jeg kjøre Win og skjønner svært lite av Linux (desverre). Men slik utviklingen er nå så er det ikke umulig at jeg må lære meg å bruke *nix.

 

Jeg har inntrykk av at det meste virker på Linux (Mono), uten at man trenger gjøre noe spesielt. :) 

 

Jeg kjører flere plugins som ikke var testet på linux, men som bare virker. :) 

  • Like 1
Lenke til kommentar
Del på andre sider

På 6.10.2018 den 16.19, Guahtdim skrev:

Jeg kan ikke garanterer at det jeg lager fungerer i *Nix. Jeg kjøre Win og skjønner svært lite av Linux (desverre). Men slik utviklingen er nå så er det ikke umulig at jeg må lære meg å bruke *nix.

Så lenge du ikke bruker forferdelig avanserte biblioteker som benytter Windows-APIer så fungerer det aller meste helt fint på Linux. :) 

Lenke til kommentar
Del på andre sider

Etter å ha fått opp testsystemet mitt (Hyper-v 2008 server og HomeSeer 3.0.0.318 siden den kjører i 30 dager uten noen lisens) så laget jeg kjapt og brutalt en POC på å hente fra Google Calendar. Akkurat nå så leter den etter en eller flere kalender events med Test som overskrift/summary. Og den er avhengig av å ha en recurring event for å kjøre igang.

 

Jeg har bedt Zorac teste i linux hvis han gidder. Hvis noen andre har lyst til å teste noe som ikke engang kan beskrives som alfa så finner du den her (men ikke start med dette hvis du ikke er helt sikker på hva som skal gjøres) :

http://bit.ly/GCalPoc2018

 

NB: Ta gjerne en kopi av hele HomeSeer katalogen din før du begynner å gjøre noe! Skulle ting gå virkelig galt så er det så enkelt som å kopiere tilbake katalogen. 

 

Pakk ut filene i homeseer katalogen din. Du vil få følgende filer  der

HSPI_GCalendarSeerPOC.exe

HSPI_GCalendarSeerPOC.exe.config

HSPI_GCalendarSeerPOC.pdb

I homeseer/bin/GCalendarSeerPOC

vil du få ca 25 filer

 

For å komme igang må du gå inn på f.eks. følgende guide og gjøre punkt 1

https://developers.google.com/calendar/quickstart/php

slik at du får credentials.json. Denne filen må du legge inn i katalogen homeseer/bin/GCalendarSeerPOC.

 

Så setter du opp en recurring event som skjer f.eks. hvert minutt og sjekker mot kalender:

Event.png.ca86f8dbe019434bc73727eddbe11877.png

 

Når den begynner å kjøre vil det høyst sannsynligvis komme opp en webside hvor du må tillate at enheten åpner din kalender.

eks

Choose.png.d1e25bdaf2616ebd2d59722aaffd3e9d.png

 

Og etter å ha valgt konto trykker du på Allow

Allow.png.c6021335e82fe7e6f21eaf44a7bf913b.png

 

For at det skal slå ut må du ha en eller flere registrerte "events" kalenderen din med overskriften Test (Case-sensitivt søk) innenfor de neste 24 timer.

Calendar.png.5107704624959e9da992d765bdb0dc2e.png

Igjen: Ødelegger du noe hos deg selv med dette så tar jeg NULL ansvar.

 

 

Endret av Guahtdim
More docs
  • Like 2
Lenke til kommentar
Del på andre sider

  • 2 uker senere...

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.