Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== Jeedom sur Raspberry PI 2 ou 3 ====== Avec l'installation via Docker. <code> pacman -S docker </code> Mettre son utilisateur courant dans le groupe docker (pour éviter sudo). Utilisation de l'image suivante [[https://hub.docker.com/r/sbeuzit/rpi-jeedom/|https://hub.docker.com/r/sbeuzit/rpi-jeedom/]] avec les commandes qui suivent: <code> docker pull sbeuzit/rpi-jeedom-data docker run --name data sbeuzit/rpi-jeedom-data </code> Cette image ne sert que pour conserver les données. Il faut ensuite un containeur pour la partie MySQL : <code> docker pull hypriot/rpi-mysql docker run --name jeedom-mysql -e MYSQL_ROOT_PASSWORD=my_mysql_password --volumes-from data -d hypriot/rpi-mysql </code> Il s'agit de l'image fournit pas hypriot, donc idéale pour Raspberry PI. A noter qu'il faut plus de 512Mo de RAM, donc il faut un minimum un RPI 2 ou supérieur. Il ne reste plus qu'à lancer le containeur jeedom avec le lien vers nos containeurs précédents : <code> docker run -d --link jeedom-mysql:mysql --device=/dev/ttyUSB0:/dev/ttyUSB0 --name jeedom -p 80:80 -p 8083:8083 -p 443:443 </code> A noter le /dev/ttyACM0 pour donner accès à votre clef ZWAVE. ====== Domoticz sur Raspberry PI B+ ====== Récuperer les sources et les compiler (pas trop lourd même sur un RPI). Configuration de tellstick duo pour piloter une prise DIO fichier /etc/tellstick.conf : <code> 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" } </code> Quelques tâches en cron pour les tests sur IP: <code> */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 </code> Et le script check_device_online.py: <code> #!/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() </code> domotique.txt Dernière modification : 2016/03/21 17:21de madko