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

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Dr No
Messages : 130
Inscription : 22 janv. 2015, 17:02
Localisation : Sud de France (Hérault)

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

Message 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.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

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

Message par vil1driver »

Salut,

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

http://easydomoticz.com/domoticz-se-pythonise/
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
frca14
Messages : 3
Inscription : 14 avr. 2015, 09:54

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

Message 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
RPiB Jarvis+LogitechUBS47
RPi3 motionEye+PiCam
RPi2 DomoticzV3.4834+RFLink:4 zones chauffage fil pilote sur GPIO+relais, delestage via blocky, ECS via ITL3500, lumieres, sonnette, portail, sondes température, teleinfo EDF conso+product
iPhone6+Pilot
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

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

Message 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)

Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
Dr No
Messages : 130
Inscription : 22 janv. 2015, 17:02
Localisation : Sud de France (Hérault)

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

Message 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
Répondre