Jeedom pilote Sensibo Sky

Oui, Jeedom sait piloter Sensibo Sky. Je vais donc vous parler aujourd’hui de l’interface entre Jeedom et le petit module Sensibo Sky qui pilote les réversibles (et surement d’autres appareils).

Je n’ai pas ce module chez moi mais j’ai eu l’occasion de l’interfacer sur une installation Jeedom pas loin de chez moi. Un point négatif sur ce système est la nécessité du cloud alors qu’un Remotec ZXT-120 fait bien l’affaire et n’a pas besoin d’internet pour fonctionner.

Si vous n’avez pas encore installé le système, je vous invite à suivre ce petit tuto qui explique comment cela fonctionne. Si vous vous apprêtez à le connecter à Jeedom, inutile de suivre la procédure pour la connexion avec Alexa.

Comment cela fonctionne?

Tout d’abord, il est nécessaire de créer une clé API dans l’interface web de votre compte Sensibo et ensuite aller sur chaque appareil enregistré pour y récupérer le numéro d’identification.

Quand tout cela est fait, il faut créer le script sensibo.sh et coller le code suivant:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# Sensibo client parser for Jeedom
# Script de commande via API Sensibo
#
# Le script prend les arguments suivants
#  apikey          Obligatoire : Votre API_KEY
#  -Pod      	Obligatoire : ID du pod en question (issus de https://home.sensibo.com/api/v2/users/me/pods?apiKey=VOTREAPIKEY)
#  arguments optionnels:
#  -h, --help      show this help message and exit
#  -m MARCHE       Action de mise en marche (Marche=True ou Arret=False)
#  -Temp TEMP      Temperature voulue entre 16 et 29
#  -Mode MODE      Mode de fonctionnement (heat, cool, Auto)
#  -Fan FAN_LEVEL  Vitesse Ventilation (Low, medium, high, Auto)
#
# Principe : le principe retenu est le suivant, les arguments de marche (marche), de consigne de temperature (Temp),
# Mode de fonctionnement (Mode) et type de soufflerie a appliquer (Fan) sont optionnel dans le sens ou s'ils ne sont pas renseigne
# il ne seront pas modifie par rapport a l'etat precedent.
# Exemple 1 :
#
# AVANT l'execution de ce script, l'organe pilote par le sensibo est dans l'etat suivant :
# MARCHE = True (l'organe est en marche)
# Temp = 23 (la consigne de temperature est de 23)
# Mode = cool (l'organe est en soufflant froid)
# Fan = Low (l'organe est en petite vitesse)
#
# APRES execution de cette requete : sensibo.sh VOTRE_API_KEY -Mode Auto -Temp 22
# l'organe prendra donc l'etat suivant :
# MARCHE = True (l'organe est toujours en marche car NON RENSEIGNE en argument du script)
# Temp = 22 (la consigne de temperature passe de 23 a 22)
# Mode = Auto (l'organe est en regulation Automatique car renseigne dans les arguments)
# Fan = Low (l'organe est toujours en petite vitesse car NON RENSEIGNE en argument du script)
#
# Divers Exemples :
# 1)pour mettre en marche l'organe : sensibo.sh VOTRE_API_KEY -m True -Pod 123456
# 2)pour mettre a l'arret l'organe : sensibo.sh VOTRE_API_KEY -m False -Pod 123456
# 3)pour mettre en marche l'organe a une temperature voulue (24) sans toucher aux autres parametres: sensibo.sh VOTRE_API_KEY -Temp 24 -Pod 123456
# 4)pour tout modifier d'un coup : sensibo.sh VOTRE_API_KEY -Temp 24 -m True -Mode cool -Fan medium -Pod 123456
# FIN Sensibo client parser for Jeedom

import requests
import json

_SERVER = 'https://home.sensibo.com/api/v2'

class SensiboClientAPI(object):
	def __init__(self, api_key):
		self._api_key = api_key

	def _get(self, path, ** params):
		params['apiKey'] = self._api_key
		response = requests.get(_SERVER + path, params = params)
		response.raise_for_status()
		return response.json()

	def _post(self, path, data, ** params):
		params['apiKey'] = self._api_key
		response = requests.post(_SERVER + path, params = params, data = data)
		response.raise_for_status()
		return response.json()

	def pod_uids(self):
		result = self._get("/users/me/pods")
		pod_uids = [x['id'] for x in result['result']]
		return pod_uids

	def pod_measurement(self, podUid):
		result = self._get("/pods/%s/measurements" % podUid)
		return result['result']

	def pod_ac_state(self, podUid):
		result = self._get("/pods/%s/acStates" % podUid, limit = 1, fields="status,reason,acState")
		return result['result'][0]

	def pod_change_ac_state(self, podUid, on, target_temperature, mode, fan_level):
		self._post("/pods/%s/acStates" % podUid, json.dumps({'acState': {"on": on, "targetTemperature": target_temperature, "mode": mode, "fanLevel": fan_level}}))

	def Ctrl_Marche(self, Marche,last_value):
		if(Marche <> 0) and (Marche == 'True') and (Marche <> last_value):
			return True
		if(Marche <> 0) and (Marche == 'False') and (Marche <> last_value):
			return False
		if(Marche == 0) or (Marche == last_value) :
			return last_value

	def Ctrl_Temp(self,Temp,last_value):
		if(Temp <> 0) and (Temp <> last_value) and (Temp>15) and (Temp<30):
			return Temp
		if(Temp == 0) or (Temp == last_value):
			return last_value

	def Ctrl_Mode(self,mode,last_value):
		liste = ["heat","cool","fan"]
		if(mode <> 0) and (mode <> last_value) and (mode in liste) :
			return mode
		if(mode == 0) or (mode == last_value) :
			return last_value

	def Ctrl_Fan(self,fan_level,last_value):
		liste = ["low","medium","high","Auto"]
		if(fan_level <> 0) and (fan_level <> last_value) and (fan_level in liste) :
			return fan_level
		if(fan_level == 0) or (fan_level == last_value):
			return last_value

if __name__ == "__main__":
	import argparse
	parser = argparse.ArgumentParser(description='Sensibo client parser for Jeedom')
	parser.add_argument('apikey', type = str,help='Obligatoire : Votre API_KEY')
	parser.add_argument('-m', action='store', dest='marche',type = str, default = 0,help='Action de mise en marche (Marche=True ou Arret=False)')
	parser.add_argument('-Temp', action='store', dest='temp',type = int, default = 0,help='Temperature voulue entre 16 et 29')
	parser.add_argument('-Mode', action='store', dest='mode',type = str, default = 0,help='Mode de fonctionnement (heat, cool, Auto)')
	parser.add_argument('-Fan', action='store', dest='Fan_Level',type = str, default = 0,help='Vitesse Ventilation (Low, medium, high, Auto')
	parser.add_argument('-Pod', action='store', dest='Pod',type = str, default = 0,help='Numero du Pod (issus de https://home.sensibo.com/api/v2/users/me/pods?apiKey=VOTREAPIKEY)')

	args = parser.parse_args()
	client = SensiboClientAPI(args.apikey)
	#pod_uids = client.pod_uids()
	pod_uids = args.Pod
	print "apikey : ", args.apikey
	print "Marche : ", args.marche
	print "temp : ", args.temp
	print "mode : ", args.mode
	print "Fan_level : ", args.Fan_Level
	#print "All pod uids:", ", ".join(pod_uids)   
	print "Pod measurement for first pod", client.pod_measurement(pod_uids)
	last_ac_state = client.pod_ac_state(pod_uids)
	print "Last AC change %(success)s and was caused by %(cause)s" % { 'success': 'was successful' if last_ac_state['status'] == 'Success' else 'failed', 'cause': last_ac_state['reason'] }
	print "and the ac WAS %s" % str(last_ac_state['acState'])
	print "Change AC state of %s" % pod_uids

	#validation des arguments
	Marche_Valide = client.Ctrl_Marche(args.marche,last_ac_state['acState']['on'])
	temp_Valide = client.Ctrl_Temp(args.temp, last_ac_state['acState']['targetTemperature'])
	mode_Valide = client.Ctrl_Mode(args.mode,last_ac_state['acState']['mode'])
	Fan_level_Valide = client.Ctrl_Fan(args.Fan_Level,last_ac_state['acState']['fanLevel'])
	#fin de validation

	# client.pod_change_ac_state('uids', True, 23, 'cool', 'auto')
	client.pod_change_ac_state(pod_uids, Marche_Valide, temp_Valide, mode_Valide, Fan_level_Valide)

Je vais être très honnête, j’ai trouvé ce script sur le net (possiblement sur le forum de Jeedom) mais en voulant chercher le lieu exact pour mettre un lien, impossible de le retrouver. C’est donc pour cela que je l’ai mis sur cet article qu’il soit disponible pour le plus grand nombre.

Comment configurer le script?

Il faut après cela créer un équipement script, ainsi qu’une commande (que j’ai appelé pilote) avec les options script / action / message et ajouter au script des arguments. Appelez ensuite le script avec des arguments:

/var/www/html/core/php/../../plugins/script/core/ressources/sensibo.sh votre_clé_API #message# -Pod #title#

commande script sensibo Jeedom

Comment appeler le script?

Il suffit ensuite d’appeler la commande (que ce soit dans un scénario ou le plugin thermostat) en mettant les arguments de température, mode, vitesse du ventilateur dans la zone message de la commande et l’ID de Sensibo dans le titre.

commandes thermostat sensibo Jeedom

Voilà, en suivant cette méthode simple, Jeedom sait piloter Sensibo Sky.

ps: Je conseille fortement d’utiliser un scénario pour gérer un réversible plutôt que le plugin thermostat car ce dernier a une gestion interne de fonctionnement qu’il faut laisser plutôt que d’avoir des allumages et arrêts intempestifs.

Publié le 10 juin 2019
Mis à jour le 8 septembre 2022

1 réflexion sur “Jeedom pilote Sensibo Sky”

  1. Ping : Sensibo Sky sans le plugin thermostat - Didier ROMBAUTS

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *