[Tuto] MyHome BUS SCS Legrand/Bticino

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

[Tuto] MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

Bonjour à tous,

En 2010 quand j'ai refait l'électricité à 100% de ma maison j'en ai profité pour installer quelques modules domotiques de la gamme MyHome:
- 2 sondes de température dans la partie jour (séjour) et dans la partie nuit (ma chambre)
- 11 modules pour piloter les volets roulants
- 1 compteur pour l'élec
- 1 écran tactile 3,5"
- 1 modules 4 sorties pour la VMC et l'extracteur de cave

Le temps passant mes envies d'améliorer le système grandissaient.
Puis un jour je découvre le raspberry, puis Domoticz, puis l’existence d'une passerelle IP lowcost pour communiquer avec le système MyHome.
Et voilà je commande l'ensemble, j'installe le tout et les premières questions se posent....

Je viens partager cette expérience afin que ceux qui sont frustrés avec leur système MyHome parce qu’ils pensent qu'il est fermé, puissent goûter aux joies du DIY.

De quoi a-t-on besoin ?
- d'ouvrir un compte sur http://www.myopen-legrandgroup.com/. On y trouvera toute la documentation nécessaire sur le OPENWEBNET le protocole de communication.
- d'une passerelle Lowcost F455 de legrand ou de l'équivalent en Bticino. Cette passerelle est modulaire et prend 1 module dans votre tableau électrique (elle a la forme et la taille d'un disjoncteur mono). Elle coûte 168€TTC sur materielélectrique.com. j'ai de la chance étant du métier je l'ai eue pour 74€TTC.
- de se documenter sur les sockets
- de se mettre au python si ce n'est pas déjà fait (car les sockets en lua j'ai vite abandonné).

Je vais vous montrer un script qui permet de commander l'ouverture du volet avec la configuration A=4 et PL=2.

d'abord il faut traduire en OpenWenNet (OWN), le message à transmettre
ouvre le volet avec l'@ 42
pour cela on regarde la doc associée :"AUTOMATION WHO=2"
(oui dans le langage OWN on parle en WHO, WHAT, WHERE et aussi en * et #)

on trouve dans la doc que pour envoyer un ordre à un volet la syntaxe du message est :
*2*WHAT*WHERE##
avec WHAT = 0 pour STOP, =1 pour UP, =2 pour DOWN
et WHERE = l'@ du volet

et voici donc le script

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

# Initialisation des paramètres du socket
BufferSize=2048 #taille du buffer se référer à la doc python sur les socket
IpF455='xxx.xxx.xxx.xxx' #@IP de la passerelle
PortF455=20000 # port pour commande opennwebnet
#*****************************
  
#Envoie du message
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IpF455,PortF455))
data=s.recv(BufferSize)
s.send("*99*0##")#ouverture d'une session COMMAND
data=s.recv(BufferSize)
message="*2*1*42##"
s.send(message)
data=s.recv(BufferSize)
s.close()
et c'est tout !! 9 lignes de codes !!!

Ce script peut être associé à la commande de volet de Domoticz

J'espère que ce petit tuto encouragera certains possesseurs de sytème MyHome à se lancer
Dernière modification par allezlelosc le 03 févr. 2016, 09:52, modifié 2 fois.
lbeyaert
Messages : 4
Inscription : 02 févr. 2016, 17:57

Re: MyHome BUS SCS Legrand/Bticino

Message par lbeyaert »

OK ça fonctionne.
Ne pas oublier de mettre l'adresse ip sous cette forme 'xxx.xxx.xxx.xxx'
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

Re: MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

lbeyaert a écrit :OK ça fonctionne.
Ne pas oublier de mettre l'adresse ip sous cette forme 'xxx.xxx.xxx.xxx'

ok merci j'ai corrigé, dans le script original j'utilise ConfigParser pour les "constantes" en modifiant j'ai oublié les ' '
Jihem
Messages : 337
Inscription : 19 sept. 2014, 13:04
Localisation : Finistère Sud

Re: MyHome BUS SCS Legrand/Bticino

Message par Jihem »

lbeyaert a écrit :OK ça fonctionne.
Ne pas oublier de mettre l'adresse ip sous cette forme 'xxx.xxx.xxx.xxx'
Ne pas oublier non plus d’activer les plages d'adresse ip de la passerelle (F454 dans mon cas).

Sinon ça fonctionne très bien et bien plus rapidement qu'avec l'appli Legrand.

Il y à même maintenant dans l'onglet matériel de Domoticz une ligne MyHome OpenWebNet associé à un interrupteur volet qui permet de commander directement un volet sans passer par le script. on attend les lumières.

Seule ombre au tableau, l'information ne remonte pas dans dans Domoticz quand le bouton physique est actionné? L'info est bien dans les logs mais je ne sais pas comment la récupérer.
Des idées?
Hard:Raspberry Pi4 + SSD Arduino Tablette murale Archos
Soft: Domoticz WireGuard vpn Homebridge Tradfri Ikea
Devices:[/colore]Rfxtrx433 DI-O Chacon Sonoff touch Anémomètre, pluviometre, sondes Orégon, capteurs humidité Miflora, téléinfo
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

Re: MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

Bonjour Jihem,

alors pour scruter les infos qui passent sur le bus c'est tout un programme (ou un script dans ce cas :D ) ! Notamment pour connaitre la position des volets comme je l'ai développé de mon côté.

sans entrer dans les détails voilà comment je procède :

j'ai un script qui tourne en continu et qui scrute l'ensemble des messages véhiculés sur le bus SCS.
Dès qu'un message parle d'un volet je l'enregistre dans une base de données.

d'un autre côté j'ai un script qui lit la base de données et calcule quand il le faut la nouvelle position du volet.

Voici le script qui me permet d'alimenter la base de données.

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys,socket,ConfigParser,urllib2,time,sqlite3
from modules_SSO import *

# Initilisation des paramétres standards
cfg=ConfigParser.ConfigParser()
cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
buffer_size=cfg.getint('Param_F455','buffer_size')
ip_F455=cfg.get('Param_F455','ip') # IP passerelle F455
port_F455=cfg.getint('Param_F455','port') # port pour commande opennwebnet
ip_domo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
port_domo=cfg.getint('Param_domoticz','port') # port seveur domoticz

while True:
  #Connection ou Création de la base de données
  conn=sqlite3.connect('/home/pi/domoticz/scripts/python/volet/synchronisation/synchronisation.db')
  cursor=conn.cursor()
  Cursor2=conn.cursor()
  Cursor3=conn.cursor()
  #Création des tables si elles n'existent pas
  cursor.execute('''CREATE TABLE IF NOT EXISTS historique(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, adresse TEXT, trame TEXT, horodatage FLOAT, checked BIT)''')
  Cursor2.execute('''CREATE TABLE IF NOT EXISTS synchro(IdVolet INTEGER PRIMARY KEY UNIQUE, UnSynchro BIT,LastPosition INTEGER)''')
  Cursor3.execute('''SELECT * FROM synchro''')
  reponse=Cursor3.fetchone()
  if reponse==None:
    ListeVolet=[11,12,21,22,31,41,42,51,61,71,81,0,1,2,4]
    for volet in ListeVolet:
      Cursor3.execute('''INSERT INTO synchro(IdVolet,UnSynchro,LastPosition) VALUES (?,?,?)''',(volet,0,100)) 
  conn.commit()
  conn.close()
  #Lancement du Socket
  s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((ip_F455,port_F455))
  s.send('')
  data=s.recv(buffer_size)
  s.send("*99*1##")
  data=s.recv(buffer_size)
  ListeVolet=[11,12,21,22,31,41,42,51,61,71,81]
  while True:
    data = s.recv(buffer_size)
    if data=='':
      s.close()
      break
    else:
      while data.count('##')>0:
        i=data.find('##')+2
        trame=data[0:i]
        if trame[:3]=='*2*':
          Adresse=trame[-4:-2]
          if Adresse[0]!='*':
            conn=sqlite3.connect('/home/pi/domoticz/scripts/python/volet/synchronisation/synchronisation.db')
            cursor=conn.cursor()
            cursor.execute('''INSERT INTO historique(adresse,trame,horodatage,checked) VALUES(?,?,?,?)''',(Adresse,trame,time.time(),'0'))
            conn.commit()
            conn.close()
          elif Adresse=='*0':
            conn=sqlite3.connect('/home/pi/domoticz/scripts/python/volet/synchronisation/synchronisation.db')
            cursor=conn.cursor()
            TimeStamp=time.time()
            for volet in ListeVolet:
              cursor.execute('''INSERT INTO historique(adresse,trame,horodatage,checked) VALUES(?,?,?,?)''',(volet,trame,TimeStamp,'0'))
            conn.commit()
            conn.close()
          else:
            Adresse1=Adresse[1]+'1'
            Adresse2=Adresse[1]+'2'
            conn=sqlite3.connect('/home/pi/domoticz/scripts/python/volet/synchronisation/synchronisation.db')
            cursor=conn.cursor()
            TimeStamp=time.time()
            cursor.execute('''INSERT INTO historique(adresse,trame,horodatage,checked) VALUES(?,?,?,?)''',(Adresse1,trame,TimeStamp,'0'))
            cursor.execute('''INSERT INTO historique(adresse,trame,horodatage,checked) VALUES(?,?,?,?)''',(Adresse2,trame,TimeStamp,'0'))
            conn.commit()
            conn.close()
        data=data[i:]
s.close()
Jihem
Messages : 337
Inscription : 19 sept. 2014, 13:04
Localisation : Finistère Sud

Re: MyHome BUS SCS Legrand/Bticino

Message par Jihem »

Bonsoir
Bien sur! il vaut mieux aller chercher l'info à la base que dans les logs de Domoticz.
je vais m'y atteler; je ne suis pas très à à l'aise avec python mais ton exemple va bien me servir (comme le 1er d'ailleurs) .
Une question; pourquoi enregistres-tu les infos dans une base plutôt que d’envoyer,depuis ton script, une URL vers Domoticz pour mettre à jour l'état d'un matériel?
Merci
Hard:Raspberry Pi4 + SSD Arduino Tablette murale Archos
Soft: Domoticz WireGuard vpn Homebridge Tradfri Ikea
Devices:[/colore]Rfxtrx433 DI-O Chacon Sonoff touch Anémomètre, pluviometre, sondes Orégon, capteurs humidité Miflora, téléinfo
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

Re: MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

Une question; pourquoi enregistres-tu les infos dans une base plutôt que d’envoyer,depuis ton script, une URL vers Domoticz pour mettre à jour l'état d'un matériel?
c'est vrai que je n'ai pas donné beaucoup de détail sur ce que je voulais faire : je veux avoir la position (pourcentage d'ouverture) du volet et l'afficher dans domoticz à l'aide d'un "blinds percentage". je voulais également pouvoir (en une seule action) positionner le volet à l'ouverture souhaitée.

Je ne me souviens plus de la réflexion, mais j'en suis arrivé à l'utilisation du BdD qui trace les actions sur les volets. en voici un extrait :
extrait BdD.png
extrait BdD.png (15.75 Kio) Consulté 18100 fois
à partir de ces données j'arrive à connaître qui a fait quoi et à quel moment. Du coup je sais si je dois mettre à jour les valeurs de domoticz et à calculer la position des volets en fonction des écarts de temps entre les différents message.

voilà
Jihem
Messages : 337
Inscription : 19 sept. 2014, 13:04
Localisation : Finistère Sud

Re: MyHome BUS SCS Legrand/Bticino

Message par Jihem »

OK
j'ai compris ta démarche. Pour ma part, dans un premier temps je ne cherche qu'a mettre à jour l'état d'un interrupteur lumière dans Domoticz.

Dans les logs de Domoticz quand j'actionne un inter,j'ai le retour de l'action qui à été envoyée

Code : Tout sélectionner

2016-10-17 15:53:13.492 COpenWebNet : received=*1*0*42## : NORMAL FRAME - who=Lighting - what=0 - where=42
mais j'ai aussi à intervalle régulier le relevé des sondes de température alors qu'il n’y a pas de capteurs virtuels pour cette fonction

Code : Tout sélectionner

 2016-10-17 16:04:54.104 COpenWebNet : received=*#4*1*0*0220## : MEASURE FRAME
2016-10-17 16:04:54.624 COpenWebNet : received=*4*102*1## : NORMAL FRAME - who=Temperature control - what=102 - where=1
2016-10-17 16:04:55.184 COpenWebNet : received=*#4*2*0*0220## : MEASURE FRAME
2016-10-17 16:04:55.714 COpenWebNet : received=*#4*4*0*0221## : MEASURE FRAME 
.
Je me demande d’où sortent ces informations.
Est ce Domoticz qui envoi une requête générale sur le BUS SCS ou bien le BUS qui génère ça?

Par ailleurs quand j’envoie un script de status, la commande a la forme:

Code : Tout sélectionner

message="#*1*42##"
j'ai l'impression que le premier hash fait passer le reste en commentaire et je n'ai pas le retour en console ou dans les logs.

J'essaye de comprendre un peu comment tout cela fonctionne et tu semble bien maitriser le sujet.
Merci
Hard:Raspberry Pi4 + SSD Arduino Tablette murale Archos
Soft: Domoticz WireGuard vpn Homebridge Tradfri Ikea
Devices:[/colore]Rfxtrx433 DI-O Chacon Sonoff touch Anémomètre, pluviometre, sondes Orégon, capteurs humidité Miflora, téléinfo
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

Re: MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

Bonjour Jihem,
Je me demande d’où sortent ces informations.
Est ce Domoticz qui envoi une requête générale sur le BUS SCS ou bien le BUS qui génère ça?
Non ça se passe de manière automatique du côté myhome
les sondes de température comme l'heure/date du système sont envoyées périodiquement sur le bus.

je pense que domoticz fonctionne un peu comme le script que j'ai posté : à l'ouverture du socket, il ouvre une session EVENT ("*99*1##") en non COMMAND ("*99*0##") du coup tous les messages du bus sont captés.

pour toi te familiariser avec les trames qui passent sur le bus je te conseille de tester ce script qui trace dans la console tous les messages qui passent.

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

#Paramètres de connexion à la passerelle BUS/SCS
buffer_size =2048
ip_F455='192.168.0.21'
port_F455=20000

#ouverture du socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip_F455,port_F455))
s.send('')
data=s.recv(buffer_size)
print data
s.send("*99*1##")
data=s.recv(buffer_size)
print data
a=1
while a==1:
  data = s.recv(buffer_size)
  print data
s.close()
Pour ce qui est de la synchro d'un interrupteur voici un script qui me permet de synchroniser l'interrupteur pilotant la GV de la VMC.

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""CheckFan.py : Script qui synchronise l'état du ventilateur entre MyHome et Domoticz"""

__namescript__='CheckFan.py'
__author__= 'SSO'
__version__= '1.0'
__status__= 'Exploitation'
__created__ = '12/2/16'
__modified__ = '15/2/2016'

import sys
import SCS
import DbError
import ConfigParser
import DomoJson
import time

#Récupération des variables passées en argument
if len(sys.argv)==2: 
  Where=sys.argv[1]
elif len(sys.argv)==1:
  DbError.Write(__namescript__,'Manque argument Where')
  sys.exit(0)
else:
  DbError.Write(__namescript__,"Trop d'arguments")
  sys.exit(0)
#***********************************************

#On récupère l'Idx Domoticz correspondant à Where
Cfg=ConfigParser.ConfigParser()
Cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
Idx=Cfg.getint('Idx',Where)
#**************************************************

time.sleep(10)

#Test de l'état du ventilateur du côté Myhome
StatusMyHome=SCS.LightRequest(Where)
if StatusMyHome[0:4]=='Err.':
  DbError.Write(__namescript__,StatusMyHome)
  sys.exit(0)
else:
  if StatusMyHome=='1':
    StatusMyHome='On'
  else:
    StatusMyHome='Off'
#***************************************************

#Test de l'état du ventilateur du côté Domoticz
StatusDomo=DomoJson.Read(Idx,3)
if StatusDomo[0:4]=='Err.':
  DbError.Write(__namescript__,StatusDomo)
  sys.exit(0)
elif StatusDomo!='Off' and StatusDomo!='On':
  StatusDomo='BadStatus :'+StatusDomo
  DbError.Write(__namescript__,StatusDomo)
  sys.exit(0)
#***************************************************

#Si les états sont différents on synchronise
if StatusMyHome!=StatusDomo:
  Status=DomoJson.WriteSwitch(Idx,StatusMyHome)
  if Status!='OK':
    DbError.Write(__namescript__,"Erreur lors de l'envoi de la synchronisation")
#***************************************************
allezlelosc
Messages : 49
Inscription : 21 oct. 2015, 21:34

Re: MyHome BUS SCS Legrand/Bticino

Message par allezlelosc »

pour aider à la compréhension des scripts postés voici deux modules que j'utilise pour faciliter la prog des scripts :

(à positionner dans le pythonpath avec les bons privilèges)

DomoJson qui gère quelques appels à l'API JSON

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""DomoJson.py : Ensemble de fonctions pour communiquer avec Domotcz via son API Json"""

__author__= 'SSO'
__version__= '1.0'
__status__= 'Developpement'
__created__ = '8/2/16'
__modified__ = '12/2/16'

import urllib2
import ConfigParser
import json


  
def Read(Idx,IdLabel,UserVar=0):
  LabelList=['LastUpdate','Temp','Percent','Data']
  Label=LabelList[IdLabel]
  
  # Initilisation des paramètres standards
  Cfg=ConfigParser.ConfigParser()
  Cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=Cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=Cfg.get('Param_domoticz','port') # port seveur domoticz

  if UserVar==0:
    Requete="http://%s:%s/json.htm?type=devices&rid=%s" % (IpDomo,PortDomo,Idx)
  elif UserVar==1:
    Requete="http://%s:%s/json.htm?type=command&param=getuservariable&idx=%s" % (IpDomo,PortDomo,Idx)
  else:
    return 'Err. Argument UserVar'
  RawData=json.loads(urllib2.urlopen(Requete).read())
  if Label=='Percent':
    Data=RawData['result'][0]['Data']
  else:
    Data=RawData['result'][0][Label]
  if IdLabel==0:
    import time
    Data=time.mktime(time.strptime(Data,'%Y-%m-%d %H:%M:%S'))
  elif IdLabel==1:
    Data=float(Data)
  elif IdLabel==2:
    Percent=''
    for i in Data:
      if i!='%':
        Percent=Percent+i
    Data=float(Percent)
  elif IdLabel==3:
    Data=str(Data)
  return Data

def WriteUserVar(Idx,Value):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz

  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=updateuservariable&idx=%s&vname=uservariablename&vtype=uservariabletype&vvalue=%s" % (IpDomo,PortDomo,Idx,Value)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WriteTemp(Idx,Temperature):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  
  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=udevice&idx=%s&nvalue=0&svalue=%s" % (IpDomo,PortDomo,Idx,Temperature)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WritePercent(Idx,Value):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz

  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=udevice&idx=%s&nvalue=0&svalue=%s" % (IpDomo,PortDomo,Idx,Value)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WriteSwitch(Idx,Ordre):
  if Ordre==0:
    Ordre='Off'
  elif Ordre==1:
    Ordre='On'
  elif Ordre.upper()=='OFF':
    Ordre= 'Off'
  elif Ordre.upper()=='ON':
    Ordre= 'On'
  else:
    return 'Not a valid order'
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  
  Requete="http://%s:%s/json.htm?type=command&param=switchlight&idx=%s&switchcmd=%s" % (IpDomo,PortDomo,Idx,Ordre)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WriteTempHumid(Idx,Temperature,Humidity):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  
  #Requête JSON
  if Humidity>65:
    HumidityState='3'
  elif Humidity<40:
    HumidityState='2'
  else:
    Humidity='1'
  Requete="http://%s:%s/json.htm?type=command&param=udevice&idx=%s&nvalue=0&svalue=%f;%d;%s" % (IpDomo,PortDomo,Idx,Temperature,Humidity,HumidityState)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WritePrecipIntensity(Idx,PrecipIntensity):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  
  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=udevice&idx=%s&nvalue=0&svalue=??;%f" % (IpDomo,PortDomo,Idx,PrecipIntensity)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status

def WritePressure(Idx,Pressure):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  
  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=udevice&idx=%s&nvalue=0&svalue=%d" % (IpDomo,PortDomo,Idx,Pressure)
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status


def WriteSwitchLevel(Idx,Level):
  # Initilisation des paramètres standards
  cfg=ConfigParser.ConfigParser()
  cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  IpDomo=cfg.get('Param_domoticz','ip') # IP serveur domoticz
  PortDomo=cfg.getint('Param_domoticz','port') # port seveur domoticz
  Level="Set%20Level&level="+str(Level)
    
  #Requête JSON
  Requete="http://%s:%s/json.htm?type=command&param=switchlight&idx=%s&switchcmd=" % (IpDomo,PortDomo,Idx)
  Requete=Requete+Level
  print Requete
  RawData=json.loads(urllib2.urlopen(Requete).read())
  Status=str(RawData['status'])
  return Status
et SCS qui gère quelques trames myhome

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""SCS.py : Ensemble de fonctions pour communiquer avec le bus SCS"""

__namescript__='SCS.py'
__author__= 'SSO'
__version__= '1.0'
__status__= 'Developpement'
__created__= '8/2/16'
__modified__= '12/2/16'

import socket
import ConfigParser
from types import *


def SendMessageToScs(Message): 
  # Initilisation des paramètres du scocket
  Cfg=ConfigParser.ConfigParser()
  Cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  BufferSize=Cfg.getint('Param_F455','buffer_size')
  IpF455=Cfg.get('Param_F455','ip')
  PortF455=Cfg.getint('Param_F455','port')
  #*****************************
  
  #Envoie du message
  Soc=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  Soc.connect((IpF455,PortF455))
  DataRecv=Soc.recv(BufferSize)
  if DataRecv!='*#*1##':
    DataRecv='Err.SocketFailed'
  else:
    Soc.send("*99*0##")#ouverture d'une session COMMAND
    DataRecv=Soc.recv(BufferSize)
    if DataRecv=='*#*0##':
     DataRecv='Err.CommandSessionFailed'
    else:
      Soc.send(Message)
      DataRecv=Soc.recv(BufferSize)
  Soc.close()
  return DataRecv

def SendRequestToScs(Message):
  # Initilisation des paramètres du scocket
  Cfg=ConfigParser.ConfigParser()
  Cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
  BufferSize=Cfg.getint('Param_F455','buffer_size')
  IpF455=Cfg.get('Param_F455','ip')
  PortF455=Cfg.getint('Param_F455','port')
  #*****************************
  
  #Envoie du message
  Soc=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  Soc.connect((IpF455,PortF455))
  DataRecv=Soc.recv(BufferSize)
  if DataRecv!='*#*1##':
    DataRecv='Err.SocketFailed'
  else:
    Soc.send("*99*0##")#ouverture d'une session COMMAND
    DataRecv=Soc.recv(BufferSize)
    if DataRecv=='*#*0##':
     DataRecv='Err.CommandSessionFailed'
    else:
      Soc.send(Message)
      DataRecv=Soc.recv(BufferSize)
      Ack=Soc.recv(BufferSize)
      if DataRecv[-4:]!=Message[-4:]:
        DataRecv='Err.RequestFailed'
      else:
        DataRecv=DataRecv[3]
  Soc.close()
  return DataRecv

def LightCommand(What,Where):
  Where=str(Where)
  if type(What) is StringType:
    What=What.upper()
    if What=='ON':
        What='1'
    elif What=='OFF':
        What='0'
  elif type(What) is IntType:
    What=str(What)
  else:
      Answer='BadWhat'
      return Answer
  Message="*1*%s*%s##" % (What,Where)
  Answer=SendMessageToScs(Message)
  if Answer=='*#*1##':
    Answer = 'CommandSucceeded'
  else:
    Answer ='Err.CommandFailed'
  return Answer

def LightRequest(Where):
  Where=str(Where)
  Message='*#1*%s##' % (Where)
  Answer=SendRequestToScs(Message)
  if Answer=='Err.RequestFailed':
    Answer=SendRequestToScs(Message)
  return Answer
Répondre