OpenHAB + Verisure "My Pages"

I detta forum hör diskussioner gällande teknik i största allmänhet och hemautomation i synnerhet hemma.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
The_Pal
Wannabe
Inlägg: 6
Blev medlem: 05 aug 2015, 01:37
Ort: Bro

OpenHAB + Verisure "My Pages"

Inlägg av The_Pal »

Det finns redan en tråd om hur man integrera mot Verisure, men eftersom den koncentrerar sig på hårdvarulösningar med smartplugs och reläer så skapar jag en ny. Den här tråden berättar hur man får in status (alarm-status och klimatdata) från Verisures "My Pages". Under setupen så hittade jag ett antal personer som har försökt att få till det men inte lyckats på diverse olika forum, så det kan ju vara intressant för nån att veta hur man gör.

Texten är på engelska, så att andra än svenskar kan googla fram den.

How to get Verisure "My Pages" to integrate into OpenHAB

The below tells you step by step how to get the Verisure "My Pages" alarm status and climate data into OpenHAB. Nothing stops you from using the same modules to integrate into other home automation systems, but I can only give exact details for OpenHAB.

My setup is running on Windows. Adapt paths and similar to your OS.

1. Download and install the Node.js javascript engine for your OS.

2. Download the verisure-api Javascript API from https://github.com/suhajdab/verisure-api

3. Put the verisure-api.js file into the configurations\scripts subdirectory below the OpenHAB runtime directory.

4. cd to the configurations\scripts directory in a DOS prompt and install three node.js modules:

npm install request
npm install object-assign
npm install es6-promise

5. Create two instantiation files for the Verisure API object:


configurations\scripts\verisure-alarm.js contents:

var config = {
username: 'your@email',
password: 'YourPassword'
};

var verisureApi = require('./verisure-api').setup( config );

// alarm state changes
verisureApi.on( 'alarmChange', log );

function log ( data ) {
console.log( data );
process.exit(1);
}


configurations\scripts\verisure-climate.js contents:

var config = {
username: 'your@emailr',
password: 'YourPassword'
};

var verisureApi = require('./verisure-api').setup( config );

// alarm state changes
verisureApi.on( 'climateChange', log );

function log ( data ) {
console.log( data );
process.exit(1);
}


Yes - the password is in cleartext in a text file on the disk. Paranoid people are free to implement encryption or other security measurements (and share the solution with us).


6. Create two batch files to start the javascript files. I know it's redundant and shouldn't be needed, but I couldn't get it to work without the bounce - it just gave me 0xDEADBEEF error codes.


configurations\scripts\verisure-alarm.bat contents:

@node configurations\scripts\verisure-alarm.js


configurations\scripts\verisure-climate.bat contents:

@node configurations\scripts\verisure-climate.js


7. Make sure to have the exec binding in the OpenHAB addons directory: org.openhab.binding.exec-1.7.1.jar (restart of OpenHAB needed)

8. Create the exec items in your favorite items file:

String verisure_climate "Verisure climate data" <w> (other, persist_everychange) {exec="<[\"C:\\Program Files (x86)\\OpenHAB\\Server\\configurations\\scripts\\verisure-climate.bat\":3600000:]"}
Number verisure_temperature_kitchen "Kitchen Verisure temperature [%.1f°C]" <temperature> (environment_ground, persist_temperature, rooms_kitchen)
Number verisure_temperature_dogroom "Dog room Verisure temperature [%.1f°C]" <temperature> (environment_basement, persist_temperature, rooms_dogroom)
Number verisure_temperature_gameroom "Game room Verisure temperature [%.1f°C]" <temperature> (environment_basement, persist_temperature, rooms_gameroom)
Number verisure_temperature_bedroom "Bedroom Verisure temperature [%.1f°C]" <temperature> (environment_ground, persist_temperature, rooms_bedroom)
Number verisure_temperature_livingroom "Living room Verisure temperature [%.1f°C]" <temperature> (environment_ground, persist_temperature, rooms_livingroom)
Number verisure_temperature_nimsisland "Nim's Island Verisure temperature [%.1f°C]" <temperature> (environment_ground, persist_temperature, rooms_nimsisland)
Number verisure_humidity_dogroom "Dog room Verisure humidity [%.1f %%]" <humidity> (environment_humidities, persist_humidities, rooms_dogroom)
Number verisure_humidity_gameroom "Game room Verisure humidity [%.1f %%]" <humidity> (environment_humidities, persist_humidities, rooms_gameroom)
Number verisure_humidity_bedroom "Bedroom Verisure humidity [%.1f %%]" <humidity> (environment_humidities, persist_humidities, rooms_bedroom)
Number verisure_humidity_livingroom "Living room Verisure humidity [%.1f %%]" <humidity> (environment_humidities, persist_humidities, rooms_livingroom)
Number verisure_humidity_nimsisland "Nim's Island Verisure humidity [%.1f %%]" <humidity> (environment_humidities, persist_humidities, rooms_nimsisland)
String verisure_alarm "Verisure alarm status [MAP(verisure-alarm.map):%s]" <siren> (sensors_alarm, persist_everychange) {exec="<[\"C:\\Program Files (x86)\\OpenHAB\\Server\\configurations\\scripts\\verisure-alarm.bat\":300000:JSONPATH($.status)]"}

Note that only verisure_climate and verisure_alarm have exec statements. We could have exec statements on all the others as well, but let's be nice to Verisure and collect the data once for all the rooms. We will use the verisure_climate item to save all climate data, and then populate the items for the temperature and humidity of the rooms using a rule.

We are checking the climate data once every hour (3600000 ms) and alarm status once every five minutes (300000 ms). You could argue that you would want to check the temperature more often - but the "My Pages" climate data does not get updated that very often, so it wouldn't make things better.

The items above contain my personal groups etc. Put your own groups within the () or use your sitemap to display the items. Also name your items according to your room names, unless you have a room called "Nim's Island".


9. Create the population rule in your favorite rules file:

rule "Set verisure climate items"
when Item verisure_climate received update
then

var String temp_string = transform("JSONPATH", "$.[?(@.location=='Kitchen')][0].temperature", verisure_climate.state.toString())
var String[] temperature = temp_string.split('&')
postUpdate(verisure_temperature_kitchen, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Dog room')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_dogroom, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Game room')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_gameroom, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Bedroom')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_bedroom, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Living room')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_livingroom, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Nim\'s Island')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_nimsisland, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Dog room')][0].humidity", verisure_climate.state.toString())
var String[] humidity = temp_string.split('%')
postUpdate(verisure_humidity_dogroom, humidity.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Game room')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_gameroom, humidity.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Bedroom')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_bedroom, humidity.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Living room')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_livingroom, humidity.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Nim\'s Island')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_nimsisland, humidity.get(0).replace(',', '.'))
end

The Verisure API javascript is nice enough to give us a JSON, so we kan use JSONPATH to get the data - but we still need to get rid of some degree signs and percent signs, and replace decimal commas with decimal points.

Note: Remember to replace my room names with your own - both in the JSONPATH definitions and the item names.

If you want to harass Verisure and their web servers, you can use the same JSONPATH definitions directly in the items file (see the verisure_alarm item for how), eliminating the need for this rule. Every such item will cause its own connection to the Verisure "My Pages" web server.


10. Create a verisure-alarm.map file to add some human readability to the alarm status:

configurations\transform\verisure-alarm.map contents:

unarmed=Unarmed
armedhome=Armed (home)
armedaway=Armed (away)
-=Unknown status


That's it folks.

/P
Senast redigerad av The_Pal den 05 aug 2015, 03:08, redigerad totalt 1 gånger.
The_Pal
Wannabe
Inlägg: 6
Blev medlem: 05 aug 2015, 01:37
Ort: Bro

Re: OpenHAB + Verisure "My Pages"

Inlägg av The_Pal »

Ser nu att jag hamnade under "Z-Wave - Programmering" när jag klickade på Programmering. Moderator får gärna flytta tråden dit den hör hemma - kanske under http://forum.m.nu/hemautomation-teknik/ ?
Användarvisningsbild
supportM
Moderator
Inlägg: 1010
Blev medlem: 20 aug 2014, 10:27
Ort: Linköping
Kontakt:

Re: OpenHAB + Verisure "My Pages"

Inlägg av supportM »

Flyttad :)
// Officiellt supportkonto för m.nu
Calleman
Wannabe
Inlägg: 13
Blev medlem: 07 jan 2015, 01:31
Ort: Sverige

Re: OpenHAB + Verisure "My Pages"

Inlägg av Calleman »

Är det någon som har fått detta att fungera med Fibaro?

Tack!
Calleman
Wannabe
Inlägg: 13
Blev medlem: 07 jan 2015, 01:31
Ort: Sverige

Re: OpenHAB + Verisure "My Pages"

Inlägg av Calleman »

Tjena,

Ok - Jag byggde detta för Verisure och Fibaro, men en fråga, får du timeout efter ett tag eller fungerar den stabilt 24/7? Som standardkoden är gjord så kastas ett fel efter ett tag i requestPromise som då inte tas om hand varpå inga uppdateringar görs. Jag fick ändra så att den faktiskt väntar 10 min sen autentiserar igen. Det fungerar lite bättre men jag tror att Verisure blockar/kastar ut mig efter ett tag då jag ändå får { state: 'error', message: 'Expected JSON, but got html' }

Även om jag väntar 20min innan ny connect så vill den inte autentisera?

Några idéer?

Tack!
Björn
Gillar hemautomation
Inlägg: 28
Blev medlem: 09 jul 2010, 19:44
Ort: Gudö

Re: OpenHAB + Verisure "My Pages"

Inlägg av Björn »

Ingen aning om något kring detta egentligen :-)

Men jag skulle kolla vad det står i den html du får tillbaka då det borde varit json. Vanligt att oväntade fel från servicar som ska returnera json etc. kommer som html.
Calleman
Wannabe
Inlägg: 13
Blev medlem: 07 jan 2015, 01:31
Ort: Sverige

Re: OpenHAB + Verisure "My Pages"

Inlägg av Calleman »

Tack!

Ska göra det! När felet kastas så autentiserar jag om men får samma fel. La till att en ny cookie skapas vid varje autentisering men samma fel. Kan vara att den läcker minne. Efter en timma tar appen ca 60mb minne?

Ska gräva lite men programmering är inte min heltidssyssla.. :)
Calleman
Wannabe
Inlägg: 13
Blev medlem: 07 jan 2015, 01:31
Ort: Sverige

Re: OpenHAB + Verisure "My Pages"

Inlägg av Calleman »

Nu verkar det fungera, som det var byggt från början så kastades ett fel (som man inte såg) efter ett tag. Antagligen när sessionen löpte ut. Där hängde sig snurran och stod still. Nu la jag till att felet kastas till consol, och att den börjar om igen men samma fel kvarstod förutom att det nu kastades vid varje retry. Felet var att applikationen fortfarande trodde att användaren var autenticerad. Jag la till en authenticated = false; och vips så gjordes en ny färsk autenticering och allt fungerar fint!
ahrens
Inlägg: 2
Blev medlem: 03 apr 2016, 00:54
Ort: Åstorp

Re: OpenHAB + Verisure "My Pages"

Inlägg av ahrens »

Jag har försökt få detta att fungera på en Raspberry Pi och har ändrat vad jag tror borde ändras men får det inte att funka.

Jag har försökte med både .sh-fil och direkt node verisure-climate.js (vilket funkar om jag kör i terminal). Med och utan full path (/usr/share/openhab/configurations/scripts/)

Kod: Markera allt

String verisure_climate "Verisure climate data" <w> (other, persist_everychange) {exec="<[node verisure-climate.js:3600000]"}
Number verisure_temperature_kitchen "Kök Verisure temperature [%.1f°C]" <temperature> (groupGF, persist_temperature, GF_Kitchen)
Number verisure_temperature_ovanvaning "Ovanvåning Verisure temperature [%.1f°C]" <temperature> (groupFF, persist_temperature, FF_Hallway)
Number verisure_temperature_vardagsrum "Vardagsrum Verisure temperature [%.1f°C]" <temperature> (groupGF, persist_temperature, GF_Living)

Number verisure_humidity_ovanvaning "Ovanvåning Verisure humidity [%.1f %%]" <water> (groupFF, persist_humidities, FF_Hallway)
Number verisure_humidity_vardagsrum "Vardagsrum Verisure humidity [%.1f %%]" <water> (groupGF, persist_humidities, GF_Living)
/* String verisure_alarm "Verisure alarm status [MAP(verisure-alarm.map):%s]" <siren> (sensors_alarm, persist_everychange) {exec="<[\"/usr/share/openhab/configurations/scripts/verisure-alarm.sh\":300000:JSONPATH($.status)]"} */
String verisure_alarm "Verisure alarm status [MAP(verisure-alarm.map):%s]" <siren> (sensors_alarm, persist_everychange) { exec="<[node /usr/share/openhab/configurations/scripts/verisure-alarm.js:300000:JSONPATH($.status)]" }

String verisure_test "Verisure alarm status [%2$s]" <siren> (sensors_alarm, persist_everychange) { exec="<[node /usr/share/openhab/configurations/scripts/verisure-alarm.js:300000:JSONPATH($.status)]" }
Oavsett vad jag testat har jag inte fått det att funka. Jag har två varianter på alarmstatusen, för att kunna felsöka, men får ingen data på någon av dem.

Någon som vet vad jag gjort fel? I min sitemap har jag lagt in följande:

Kod: Markera allt

 Frame label="Alarm" {
    Text item=verisure_alarm
    Text item=verisure_test
    }
Min rules-fil:

Kod: Markera allt

rule "Set verisure climate items"
when Item verisure_climate received update
then

var String temp_string = transform("JSONPATH", "$.[?(@.location=='Kök')][0].temperature", verisure_climate.state.toString())
var String[] temperature = temp_string.split('&')
postUpdate(verisure_temperature_kitchen, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Ovanvåning')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_ovanvaning, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Vardagsrum')][0].temperature", verisure_climate.state.toString())
temperature = temp_string.split('&')
postUpdate(verisure_temperature_vardagsrum, temperature.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Ovanvåning')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_ovanvaning , humidity.get(0).replace(',', '.'))

temp_string = transform("JSONPATH", "$.[?(@.location=='Vardagsrum')][0].humidity", verisure_climate.state.toString())
humidity = temp_string.split('%')
postUpdate(verisure_humidity_vardagsrum, humidity.get(0).replace(',', '.'))

end
Resultat från att köra node verisure-climate.js i terminal:

Kod: Markera allt

[ { temperature: '21,5&#176;',
    humidity: '57,0%',
    location: 'Ovanvåning',
    timestamp: 'Yesterday 11:04 PM' },
  { temperature: '21,0&#176;',
    humidity: '53,0%',
    location: 'Vardagsrum',
    timestamp: 'Yesterday 11:04 PM' },
  { temperature: '21,9&#176;',
    humidity: '',
    location: 'Kök',
    timestamp: 'Today 12:09 AM' } ]
ahrens
Inlägg: 2
Blev medlem: 03 apr 2016, 00:54
Ort: Åstorp

Re: OpenHAB + Verisure "My Pages"

Inlägg av ahrens »

Jag har lyckats lösa det själv genom att använda MQTT. För de som vill ha Verisure up and running på Raspberry Pi kan jag absolut rekommendera den lösningen.

Förenklad lösning och kodexempel på https://github.com/DevvAndreas/VerisureOpenHabMQTT

Jag kommer också skriva en bloggpost med mer detaljer.
dohgren
Wannabe
Inlägg: 3
Blev medlem: 14 jan 2016, 11:13
Ort: Knivsta

Re: OpenHAB + Verisure "My Pages"

Inlägg av dohgren »

Hej,
jag tänkte försöka mig på detta men https://github.com/suhajdab/verisure-api är bortplockad. Är det någon vänlig själ som har tillgång till detta paket? @ahrens har du möjlighet (och tid) att förklara lite hur du fick till det. Jag har tolkat det som att man kör suhajdab's lösning men lägger till configen som du beskriver på din github?

Tacksam för all hjälp!
Användarvisningsbild
motoz
Tar hemautomation på allvar
Inlägg: 100
Blev medlem: 02 feb 2015, 15:05
Ort: ostrobothnia

Re: OpenHAB + Verisure "My Pages"

Inlägg av motoz »

En snabbsökning på github ger https://github.com/thced/verisure-api
Open source pellet logger: https://github.com/motoz/PellMon
dohgren
Wannabe
Inlägg: 3
Blev medlem: 14 jan 2016, 11:13
Ort: Knivsta

Re: OpenHAB + Verisure "My Pages"

Inlägg av dohgren »

Tack! :) Borde ha kollat själv. Trevlig helg!
The_Pal
Wannabe
Inlägg: 6
Blev medlem: 05 aug 2015, 01:37
Ort: Bro

Re: OpenHAB + Verisure "My Pages"

Inlägg av The_Pal »

Hej!

Ahrens: Sorry för sent svar - men det du klistrade in ser rätt ut. Hade nog ändå fått svårt att hjälpa dig utan en mer detaljerad felbeskrivning, men nu har du ju löst det på annat sätt.

Kan dock lägga till att Verisure hörde av sig och klagade över min frekvens (en gång var femte minut). De tyckte att en gång i halvtimmen fick räcka.

En gång i halvtimmen funkar för temperaturer och luftfuktighet, men ett larm vill man ju ha lite snabbare.
leahcim
Wannabe
Inlägg: 12
Blev medlem: 05 dec 2015, 17:46
Ort: Gävle

Re: OpenHAB + Verisure "My Pages"

Inlägg av leahcim »

Skriv svar