Hämta värden från Google kalender till HC2 *Ny version*

jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Hittade ett skript gjort i PHP för att hämta värden från Google kalendern och tänkte att det vore praktiskt att få in i Fibaron. På så vis kan man sätta regler för om man jobbar, är ledig, har semestern osv.

Så här har jag gjort:
Skapa en Google kalender (eller ni kanske har en redan, använd den)
Gå in på din kalender och välj kalenderinställningar (se bild)
googlecal.PNG
googlecal.PNG (67.55 KiB) Viewed 25396 times
Klicka på XML i Privat adress fältet så dyker den url som är för din kalender (se bild)
calXML.PNG
calXML.PNG (42.82 KiB) Viewed 25396 times
Delar av denna URL ska du använda i ditt PHP skript, leta efter raden där det står(rad38),"https://www.google.com/calendar/feeds/_ ... _ID_/basic"


I min kalender lägger jag in Jobb (med start och sluttid), Helg och inte för att inte glömma köra ut soptunnorna så lägger jag in det också.
NOTE! Viktigt med stora och små bokstäver(måste vara lika)

Skapa en virtuell enhet i din Fibaro
Ska innehålla denna kod. Byt ut ""WEBBSERVER_IP"

Code: Select all

HC2 = Net.FHttp("WEBBSERVER_IP") 
response, status, errorcode = HC2:GET("/calgoogle.php")
--fibaro:log(response)
local currentDate = os.date("%Y-%m-%d")
-- Today 
sToday = string.find(response,"<startdate0>")
eToday = string.find(response,"</startdate0>")
Today = string.sub(response,sToday+12,eToday-1)

-- Today first calender entry
sTodayTitlefirst = string.find(response,"<titles0>")
eTodayTitlefirst = string.find(response,"</titles0>")
TodayTitlefirst = string.sub(response,sTodayTitlefirst+9,eTodayTitlefirst-1)

sTodayStartfirst = string.find(response,"<starttime0>")
eTodayStartfirst = string.find(response,"</starttime0>")
TodayStartfirst = string.sub(response,sTodayStartfirst+12,eTodayStartfirst-1)

sTodayEndfirst = string.find(response,"<endtime0>")
eTodayEndfirst = string.find(response,"</endtime0>")
TodayEndfirst = string.sub(response,sTodayEndfirst+10,eTodayEndfirst-1)


if sToday ~= nil then
    if currentDate == Today then
    fibaro:log("Datum:"..Today)
    fibaro:sleep(1000)
    if TodayTitlefirst =="Jobb" then
  	fibaro:log(TodayTitlefirst.." "..TodayStartfirst.."-"..TodayEndfirst)
  	fibaro:setGlobal("JonnyatWork", "1")
    fibaro:setGlobal("jonnyJobbStart", TodayStartfirst)
    fibaro:setGlobal("jonnyJobbSlutar", TodayEndfirst)
  	fibaro:sleep(1000)
  	elseif TodayTitlefirst == "Sopor" then
    fibaro:log("Kom ihåg sopkärlen")
    fibaro:sleep(1000)
  	fibaro:setGlobal("UtMedSoptunnor", "1")
  	elseif TodayTitlefirst == "Helg" then
  	fibaro:setGlobal("Helg", "1")
  	fibaro:log("Helgdag")
	fibaro:sleep(1000)
    
end
end
end

if currentDate ~= Today  then
fibaro:log("Inget i kalendern")
end

Skärmklipp.PNG
Skärmklipp.PNG (11.69 KiB) Viewed 25396 times
Genom att trycka på knappen så ser man vad det är som hämtas från kalender.

Beträffande soptunnorna så när detta dyker upp i kalendern och det hämtas så sätts variabel UtMedSoptunnor till 1 och sen monitorerar jag detta med scen som då skickar ett Push meddelande till våra telefoner. :)

zip fil (lägg denna på din webbserver, i rooten)
calgoogle_default.zip
(3.57 KiB) Downloaded 767 times
Källa: http://maison-et-domotique.com/books/sc ... domotique/
Johan
Medlem
Posts: 36
Joined: 10 Nov 2012, 09:01
11

Hej.
Jag undrar om man kan lägga detta i en webserver på synology?
Hur gör man då enklast.
Måste servern gå dygnet runt för att det ska fungera?
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Jag har PHP skriptet på min Synology, det som sker är att när den virtuell enheten aktiveras genom manuell tryck eller via schedulerad scen så hämtas informationen från din kalender som du specificerat i PHP filen. Om du väljer att bara köra den några få ggr per dag eller som jag var 5:e min beror ju på hur snabbt du vill få något uppdaterat i din HC2.
Du stänger väl inte ner din NAS någon gång eller?
Min snurrar dygnet runt ;)

Säg bara till så hjälper jag till med konfig :)
Johan
Medlem
Posts: 36
Joined: 10 Nov 2012, 09:01
11

Jo jag stängner min Synology på natten. :?
nohed
Medlem
Posts: 88
Joined: 20 Apr 2013, 14:10
10

varför denna i debuggen

[ERROR] 12:56:12: line 8: attempt to perform arithmetic on global 'sToday' (a nil value)
Farbror Grå
Medlem
Posts: 76
Joined: 23 Oct 2014, 09:20
9
Location: Göteborg

Jag får samma fel som i ovanstående inlägg men på rad 9.

[ERROR] 17:39:26: line 9: attempt to perform arithmetic on global 'sToday' (a nil value)
hegu
Ny medlem
Posts: 4
Joined: 22 Mar 2014, 12:44
10

Jag får samma fel på rad 8....
Benz0187
Ny medlem
Posts: 5
Joined: 09 Oct 2015, 17:40
8

Nyligen emigrerat från Zipabox till HC2, i love it.
Nu vill jag få till google kalender styrning här också..
Först, den koden ni visat startar den och stänger med händelserna?
Ex om jag vill styra motorvärmaren, lägger in i kalendern en händelse 05:00-06:00, kan den starta motorvärmaren när händelsen startar och sedan stänga av den när händelsen slutar 06:00?

När jag skulle hitta min XML kod så fanns den inte/hittade den inte i mina kalender inställningar, endast ICAL. Någon som kan hjälpa mig med det?
Attachments
Screen Shot 2015-12-13 at 21.43.02.png
Screen Shot 2015-12-13 at 21.43.02.png (52.09 KiB) Viewed 22243 times
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Google tog bort stödet för XML förra månaden då det var så få som använde det.

Skickat från min D6503 via Tapatalk
Benz0187
Ny medlem
Posts: 5
Joined: 09 Oct 2015, 17:40
8

Robert wrote:Google tog bort stödet för XML förra månaden då det var så få som använde det.

Skickat från min D6503 via Tapatalk

Men kung...

Kan man inte fixa nån koppling via IFTTT som man gör med zipaboxen?
På zipan gjorde man en http sensor som gav en två http adresser, en för ON och en för OFF. Och när man besökte dom i nån webläsare så utförde den kopplade kommandon.
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Finns ett annat alternativ via Google script, lägger upp det imorgon(ej jag som gjort skriptet) jag kör det och fungerar bra.


Regards Jonny Larsson
From my iPhone6+ med Tapatalk
Robert
Medlem
Posts: 346
Joined: 17 Oct 2013, 22:40
10

Löst det än? Har också en lösning på det. Bygger dock på ett php script som läser ICAL.

Skickat från min D6503 via Tapatalk
Last edited by Robert on 19 Dec 2015, 13:49, edited 1 time in total.
jolerius
Medlem
Posts: 115
Joined: 18 Apr 2013, 17:09
10

jompa68 wrote:Finns ett annat alternativ via Google script, lägger upp det imorgon(ej jag som gjort skriptet) jag kör det och fungerar bra.


Regards Jonny Larsson
From my iPhone6+ med Tapatalk
Fick du lagt upp scriptet?

Skickat från min SM-G928F via Tapatalk
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Just ja, det har jag glömt. Kommer här. Skriptet är gjort av steven på http://domotique-fibaro.fr

script för script.google.com

Code: Select all

/**
 * ========================================================================================================

 * ========================================================================================================
**/

var HC2_IP = "dnsname.se:80";
var LOGIN = "admin";
var PWD = "admin";

var CAL_ID = 'xxxxxxxxxxxxxxxx@group.calendar.google.com' 
var TIMEZONE = "GMT+1";
var DATE_FORMAT = "dd/MM";
var ALL_DAY = "";
var TIME_FORMAT = "HH:mm";

var MV_ID = 6;  // ID of VD

var options = {"headers": {
    "User-Agent": "MY_APP_NAME (App URL/your email address)",
    "Authorization": "Basic " + Utilities.base64Encode(LOGIN + ":" + PWD)
}}

/**
 * ----------------------------------------------------------------------------
 * Find the next 10 events from the calendar and push them in the VD
 * ----------------------------------------------------------------------------
**/
function findAndSend() {
  
  var cal = CalendarApp.getCalendarById(CAL_ID);
  var now = new Date();
  var nowPlus2Weeks = new Date(now.getTime() + (14 * 24 * 60 * 60 * 1000));
  var events = cal.getEvents(now, nowPlus2Weeks);

  var index = 1;
  reset();
  for (var i=0 ; i < events.length && i < 10; i++) {
      var d = getDateTime(events[i])
      send("ui.Label"+index+".value", d + " - " + events[i].getTitle());
      index += 1;
  }
  toVar();
}

/**
 * ----------------------------------------------------------------------------
 * Get the date/time of an event
 * ----------------------------------------------------------------------------
**/
function getDateTime(event) {
  var dt = ""
  if (event.isAllDayEvent()) {
    dt = Utilities.formatDate(event.getStartTime(), TIMEZONE, DATE_FORMAT);
    dt += " " + ALL_DAY;
  } else {
    dt = Utilities.formatDate(event.getStartTime(), TIMEZONE, DATE_FORMAT);
    dt += " ";
    dt += Utilities.formatDate(event.getStartTime(), TIMEZONE, TIME_FORMAT);
  }
  return dt;
}

/**
 * ----------------------------------------------------------------------------
 * Simple test method
 * ----------------------------------------------------------------------------
**/
function testit() {
  reset();
  send("ui.Label1.value", "2Ts");
}

/**
 * ---------------------------------------------------------------------------------------------------------
 * Action, push the event (value) into the label (name)
 * ---------------------------------------------------------------------------------------------------------
**/
function send(name, value) {
    var url = "http://"+HC2_IP + "/api/callAction?deviceID="+MV_ID+"&name=setProperty&arg1="+name+"&arg2="+value + " "
    envoi = UrlFetchApp.fetch(url, options) 
}

/**
 * ---------------------------------------------------------------------------------------------------------
 * Press the button reset of the VD
 * ---------------------------------------------------------------------------------------------------------
**/
function reset() {
  var url = "http://" + HC2_IP + "/api/callAction?deviceID="+MV_ID+"&name=pressButton&arg1=11";
  envoi = UrlFetchApp.fetch(url, options) 
}

/**
 * ---------------------------------------------------------------------------------------------------------
 * Press the button toVariable of the VD
 * ---------------------------------------------------------------------------------------------------------
**/
function toVar() {
  var url = "http://" + HC2_IP + "/api/callAction?deviceID="+MV_ID+"&name=pressButton&arg1=12";
  envoi = UrlFetchApp.fetch(url, options) 
}
Skapa sen en VD med 10st labels, dit kommer skriptet skicka entry från kalendern
jolerius
Medlem
Posts: 115
Joined: 18 Apr 2013, 17:09
10

Vart ska man lägga scriptet dp??


Skickat från min SM-G928F via Tapatalk
Benz0187
Ny medlem
Posts: 5
Joined: 09 Oct 2015, 17:40
8

Gärna en utförlig guide för oss newbies
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Skriptet läggs upp och körs hos google, adressen är https://script.google.com.
Vid exekvering av scriptet så kopplar den upp sig mot din Fibaro kontroller, som måste ha en port öppen i brandväggen ut mot internet annars fungerar det inte, ta bara inte port 80 utan gör en vidarebefordring av tex port 5201 till kontrollens port 80 på insidan.
Lägg in ip eller dns namn i skriptet för din kontroller, ändra inloggning och passord samt lägg in grupp kalenders namn som heter något liknande som "2liopsmqrhcfvxxxxxxxxxxxxx@group.calendar.google.com"
Kom även ihåg att ändra raden "var MV_ID = 6;" till din virtuell enhets ID

Importera virtuell enheten som följer med här. Den kommer sen att fyllas på med värden från den grupp kalender som är definierad i skriptet.
Skärmavbild 2015-12-20 kl. 06.56.07.png
Skärmavbild 2015-12-20 kl. 06.56.07.png (33.97 KiB) Viewed 22057 times
Själv kör jag skriptet var 10:e minut.
Skärmavbild 2015-12-20 kl. 06.52.59.png
Skärmavbild 2015-12-20 kl. 06.52.59.png (21.52 KiB) Viewed 22057 times
Google_Cal.vfib.zip
(1.35 KiB) Downloaded 450 times
jolerius
Medlem
Posts: 115
Joined: 18 Apr 2013, 17:09
10

Ursäkta en newbie som mig.. Men vart hittar jag det där otroligt långa kalendernamnet??

Skickat från min SM-G928F via Tapatalk
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

När man skapat grupp kalendern så ser man namnet om man går in på inställningar (se längst ner i bilden)
Skärmavbild 2015-12-20 kl. 09.10.12.png
Skärmavbild 2015-12-20 kl. 09.10.12.png (123.76 KiB) Viewed 22044 times
jolerius
Medlem
Posts: 115
Joined: 18 Apr 2013, 17:09
10

Funkar det vara för grupp-kalender eller kan man köra det mot en vanlig kalender man har i Gmail?

Skickat från min SM-G928F via Tapatalk
Post Reply