Page 1 sur 1

Parser une requete Json domoticz dans un script python

Publié : 14 juin 2019, 20:50
par nb56
Bonjour a tous

nouveau sur le forum, donc tout d'abord merci à tous pour vos contributions qui m'ont bien aidées jusqu'à présent.

Je fais tourner domoticz sur un raspberry pi et j'ai développé un petit script en python pour piloter une régulation en vitesse de mon ventilateur de refroidissement cpu (pour la beauté du geste bien sur, le brancher sur le +5V était trop simple.)

je pilote la vitesse via un petit module mosfet que j'alimente par un signal pwm depuis un gpio du pi.
pou ceux que ça intéresse je peux vous expliquer ce que j'ai fait.

mon script python régule ce signal pwm envoyé sur le gpio du PI selon l'écart de temperature entre la temperature du cpu et une consigne que je choisis.

Le lien avec domoticz :
j'envoie déjà sur un dummy device "vitesse ventilateur" la consigne de vitesse du ventilateur (en % de 0 à 100). J'utilise une requete JSON pour cela qui met a jour domoticz depuis mon script python.

Dans l'autre sens, je cherche maintenant à utiliser un device "thermostat" que j'ai créé dans domoticz qui fixerait ma valeur de consigne (je lirait la valeur réglée sur ce dispositif dans mon script python pour définir la consigne a atteindre).

ma difficulté est que je ne parviens pas à récupérer ("parser le json" pour les experts) la valeur de ce dispositif dans une variable exploitable dans mon script python.

voici a quoi ressemble le résultat de ma requete JSON sur ce dispositif thermostat :

{
"ActTime" : 1560537310,
"AstrTwilightEnd" : "01:20",
"AstrTwilightStart" : "03:05",
"CivTwilightEnd" : "22:52",
"CivTwilightStart" : "05:33",
"DayLength" : "15:58",
"NautTwilightEnd" : "23:49",
"NautTwilightStart" : "04:36",
"ServerTime" : "2019-06-14 20:35:10",
"SunAtSouth" : "14:13",
"Sunrise" : "06:13",
"Sunset" : "22:12",
"app_version" : "4.10717",
"result" : [
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 0,
"Data" : "40.0",
"Description" : "",
"Favorite" : 1,
"HardwareID" : 9,
"HardwareName" : "VENTILATEUR RPI",
"HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
"HardwareTypeVal" : 15,
"HaveTimeout" : false,
"ID" : "0014078",
"LastUpdate" : "2019-06-14 20:16:41",
"Name" : "Consigne régul temp RPI",
"Notifications" : "false",
"PlanID" : "0",
"PlanIDs" : [ 0 ],
"Protected" : true,
"SetPoint" : "40.0",
"ShowNotifications" : true,
"SignalLevel" : "-",
"SubType" : "SetPoint",
"Timers" : "false",
"Type" : "Thermostat",
"TypeImg" : "override_mini",
"Unit" : 1,
"Used" : 1,
"XOffset" : "0",
"YOffset" : "0",
"idx" : "40"
}
],
"status" : "OK",
"title" : "Devices"
}


Je veux récupérer dans une variable la valeur du champ "Data" ou celle du champ "Setpoint" qui valent ici "40.0"

mes essais de scripts :

Code : Tout sélectionner

import urllib2, json
Requete='http://192.168.1.29:8080/json.htm?type=devices&rid=40'
RawData=json.loads(urllib2.urlopen(Requete).read())
Status=str(RawData['status'])
print Status
ce script affiche le champ "status" à "OK", ça marche

Code : Tout sélectionner

import urllib2, json
Requete='http://192.168.1.29:8080/json.htm?type=devices&rid=40'
RawData=json.loads(urllib2.urlopen(Requete).read())
Status=str(RawData['Data'])
print Status
ce script ne fonctionne pas pour récupérer ma variable.

Code erreur:
Traceback (most recent call last):
File "3.test.py", line 8, in <module>
Status=str(RawData['Data'])
KeyError: 'Data'
------------------
(program exited with code: 1)
Press return to continue

quelqu'un peut-il m'aider a corriger mon script ?

Merci

Re: Parser une requete Json domoticz dans un script python

Publié : 14 juin 2019, 22:32
par papoo
en python3

Code : Tout sélectionner

import requests
import chardet
import json
url = 'http://192.168.1.29:8080/json.htm?type=devices&rid=40'
Response = requests.get(url)

if(Response.ok):
    result = json.loads(Response.content.decode(chardet.detect(Response.content)["encoding"]))
    print (result['result'][0]['SetPoint'])
    print (result['result'][0]['Data'])
    

Re: Parser une requete Json domoticz dans un script python

Publié : 14 juin 2019, 23:59
par nb56
Merci, ça marche nickel.

J'ai fait une fonction qu'il n'y a qu'à appeler pour récupérer la consigne depuis domoticz (avec un float pour récupérer un chiffre et pas une string):

Code : Tout sélectionner

def recup_consigne():
	global consigne_temp
	Response = requests.get('http://192.168.1.29:8080/json.htm?type=devices&rid=40')
	if(Response.ok):
		result = json.loads(Response.content.decode(chardet.detect(Response.content)["encoding"]))
		consigne_temp=float(result['result'][0]['SetPoint'])
	else:
		consigne_temp=40
	return