Page 1 sur 1

Récupérer l'état d'un switch dans python ?

Publié : 14 avr. 2015, 16:05
par Dr No
Bonjour à tous,

Hardeux à la retraite nul en soft demande de l'aide !!!

Pour mon projet d'alarme j'ai besoin de récupérer dans un script Python des infos venant d'un switch et du panneau de sécurité. Je sais qu'il y a dans l'API JSON pour Domoticz une commande qui permet cela (/json.htm?type=devices&rid=IDX) seulement je débute juste avec Python et je ne sais pas comment l'utiliser et encore moins comment extraire l'info dont j'ai besoin.

Si quelqu'un sait (ce dont je ne doute pas un instant) un petit coup de main serait le bienvenu.

Merci d'avance.

Re: Récupérer l'état d'un switch dans python ?

Publié : 14 avr. 2015, 17:28
par vil1driver
Salut,

Ça ne réponds pas à ta question mais c'est tjs bon à prendre.

http://easydomoticz.com/domoticz-se-pythonise/

Re: Récupérer l'état d'un switch dans python ?

Publié : 14 avr. 2015, 18:15
par frca14
Bonjour,
A la lecture de l'article tu auras compris que Python et Domoticz ce n'est pas encore si simple.
Si tu n'est pas contre un autre langage de programmation, moi j'utilise ça :

création du script par un

Code : Tout sélectionner

sudo nano monscript.sh
par choix je mets tous mes scripts dans le dossier script de domoticz

le script

Code : Tout sélectionner

#!/bin/bash
# script qui  affiche l etat (ou la valeur) d un bidule (interrupteur, capteur,...)

# j'utilise curl et l'adresse JSON avec l'IP et le port du serveur domoticz
# etat de la commande domoticz a verifier : ici scene/groupe avec idx 1 (numero trouvé dans les dispositifs)
# mais on peut le faire pour les interrupteurs en changeant type=devices
# les donnees brutes sont placees dans la variable DBRUT

DBRUT=$(curl 'http://192.168.1.23:8080/json.htm?type=scenes&idx=1')

# affichage des donnees brutes pour determiner la position des donnees utiles a extraire
echo $DBRUT

# les donnees utiles sont extraites par manipulation de chaine
# (par tatonnement, 374 c'est le premier caractère de la chaine, 2 la longueur de la chaine à extraire
# et les donnees ainsi extraites placees dans la variable DEXTRAITE

DEXTRAITE=${DBRUT:374:2}

# on affiche le contenu de la variable
echo $DEXTRAITE

exit 0
script qu'il faudra rentre exécutable par un chmod +x

Code : Tout sélectionner

sudo chmod +x monscript.sh
Voilà, ce n'est pas forcément le plus élégant (notamment la partie tatonnement !) mais chez moi c'est efficace.
Une fois toutes mes données dans les variables, je peux les comparer entre elles et prévoir des actions avec les fonctions IF THEN ELSE
et la commande curl pour, cette fois, non pas lire un JSON mais commander domoticz.

Bon courage

Re: Récupérer l'état d'un switch dans python ?

Publié : 14 avr. 2015, 20:56
par patrice
Bonsoir
Un petit python
Il y a pas mal de commentaires pour aider
Le paramétrage se fait avec Ip, port,user,password eventuellement

il faut y renseigner l'idx Domoticz à interroger et le terme recherché (batteryLevel dans mon cas ci-dessous)
Attention aux majuscules/minuscules
Les caractères français sont gérés (éèç)

Ce script va chercher dans le bloc 'result' renvoyé par domoticz qui sont les valeurs liées au périphérique (nom, valeur, last update, batterylevel...)


il faut la bibilotheque request (sudo pip install requests)

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import json
import requests
from requests.auth import HTTPBasicAuth


############# Parametres ################################# 

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# les parametres de Domoticz
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

domoticz_ip='192.168.1.82'
domoticz_port='8080'
user=''
password=''

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# les parametres du periphérique
# l'idx Domoticz
# la chaine  recherchée (sensible à la casse)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

domoticz_idx='44'
terme_recherche='BatteryLevel'


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Exemple 
#http://192.168.1.82:8080/json.htm?type=devices&rid=44
# renvoie 
#{ "5MinuteHistoryDays" : 1, "ActTime" : 1429029448, "AllowWidgetOrdering" : true, "DashboardType" : 0, "Latitude" : "44.495849", "Longitude" : "-0.146575", "MobileType" : 0, "TempScale" : 1.0, "TempSign" : "C", "WindScale" : 1.0, "WindSign" : "m/s", "dontcachehtml" : true, "result" : [ { "BatteryLevel" : 255, "Counter" : "4.826", "CounterToday" : "0", "CustomImage" : 0, "Data" : "0, 4.826", "Favorite" : 0, "HardwareID" : 7, "HardwareName" : "Dummy", "HaveTimeout" : true, "ID" : "1407B", "LastUpdate" : "2015-03-13 15:20:08", "Name" : "Geranium_Lumiere_valeur", "Notifications" : "false", "PlanID" : "0", "Protected" : false, "ShowNotifications" : true, "SignalLevel" : 12, "SubType" : "RFXMeter counter", "SwitchTypeVal" : 3, "Timers" : "false", "Type" : "RFXMeter", "TypeImg" : "counter", "Unit" : 1, "Used" : 1, "XOffset" : "0", "YOffset" : "0", "idx" : "44" } ], "status" : "OK", "title" : "Devices" }
#je vois BatteryLevel : 255
# je veux recuperer la valeur de BatteryLevel
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# la valeur est renvoyée dans la variable nommée val

###############  fin des parametres #############################



domoticzurl = 'http://192.168.1.82:8080/json.htm?type=devices&rid='+str(domoticz_idx)
r=requests.get(domoticzurl,auth=HTTPBasicAuth(user,password))
status=r.status_code
if status == 200:
# l'API renvoie 200 si tout est OK
    domoticzjson=r.json()
    for i, v in enumerate(domoticzjson["result"]):
       val= domoticzjson["result"][i][terme_recherche] 
       print (terme_recherche,'= ',val)


Re: Récupérer l'état d'un switch dans python ?

Publié : 15 avr. 2015, 08:56
par Dr No
WAHOO !!! ;)

Merci à tous pour votre aide.
Bonjour et un grand merci Patrice pour ton intervention; je vais essayer cela tout de suite