Verisure python to domoticz

Python and python framework

Moderator: leecollings

DanneG
Posts: 3
Joined: Friday 17 July 2015 15:33
Target OS: Windows
Domoticz version:
Contact:

Verisure python to domoticz

Post by DanneG »

Hi!

I dont have a clue, therfore my question.
Can someone tell me a way to implement this python to a switch in domoticz?
I have a lock connected to verisure that i want to control, or at least read status for locked or unlocked.

https://github.com/persandstrom/python-verisure
alfred_j_kwak
Posts: 110
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Post by alfred_j_kwak »

You could make python program that starts at boot and in this program you handle all events and status updates.
It is also possible to make separate scripts which you trigger from switches or time based, but then you should realize that every time you run script (like example from github...) You log in Verisure server and then log out again. If you do this 1440 times a day - once in a minute - it could cause a problems and that's why my advice is do one all the time running python code with login in begin and logout in the end. Then you could check if you are still logged in - if not, then you login again.

This is just example from Github

Code: Select all

import verisure

myPages = verisure.MyPages('[email protected]', 'password')
myPages.login()
overviews = myPages.get_overviews()
myPages.logout()
To update values in Domoticz with Python - here is one example: https://www.domoticz.com/wiki/Presence_detection
alfred_j_kwak
Posts: 110
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Post by alfred_j_kwak »

So first thing is load zip-file from Github: https://github.com/persandstrom/python-verisure -> Download ZIP - button
Then unpack. I suppose that you have Python installed?
In command line:

Code: Select all

python verisure.py <YOUR EMAIL> <YOUR PASSWORD> get all
This way you are able to see what do you have and what info you could use.

I have for example something like:

alarm
. status: unarmed
. notAllowedReason:
. name: **************
. label: Disarmed
. date: Today 14:56
. type: ARM_STATE
. id: 1
. changeAllowed: True
climate
. plottable: True
. temperatureBelowMinAlertValue:
. humidityBelowMinAlertValue:
. temperatureAboveMaxAlertValue:
. monitorable: False
. humidityAboveMaxAlertValue:
. humidity:
. location: ********
. timestamp: Today 18:19
. type: Siren
. id: **** ****
. temperature: 22.7°

You probably can also see your lock and so on.

When you know what you need then install module for Python:

Code: Select all

pip install vsure
and you can use verisure in your Python code with import verisure.
alfred_j_kwak
Posts: 110
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Post by alfred_j_kwak »

After you have installed module then you could write simple Pyhton script to get some data from your equipment:

Code: Select all

import verisure

myPages = verisure.MyPages('<YOUR EMAIL>', '<YOUR PASSWORD>')
myPages.login()
climate_overview = myPages.climate.get()
myPages.logout()
print(climate_overview[0].temperature) 
verisure_getTemp.py

When you execute this from command line: python verisure_getTemp.py it will shortly print out temperature for you.

Same idea goes for your lock:

Code: Select all

mport verisure

myPages = verisure.MyPages('<YOUR EMAIL>', '<YOUR PASSWORD>')
myPages.login()
myPages.lock.set('<YOUR ALARM CODE>', '<YOUR LOCK ID>', 'LOCKED')
myPages.logout()


However I don't have a lock so I'm not sure about syntax, but here is part from Smartplug and Lock code:
Smartplug:

Code: Select all

    def set(self, device_id, value):
        """ Set device status
        Args:
            device_id (str): Id of the smartplug
            value (str): new status, 'on' or 'off'
        """
        data = {
            'targetDeviceLabel': device_id,
            'targetOn': value
            }
        return not self._session.post(COMMAND_URL, data)
Lock:

Code: Select all

    
    def set(self, code, device_id, state):
        """ set status of alarm component
            Args:
                code (str): Personal alarm code (four digits)
                device_id (str): lock device id
                state (str): 'LOCKED', or 'UNLOCKED'
        """
        data = {
            'code': code,
            'deviceLabel': device_id,
            'state': state
            }
        return not self._session.post(COMMAND_URL, data)
alfred_j_kwak
Posts: 110
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Post by alfred_j_kwak »

Ok. I continue my monologue.

Here is piece of Python:

Code: Select all

# Verisure alarm control script with verisure library
#
# In Domoticz Lua:
# reply = os.execute ("curl --data '{\"get_temperature\"}' http://<YOUR_IP:PORT>/&")
# 
# Message types:
#		{\"get_alarm\"}
#		{\"get_lock\"}
#		{\"get_temperature\"}
#		{\"get_all\"}
#		{\"set_alarm\":\"ARM_AWAY"}, {\"set_alarm\":\"ARM_HOME"}, {\"set_alarm\":\"DISARM"}
#		{\"set_lock\":\"LOCK"}, {\"set_lock\":\"UNLOCK"}


import socket
import sys
import time
import verisure # https://github.com/persandstrom/python-verisure
import urllib

host = ''
port = 50001
backlog = 5
size = 1024

myPages = verisure.MyPages('<YOUR_EMAIL>', '<YOUR_PASSWORD>')

def loginVerisure():
	try:
		myPages.login()
	except verisure.session.Error as e:
		print (e)
		sys.exit()
	return

def logoutVerisure():
	try:
		myPages.logout()
		sys.exit()
	except verisure.session.Error:
		sys.exit()
	return


def setAlarm(msg):
	if msg == "ARM_AWAY":
		msg = "Verisure alarm armed away" 
	elif msg == "ARM_HOME":
		msg = "Verisure alarm armed home" 
	elif msg == "DISARM":
		msg = "Verisure alarm disarmed"
	else:
		msg = "Err." 
	return msg;

def setLock(msg):
	if msg == "LOCK":
		msg = "Verisure door locked"
	elif msg == "UNLOCK":
		msg = "Verisure door unlocked"
	else:
		msg = "Err."
	return msg;

def getAlarm():
	try:
		alarm_overview = myPages.alarm.get()
		msg = (alarm_overview[0].status).capitalize()
		status = urllib.urlopen("http://<DOMOTICZ_IP:PORT>/json.htm?type=command&param=udevice&idx=<YOUR_DEVICE_ID>&nvalue=0&svalue=" + msg)
	except verisure.session.Error as e:
		msg = ("Verisure connection broken")
		#print (e)
		#sys.exit()
	return msg;

def getLock():
	msg = "Verisure door status"
	return msg;

def getTemperature():
	try:
		climate_overview = myPages.climate.get()
		msg = (climate_overview[0].temperature)
		msg = (msg[0:(len(msg)-2)])
		status = urllib.urlopen("http://<DOMOTICZ_IP:PORT>/json.htm?type=command&param=udevice&idx=<YOUR_DEVICE_ID>&nvalue=0&svalue=" + msg )
		print ("Verisure temperature: " + msg)
	except verisure.session.Error as e:
		print ("Verisure connection broken")
		#print (e)
		#sys.exit()
	return msg;
	
def getAll():
	msg = "Verisure system status"
	return msg;

def decodeMessage(msg):
	msg = (msg[(msg.find("{\"")+2):msg.find("\"}")])
	msg = msg.replace("\":\"",";")
	#print (msg) # debug
	tmpParam = msg.split(";")
	return tmpParam;


# Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(backlog)

# Log in Verisure service
loginVerisure()

while 1:
	client, address = s.accept()
	data = client.recv(size)
	if data:
		# print (data) #debug
		params = decodeMessage(data)
		if len(params) >= 2:
			if (params[0] == "set_alarm"):
				data = setAlarm(params[1])
			elif (params[0] == "set_lock"):
				data = setLock(params[1])
			else:
				data = "Err."
		elif len(params) >= 1:
			if (params[0] == "get_alarm"):
				data = getAlarm()
			elif (params[0] == "get_lock"):
				data = getLock()
			elif (params[0] == "get_temperature"):
				data = getTemperature()
			elif (params[0] == "get_all"):
				data = getAll()
			else:
				data = "Err."
		else:
			data = "Err."

		client.send(data)
	client.close()
I don't know too much about programming, but somehow this seems to work. This is script that is running in my Domoticz server. From Domoticz I can use Lua scripts to ask and set status of the Verisure system. I just want to find out how is it possible to visualize some data from my Verisure. Feel free to use and improve this code. I think that I'm not capable to give any support so basically it is what it is.
As you can see I haven't implement all functions, but it shouldn't be too hard to do.
alfred_j_kwak
Posts: 110
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi / ODroid
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Post by alfred_j_kwak »

Here is my Lua script_time_verisure.lua:

Code: Select all

print('Verisure Status Update')

commandArray = {}

reply = os.execute ("curl --data '{\"get_temperature\"}' http://<YOUR_IP:50001>/&")
reply = os.execute ("curl --data '{\"get_alarm\"}' http://<YOUR_IP:50001/&")

return commandArray
And here screenshot from Domoticz.
Alarm status is Text device and Temperature is Temperature...
Attachments
Verisure.png
Verisure.png (34.7 KiB) Viewed 10186 times
DanneG
Posts: 3
Joined: Friday 17 July 2015 15:33
Target OS: Windows
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by DanneG »

Thank you very much for all your work!
i will give it a try this weekend :)

But you install python, then pip install vsure module
then you use only the last python script.

in wich folder do you put the python?
DanneG
Posts: 3
Joined: Friday 17 July 2015 15:33
Target OS: Windows
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by DanneG »

When i run:

Code: Select all

python verisure.py <YOUR EMAIL> <YOUR PASSWORD> get all
I´ll get:

Code: Select all

lock
        status: locked
        notAllowedReason:
        changeAllowed: True
        secureMode: False
        image: locked
        operational: True
        location: --------
        date: Today 00:44
        label: Locked
        type: DOOR_LOCK
        id: ------------
        name: ------ ------------
vacationmode
        scheduled: False
tnesheim
Posts: 1
Joined: Saturday 06 February 2016 18:54
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by tnesheim »

alfred_j_kwak wrote:Here is my Lua script_time_verisure.lua:

Code: Select all

print('Verisure Status Update')

commandArray = {}

reply = os.execute ("curl --data '{\"get_temperature\"}' http://<YOUR_IP:50001>/&")
reply = os.execute ("curl --data '{\"get_alarm\"}' http://<YOUR_IP:50001/&")

return commandArray
And here screenshot from Domoticz.
Alarm status is Text device and Temperature is Temperature...

alfred_j_kwak: Can you please point me in the right direction...I need information on how to "connect" the graphical boxes in Domoticx with the Verisure module made by "persandstrom". Currently I have Installed Domoticz on my Mac to make development convenient for myself, but my goal in to put it on a RaspberryPi. I´m not a "native" programmer, but I´m able to copy and reason if I get examples and documentation.
Thelion
Posts: 54
Joined: Saturday 08 October 2016 12:15
Target OS: Raspberry Pi / ODroid
Domoticz version: 2022.1
Location: The Netherlands
Contact:

Re: Verisure python to domoticz

Post by Thelion »

The scripts above work, but how did you guys get to run the scripts reliably to get the Verisure status updated?

I have tried to run the scripts several ways (CRON at reboot, init.d, from a .sh file) but every time the script which runs the webserver on port 50001 stops working and I have no clue why. It stops after just 10 minutes or after several hours. But I haven't been able to get it running steadily for 24 hours, which makes it nearly useless.

I already increased the time it checks from 1 to 10 to 30 seconds, as I noticed the Verisure site banned my IP when trying to often, but that hasn't solved the issue.

Any ideas?

Regards,

Martijn
clearminds
Posts: 4
Joined: Thursday 02 February 2017 21:29
Target OS: Linux
Domoticz version: Beta
Location: Stockholm, Sweden
Contact:

Re: Verisure python to domoticz

Post by clearminds »

My solution:

IDX 417 is a Dummy Alert - used for AlarmState
IFX 415 is a Dummy Switch - used for Yale Doorman Lock State

main.py

Code: Select all

import domoticz
import verisure
import configparser
import time

config = configparser.ConfigParser()
config.read('.cache.cfg')
if not 'verisure' in config.sections():
    config.add_section('verisure')


session = verisure.Session('LOGIN', 'PASSWORD')
session.login()

monkey = True
while monkey:
    try:
        overview = session.get_overview()
    except:
        monkey = False

    armStatus = overview['armState']
    if armStatus['statusType'] == 'ARMED_AWAY':
        armState = 4
    elif armStatus['statusType'] == 'ARMED_HOME':
        armState = 3
    else:
        armState = 1

    try:
        old_armState = config.getint('verisure', 'armState')
    except:
        old_armState = None
    if isinstance(armState, int) and armState != old_armState:
        config.set('verisure', 'armState', str(armState))
        domoticz.publish('{"command":"udevice","idx":417,"nvalue":%s,"svalue":"%s"}' % (armState, armStatus['statusType']))


    doorStatus = overview['doorLockStatusList'][0]
    doorState = doorStatus['currentLockState']
    if doorState == 'LOCKED':
        doorState = False
    else:
        doorState = True
    try:
        old_doorState = config.getboolean('verisure', 'doorState')
    except:
        old_doorState = None
    if isinstance(doorState, bool) and doorState != old_doorState:
        config.set('verisure', 'doorState', str(doorState))
        if doorState:
            domoticz.publish('{"idx":415,"command":"switchlight","switchcmd":"On"}')
        else:
            domoticz.publish('{"idx":415,"command":"switchlight","switchcmd":"Off"}')


    with open('.cache.cfg', 'w') as configfile:
        config.write(configfile)

    time.sleep(60)

session.logout()
domoticz.py

Code: Select all

# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt

mqttc = mqtt.Client('python_pub')
def publish(message):
    mqttc.connect('127.0.0.1', 1883)
    mqttc.publish("domoticz/in", message)
start.sh

Code: Select all

#!/bin/bash
cd /home/domoticz/verisure
until python main.py; do
    echo "main.py crashed with exit code $?.  Respawning.." >&2
    sleep 1
done
crontab -e

Code: Select all

@reboot /usr/bin/screen -dmS verisure /home/domoticz/verisure/start.sh
LUA - Device

Code: Select all

alarmState = 'Verisure - Alarm State'

commandArray = {}
if (devicechanged[alarmState] == 'ARMED_AWAY') then
    commandArray['Security Panel'] = 'Arm Away'
    commandArray['Group:All Lamps'] = 'Off'
elseif (devicechanged[alarmState] == 'ARMED_HOME') then
    commandArray['Security Panel'] = 'Arm Home'
    commandArray['Group:Alarm Off'] = 'On'
elseif (devicechanged[alarmState] == 'DISARMED') then
    commandArray['Security Panel'] = 'Disarm'
    commandArray['Group:Alarm Off'] = 'On'
end

return commandArray
clearminds
Posts: 4
Joined: Thursday 02 February 2017 21:29
Target OS: Linux
Domoticz version: Beta
Location: Stockholm, Sweden
Contact:

Re: Verisure python to domoticz

Post by clearminds »

After spending a bit more time on it I came up with this solution. This solution do not poll, it just fetches statuses when it gets an email from Verisure via Sendgrid Inbound Email.

https://github.com/clearminds/verisure-inbound
Bengelen
Posts: 3
Joined: Sunday 26 February 2017 0:25
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by Bengelen »

I'm working on using this idea:

https://github.com/DevvAndreas/VerisureOpenHabMQTT

to just run a pyhton script qnd publish to MQTT so the data is vissible in domoticz, but my knowledge at this point is to limited.
How do i get the date in the phyton script to MQTT?
And if i run the script i get an error on line 1 import : Command unknown

Thx for the advice
cronek
Posts: 1
Joined: Thursday 23 March 2017 20:31
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Location: Aalst, Belgium
Contact:

Re: Verisure python to domoticz

Post by cronek »

I did something similar to clearminds' solution, I just run this script every 5 minutes (I've gotten warning emails from verisure when I update it too often):
(yes my code is ugly, I had to learn python just for this)

Code: Select all

#!/usr/bin/python3
import verisure
import urllib

myPages = verisure.Session('----username-----', '------pass-----')
myPages.login()
overview = myPages.get_overview()
climate_overview = overview['climateValues']
climate_kelder = climate_overview[0]
climate_living = climate_overview[2]
climate_gang   = climate_overview[1]
climate_keuken = climate_overview[3]
alarm_overview = myPages.get_arm_state()
myPages.logout()

def updateTemp( idx, inTemp, inHum ):
    temperature=str(inTemp)
    humidity=str(inHum)
    setValue=temperature + ";" + humidity + ";0"
    params = urllib.parse.urlencode({'type': 'command','param': 'udevice', 'idx': idx, 'nvalue': 0, 'svalue': setValue})
    get = urllib.request.urlopen("http://127.0.0.1:8080/json.htm?%s" % params)
    return;

# kelder
updateTemp(26, climate_kelder['temperature'], climate_kelder['humidity'])

# living
updateTemp(24, climate_living['temperature'], climate_living['humidity'])

# gang
updateTemp(27, climate_gang['temperature'], climate_gang['humidity'])

# keuken
updateTemp(25, climate_keuken['temperature'], climate_living['humidity'])

alarmStatus = alarm_overview['statusType']
if alarmStatus == 'DISARMED':
    aLevel = 10
elif alarmStatus == 'ARMED_HOME':
    aLevel = 20
elif alarmStatus == 'ARMED_AWAY':
    aLevel = 30

# update alarm status
params = urllib.parse.urlencode({'type': 'command', 'param': 'switchlight', 'idx': '31', 'switchcmd': 'Set Level', 'level': aLevel})
get = urllib.request.urlopen("http://127.0.0.1:8080/json.htm?%s" % params)
of course you have to create the virtual switches first and use the right ID's
devilkin
Posts: 6
Joined: Tuesday 11 April 2017 16:19
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by devilkin »

I've also had a go at this, as I actually wanted to import the info and learn python at the same time.

This script is currently missing some error handling, so it's "beta" at best ;)
I run this from cron every 10 minutes.

Code: Select all

#!/usr/bin/python3

import argparse
import arrow
import configparser
import logging
import json
import os.path
import urllib.request 
import verisure

# Version 0.1
# Author: Jan De Luyck ([email protected])
#
# This script depends on the verisure module by Per Sandström, which you can find at https://github.com/persandstrom/python-verisure
#
# Notes: if you want additional sensors to be added, supply me with the output of 
#				vsure 'user' 'password' overview 
#
#
################################
# Device config
# Create a dummy hardware device, and add per item you want in Domoticz a Virtual Sensor
# - Temperature + Humidity: smoke detectors
# - Temperature: Siren
# - Switch: door/window locks, ethernet status, arm state
# - Custom Sensor (X Axis: SMS count): SMS
#
# Add the Verisure identifiers _and_ the device ID's (which you can find on the devices view) to vsure.ini (or your own ini file)
# Please keep the identifiers 'sms count' and 'arm state' for the smscount and alarm state respectively

#################################
def parseArgs():
	parser = argparse.ArgumentParser(description = 'Import Verisure information into Domoticz', prog='importVerisure.py')
	parser.add_argument('-l', '--log', dest='logLevel',type=str, choices=['info', 'warning', 'error', 'debug'], help='Specifies the loglevel to be used')
	parser.add_argument('-c', '--config', dest='configFile', default='vsure.ini', type=str, help='Name of the configuration file to use (default: %(default)s')

	results = parser.parse_args()
							
	return vars(results)

def parseConfig(configFile):
	config = configparser.ConfigParser()
	
	if not os.path.isfile(configFile):
		logging.debug('Config file %s does not exist, creating dummy', configFile)
		# create a 'new' config file and write it
		config['domoticz'] = { 'protocol' : 'http', 'host':'localhost', 'port':'8080'}
		config['verisure'] = { 'username':'', 'password':''}
		config['global'] = { 'loglevel':'warning', 'timezone':'local'}
		config['sensorindex'] = { 'sms count':'XX', 'arm state':'XX', 'AAAA BBBB':'XX'}
		
		with open(configFile, 'w') as file:
			config.write(file)			
		
		print ("A default (empty) config file was written as %s. Please review and re-run this script.", configFile)
		exit (1)
	else:
		config.read(configFile)
		
		return config
		
def callDomoticz(URL):
	logging.debug ('** Entered CallDomoticz(%s) **', URL)

	response = urllib.request.urlopen(URL)
	httpOutput = response.read().decode('utf-8')
	output = json.loads(httpOutput)
	logging.debug ('Output: %s', output)

	if output['status'] == 'OK':
		if 'result' in output:
			returnValue = output['result'][0]
		else:
			returnValue = output
	else:
		returnValue = -1
		logging.error ('ERROR: error occurred querying Domoticz! Full output available in debug.')

	return returnValue

def getLastDomoticzUpdatedTimestamp(deviceIndex):
	logging.debug ('** Entered getLastDomoticzUpdatedTimestamp(%s) **', deviceIndex)
	output = callDomoticz(domoticzUrl + 'type=devices&rid=' + str(deviceIndex))
	if output != -1:
		returnValue = arrow.get(arrow.get(output['LastUpdate']).naive, config['global']['timezone']).timestamp
	else:
		returnValue = output

	logging.debug('Return value: %s', str(returnValue))

	return returnValue

def getVerisureInfo(verisureUser, verisurePw):
	logging.debug ('** Entered getVerisureInfo(username,password) **')
	# Connect to Verisure and get all the data
	verisureSession = verisure.Session(verisureUser, verisurePw);
	verisureSession.login()
	verisureOverview = verisureSession.get_overview()
	verisureSession.logout()

	logging.debug ('Verisure output:')
	logging.debug ('************************')
	logging.debug (verisureOverview)
	logging.debug ('************************')
	
	return verisureOverview

def processUpdates(deviceType, sensorIdx, deviceLastUpdated, device):
	if 'deviceLabel' not in device:
		device['deviceLabel'] = deviceType.upper()

	logging.info ('Now processing device %s (sensorIdx %s)', device['deviceLabel'], sensorIdx)
	
	# get last updated time in Domoticz
	lastUpdatedDomoticz = getLastDomoticzUpdatedTimestamp(sensorIdx)
	
	if lastUpdatedDomoticz != -1:
		logging.info (' - Last Updated in Domoticz: %s', arrow.get(lastUpdatedDomoticz).naive)	
		
		# Last updated on Verisure
		lastUpdatedVerisure = arrow.get(deviceLastUpdated).timestamp
		logging.info (' - Last updated in Verisure: %s', arrow.get(lastUpdatedVerisure).naive)
		
		if lastUpdatedVerisure > lastUpdatedDomoticz:
			# Climate devices
			if deviceType == 'climate':
				logging.info (' - Updating temperature to %s', str(device['temperature']))				
				requestUrl = 'type=command&param=udevice&idx=' + sensorIdx + '&nvalue=0&svalue=' + str(device['temperature'])

				if 'humidity' in device:
					logging.info (' - Updating humidity to %s', str(device['humidity']))
					requestUrl += ';' + str(device['humidity']) + ';0'
				
			elif deviceType == 'doorwindow':
				# doorWindow locks
				if device['state'] == 'CLOSE':
					switchState = 'Off'
				elif device['state'] == 'OPEN':
					switchState = 'On'

				logging.info (' - Updating switch status to %s', switchState)
				requestUrl = 'type=command&param=switchlight&idx=' + sensorIdx + '&switchcmd=' + switchState
				
			elif deviceType == 'smscount':
				# SMS Count
				logging.info (' - Updating SMS count to %s', device['totalSmsCount'])
				requestUrl = 'type=command&param=udevice&idx=' + sensorIdx + '&nvalue=0&svalue=' + str(device['totalSmsCount'])
				
			elif deviceType == 'armstate':
				# Alarm Arm status
				if device['statusType'] == "DISARMED":
					alarmState = 'Off'
				else:
					alarmState = 'On'
					
				logging.info (' - Updating alarm state to %s', alarmState)
				requestUrl = 'type=command&param=switchlight&idx=' + sensorIdx + '&switchcmd=' + alarmState

			elif deviceType == 'ethstate':
				# Ethernet status
				if device['latestEthernetTestResult'] == True:
					ethernetState = 'On'
				else:
					ethernetState = 'Off'
				
				logging.info (' - Updating ethernet state to %s', ethernetState)
				requestUrl = 'type=command&param=switchlight&idx=' + sensorIdx + '&switchcmd=' + ethernetState
				
			else:
				logging.error ('ERROR: Unknown device type!')
				requestUrl = None
				
			if requestUrl != None:
				output = callDomoticz(domoticzUrl + requestUrl)

				if output == -1:
					logging.error ('ERROR: Update not sent to Domoticz for device %s!', sensorIdx)
				else:
					logging.info (' - Update sent successfully to Domoticz')
		else:
			logging.info (' - Not updating Domoticz')
	else:
		logging.error ('ERROR: something went wrong querying Domoticz!')


# Execute script
if __name__ == '__main__':

	# Parse command line
	arguments = parseArgs()

	# Read config
	config = parseConfig(arguments["configFile"])

	# Overwrite loglevel, it can be passed on command line
	if arguments['logLevel'] != None:
		config['global']['loglevel'] = str(arguments['logLevel'])

	# Switch default log level
	logging.basicConfig(format='%(asctime)s %(message)s', level=getattr(logging, config['global']['loglevel'].upper()))

	# Construct Domoticz url
	domoticzUrl = config['domoticz']['protocol'] +  '://' + config['domoticz']['host'] + ':' + config['domoticz']['port'] + '/json.htm?'
	
	verisureOverview = getVerisureInfo(config['verisure']['username'], config['verisure']['password'])
	
	# Process climateValues
	for device in verisureOverview['climateValues']:
		if device['deviceLabel'] in config['sensorindex']:
			processUpdates('climate', config['sensorindex'][device['deviceLabel']], device['time'], device)
	
	# Process DoorWindowDevices
	for device in verisureOverview['doorWindow']['doorWindowDevice']:
		if device['deviceLabel'] in config['sensorindex']:
			processUpdates('doorwindow', config['sensorindex'][device['deviceLabel']], device['reportTime'], device)

	# Process SMS
	processUpdates('smscount', config['sensorindex']['sms count'], arrow.now(), verisureOverview)
	
	# Process Alarm State
	processUpdates('armstate', config['sensorindex']['arm state'], verisureOverview['armState']['date'], verisureOverview['armState'])

	# Process Ethernet State
	processUpdates('ethstate', config['sensorindex'][verisureOverview['latestEthernetStatus']['deviceLabel']], verisureOverview['latestEthernetStatus']['testDate'], verisureOverview['latestEthernetStatus'])
Run it for the first time, It'll create a file called vsure.ini, in which you have to fill in the necessary info:

Code: Select all

[domoticz]
protocol=http
host=localhost
port=8080

[global]
timezone=local
loglevel=warning

[verisure]
[email protected]
password=superfancypassword

[sensorindex]
AABB CCDD=22
EEFF GGHH=21
IIJJ KKLL=23
MMNN OOPP=28
QQRR SSTT=27
UUVV XXYY=26
ARM STATE=30
SMS COUNT=32		
where the identifiers in [sensorindex] are the serial numbers of the different verisure components.

Run the script, It'll push the updates straight into Domoticz. I have no smartplugs, so I haven't added any info for those yet.
kimhav
Posts: 148
Joined: Tuesday 01 October 2013 8:31
Target OS: Raspberry Pi / ODroid
Domoticz version: 2023.2
Location: Sweden
Contact:

Re: Verisure python to domoticz

Post by kimhav »

Was looking at this thread to get verisure status indication when I stumpled over this thread and which looks interesting. What I'm wondering is how often you're able to poll the status from Verisure without them complaining; like every 5 minutes?
lanc
Posts: 1
Joined: Saturday 19 August 2017 11:25
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by lanc »

Does anyone have any suggestions what to do with this error message?

Code: Select all

pi@RPI3HA1:~/domoticz/scripts $ python devilkin.py
Traceback (most recent call last):
  File "devilkin.py", line 205, in <module>
    verisureOverview = getVerisureInfo(config['verisure']['username'], config['verisure']['password'])
  File "devilkin.py", line 97, in getVerisureInfo
    verisureSession.login()
  File "/usr/local/lib/python2.7/dist-packages/verisure/session.py", line 90, in login
    self._vid = json.loads(response.text)['cookie']
KeyError: 'cookie'

(My python script is called devilkin :) )

And any suggestion on how to make this a CRON-task?
devilkin
Posts: 6
Joined: Tuesday 11 April 2017 16:19
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by devilkin »

kimhav wrote: Friday 18 August 2017 10:04 Was looking at this thread to get verisure status indication when I stumpled over this thread and which looks interesting. What I'm wondering is how often you're able to poll the status from Verisure without them complaining; like every 5 minutes?
No idea. Trial and error.
devilkin
Posts: 6
Joined: Tuesday 11 April 2017 16:19
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by devilkin »

lanc wrote: Saturday 19 August 2017 11:29 Does anyone have any suggestions what to do with this error message?

Code: Select all

pi@RPI3HA1:~/domoticz/scripts $ python devilkin.py
Traceback (most recent call last):
  File "devilkin.py", line 205, in <module>
    verisureOverview = getVerisureInfo(config['verisure']['username'], config['verisure']['password'])
  File "devilkin.py", line 97, in getVerisureInfo
    verisureSession.login()
  File "/usr/local/lib/python2.7/dist-packages/verisure/session.py", line 90, in login
    self._vid = json.loads(response.text)['cookie']
KeyError: 'cookie'

(My python script is called devilkin :) )

And any suggestion on how to make this a CRON-task?
Eh. The only thing I can say is that I programmed it for Python 3, not 2.7... so perhaps it's a syntax issue with python 2.7?
djac
Posts: 28
Joined: Tuesday 24 October 2017 9:41
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Verisure python to domoticz

Post by djac »

clearminds wrote: Saturday 04 February 2017 10:51 After spending a bit more time on it I came up with this solution. This solution do not poll, it just fetches statuses when it gets an email from Verisure via Sendgrid Inbound Email.

https://github.com/clearminds/verisure-inbound
How do you get Verisure to send an email on arm/disarm?
Domoticz on Rpi, Z-wave, Hue with Philips and Ikea bulbs
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest