Ceci est une ancienne révision du document !
Récuperer les sources et les compiler (pas trop lourd même sur un RPI).
Configuration de tellstick duo pour piloter une prise DIO:
user = "root" group = "plugdev" deviceNode = "/dev/tellstick" ignoreControllerConfirmation = "false" device { id = 1 name = "Aquarium Nano" controller = 1 protocol = "arctech" #model = "codeswitch" model = "selflearning-switch" parameters { # devices = "" house = "A" unit = "1" # code = "" # system = "" # units = "" # fade = "" } } controller { id = 1 # name = "" type = 2 serial = "A6028BOC" }
Quelques tâches en cron pour les tests sur IP:
*/10 * * * * /home/pi/domoticz/scripts/check_device_online.py 192.168.2.5 6 60 120\\ */10 * * * * /home/pi/domoticz/scripts/check_device_online.py 192.168.2.3 7 60 120
Et le script check_device_online.py:
#!/usr/bin/python # Title: check_device_online.py # Author: Chopper_Rob # Date: 25-02-2015 # Info: Checks the presence of the given device on the network and reports back to domoticz # URL : https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz # Version : 1.6.2 import sys import datetime import time import os import subprocess import urllib2 import json import base64 # Settings for the domoticz server domoticzserver="hdmipi:8080" domoticzusername = "admin" domoticzpassword = "admin" # If enabled. The script will log to the file _.log # Logging to file only happens after the check for other instances, before that it only prints to screen. #log_to_file = False log_to_file = True # The script supports two types to check if another instance of the script is running. # One will use the ps command, but this does not work on all machine (Synology has problems) # The other option is to create a pid file named _.pid. The script will update the timestamp # every interval. If a new instance of the script spawns it will check the age of the pid file. # If the file doesn't exist or it is older then 3 * Interval it will keep running, otherwise is stops. # Please chose the option you want to use "ps" or "pid", if this option is kept empty it will not check and just run. check_for_instances = "pid" # DO NOT CHANGE BEYOND THIS LINE if len(sys.argv) != 5 : print ("Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.") sys.exit(0) device=sys.argv[1] switchid=sys.argv[2] interval=sys.argv[3] cooldownperiod=sys.argv[4] previousstate=-1 lastsuccess=datetime.datetime.now() lastreported=-1 #base64string = base64.encodestring('%s:%s' % (domoticzusername, domoticzpassword)).replace('\n', '') domoticzurl = 'http://'+domoticzserver+'/json.htm?type=devices&filter=all&used=true&order=Name' if check_for_instances.lower() == "pid": pidfile = sys.argv[0] + '_' + sys.argv[1] + '.pid' if os.path.isfile( pidfile ): print datetime.datetime.now().strftime("%H:%M:%S") + "- pid file exists" if (time.time() - os.path.getmtime(pidfile)) < (float(interval) * 3): print datetime.datetime.now().strftime("%H:%M:%S") + "- script seems to be still running, exiting" print datetime.datetime.now().strftime("%H:%M:%S") + "- If this is not correct, please delete file " + pidfile sys.exit(0) else: print datetime.datetime.now().strftime("%H:%M:%S") + "- Seems to be an old file, ignoring." else: open(pidfile, 'w').close() if check_for_instances.lower() == "ps": if int(subprocess.check_output('ps x | grep \'' + sys.argv[0] + ' ' + sys.argv[1] + '\' | grep -cv grep', shell=True)) > 2 : print (datetime.datetime.now().strftime("%H:%M:%S") + "- script already running. exiting.") sys.exit(0) def log(message): print message if log_to_file == True: logfile = open(sys.argv[0] + '_' + sys.argv[1] + '.log', "a") logfile.write(message + "\n") logfile.close() def domoticzstatus (): json_object = json.loads(domoticzrequest(domoticzurl)) status = 0 switchfound = False if json_object["status"] == "OK": for i, v in enumerate(json_object["result"]): if json_object["result"][i]["idx"] == switchid and "Lighting" in json_object["result"][i]["Type"] : switchfound = True if json_object["result"][i]["Status"] == "On": status = 1 if json_object["result"][i]["Status"] == "Off": status = 0 if switchfound == False: print (datetime.datetime.now().strftime("%H:%M:%S") + "- Error. Could not find switch idx in Domoticz response. Defaulting to switch off.") return status def domoticzrequest (url): request = urllib2.Request(url) #request.add_header("Authorization", "Basic %s" % base64string) try: response = urllib2.urlopen(request) except: print("error opening %s" % url) sys.exit(-1) else: return response.read() log (datetime.datetime.now().strftime("%H:%M:%S") + "- script started.") lastreported = domoticzstatus() if lastreported == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is online") if lastreported == 0 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is offline") while 1==1: currentstate = subprocess.call('ping -q -c1 -W 1 '+ device + ' > /dev/null', shell=True) if currentstate == 0 : lastsuccess=datetime.datetime.now() if currentstate == 0 and currentstate != previousstate and lastreported == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, no need to tell domoticz") if currentstate == 0 and currentstate != previousstate and lastreported != 1 : if domoticzstatus() == 0 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, tell domoticz it's back") domoticzrequest("http://" + domoticzserver + "/json.htm?type=command¶m=switchlight&idx=" + switchid + "&switchcmd=On&level=0") else: log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, but domoticz already knew") lastreported=1 if currentstate == 1 and currentstate != previousstate : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, waiting for it to come back") if currentstate == 1 and (datetime.datetime.now()-lastsuccess).total_seconds() > float(cooldownperiod) and lastreported != 0 : if domoticzstatus() == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, tell domoticz it's gone") domoticzrequest("http://" + domoticzserver + "/json.htm?type=command¶m=switchlight&idx=" + switchid + "&switchcmd=Off&level=0") else: log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, but domoticz already knew") lastreported=0 time.sleep (float(interval)) previousstate=currentstate if check_for_instances.lower() == "pid": open(pidfile, 'w').close()