====== Jeedom sur Raspberry PI 2 ou 3 ======
Avec l'installation via Docker.
pacman -S docker
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:
docker pull sbeuzit/rpi-jeedom-data
docker run --name data sbeuzit/rpi-jeedom-data
Cette image ne sert que pour conserver les données. Il faut ensuite un containeur pour la partie MySQL :
docker pull hypriot/rpi-mysql
docker run --name jeedom-mysql -e MYSQL_ROOT_PASSWORD=my_mysql_password --volumes-from data -d hypriot/rpi-mysql
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 :
docker run -d --link jeedom-mysql:mysql --device=/dev/ttyUSB0:/dev/ttyUSB0 --name jeedom -p 80:80 -p 8083:8083 -p 443:443
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 :
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()