Parser une requete Json domoticz dans un script python

Vous avez des questions concernant les scripts dans Domoticz, posez vos questions ici, quelque soit le langage nous tenterons des réponses pertinentes ...
Répondre
nb56
Messages : 2
Enregistré le : 14 juin 2019, 20:03

Parser une requete Json domoticz dans un script python

Message par nb56 » 14 juin 2019, 20:50

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

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


papoo
Messages : 1849
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Parser une requete Json domoticz dans un script python

Message par papoo » 14 juin 2019, 22:32

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'])
    
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

nb56
Messages : 2
Enregistré le : 14 juin 2019, 20:03

Re: Parser une requete Json domoticz dans un script python

Message par nb56 » 14 juin 2019, 23:59

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

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre