Verisure python to domoticz

Must be cleaned all topics go to the right subforum
DanneG
Posts: 6
Joined: Friday 17 July 2015 15:33
Target OS: Windows
Domoticz version:
Contact:

Verisure python to domoticz

Postby DanneG » Tuesday 05 January 2016 14:48

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: 253
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Postby alfred_j_kwak » Tuesday 05 January 2016 15:38

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: 253
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Postby alfred_j_kwak » Tuesday 05 January 2016 18:48

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: 253
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Postby alfred_j_kwak » Tuesday 05 January 2016 19:11

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: 253
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Postby alfred_j_kwak » Thursday 07 January 2016 18:03

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: 253
Joined: Friday 20 September 2013 18:49
Target OS: Raspberry Pi
Domoticz version: 2.3530
Location: Finland
Contact:

Re: Verisure python to domoticz

Postby alfred_j_kwak » Thursday 07 January 2016 18:16

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 2864 times

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

Re: Verisure python to domoticz

Postby DanneG » Friday 08 January 2016 1:27

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: 6
Joined: Friday 17 July 2015 15:33
Target OS: Windows
Domoticz version:
Contact:

Re: Verisure python to domoticz

Postby DanneG » Friday 08 January 2016 2:01

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 19:54
Target OS: Raspberry Pi
Domoticz version:
Contact:

Re: Verisure python to domoticz

Postby tnesheim » Wednesday 24 February 2016 22:59

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: 21
Joined: Saturday 08 October 2016 12:15
Target OS: Raspberry Pi
Domoticz version: v3
Location: The Netherlands
Contact:

Re: Verisure python to domoticz

Postby Thelion » Friday 14 October 2016 13:34

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 22:29
Target OS: Linux
Domoticz version: Beta
Location: Stockholm, Sweden
Contact:

Re: Verisure python to domoticz

Postby clearminds » Friday 03 February 2017 10:28

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 22:29
Target OS: Linux
Domoticz version: Beta
Location: Stockholm, Sweden
Contact:

Re: Verisure python to domoticz

Postby clearminds » Saturday 04 February 2017 11: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

Bengelen
Posts: 4
Joined: Sunday 26 February 2017 1:25
Target OS: Raspberry Pi
Domoticz version:
Contact:

Re: Verisure python to domoticz

Postby Bengelen » Tuesday 07 March 2017 0:10

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 21:31
Target OS: Raspberry Pi
Domoticz version: beta
Location: Aalst, Belgium
Contact:

Re: Verisure python to domoticz

Postby cronek » Thursday 23 March 2017 21:37

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: 4
Joined: Tuesday 11 April 2017 16:19
Target OS: Raspberry Pi
Domoticz version:
Contact:

Re: Verisure python to domoticz

Postby devilkin » Friday 21 April 2017 13:49

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.


Return to “Scripts [cleaning in progress]”

Who is online

Users browsing this forum: No registered users and 7 guests