Page 1 sur 1

extraction en lua - encore

Publié : 22 oct. 2015, 17:46
par oudini
Bonjour à tous,
pour tenter de corriger la valeur des HC dont le coût est mal chiffré par Domoticz qui les compte au tarif HP, je cherche à récupérer le contenu du champ Aujourd'hui: de mon compteur HC mais je n'y arrive pas, vôtre aide serait la bienvenue :)
Si vous connaissez un tuto ou autre détaillant l'extraction des champs ça me conviendrait aussi.

Donc, quand je lance cette commande:

Code : Tout sélectionner

http://192.168.1.16:8080/json.htm?type=devices&rid=83
j'obtiens en réponse:

Code : Tout sélectionner

{
   "ActTime" : 1445431584,
   "ServerTime" : "2015-10-21 14:46:24",
   "Sunrise" : "08:17",
   "Sunset" : "18:51",
   "result" : [
      {
         "AddjMulti" : 1.0,
         "AddjMulti2" : 1.0,
         "AddjValue" : 0.0,
         "AddjValue2" : 0.0,
         "BatteryLevel" : 255,
         "CounterToday" : "11.000 kWh",
         "CustomImage" : 0,
         "Data" : "55402.000 kWh",
         "Description" : "",
         "Favorite" : 1,
         "HardwareID" : 4,
         "HardwareName" : "MS USB Gateway 88",
         "HardwareType" : "MySensors Gateway USB",
         "HardwareTypeVal" : 41,
         "HaveTimeout" : false,
         "ID" : "00000614",
         "LastUpdate" : "2015-10-21 14:27:32",
         "Name" : "Index_HC",
         "Notifications" : "false",
         "PlanID" : "0",
         "PlanIDs" : [ 0 ],
         "Protected" : false,
         "ShowNotifications" : true,
         "SignalLevel" : 12,
         "SubType" : "kWh",
         "SwitchTypeVal" : 0,
         "Timers" : "false",
         "Type" : "General",
         "TypeImg" : "current",
         "Unit" : 1,
         "Usage" : "0.0 Watt",
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "83"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}
         "Type" : "General",
         "TypeImg" : "current",
         "Unit" : 1,
         "Usage" : "0.0 Watt",
         "Used" : 1,
         "XOffset" : "0",
         "YOffset" : "0",
         "idx" : "83"
      }
   ],
   "status" : "OK",
   "title" : "Devices"
}

Donc, comment faire en lua pour extraire les 11.000 du champ "CounterToday" : "11.000 kWh" et non la valeur du champ "Data" ?
A défaut comment le faire en json ?

Merci de votre aide

Re: extraction en lua - encore

Publié : 22 oct. 2015, 20:06
par heartblood
Salut!
Tu es fixé lua ou tu peux faire ton script en bash ?
En bash, tu peux facilement le faire en suivant ce tuto : http://easydomoticz.com/manipuler-les-d ... -en-shell/
Et jeté un coup d'oeil ici : viewtopic.php?f=5&t=758#p5845

PS : tu peux très bien utiliser "os.execute" avec jq et curl dans ton script lua. Voir : http://www.domoticz.com/wiki/Battery_le ... ing_system

Re: extraction en lua - encore

Publié : 22 oct. 2015, 22:24
par oudini
Merci heartblood pour ta réponse rapide, c'est exactement ce que je cherchais.

Je suis content que ce soit toi qui réponde car tu a soulevé, dans un autre fil, le problème du micmac dans les calculs des tarifs:
Oui aussi, si tu cherches simplement à voir ta conso et ton tarif. Mais le système HC / HP ne fonctionne que si son module virtuel possède 2 valeurs (HC / HP), sinon le rapport sera faussé vu qu'il se base uniquement sur un tarif.
C'est justement ce que je suis en train d'essayer de résoudre. Dans mon cas j'ai deux compteurs qui fonctionnent indépendamment, un pour les HC pour lequel dz utilise le tarif T1 au lieu du T2, ce qui est mauvais) et un pour les HP pour lequel dz utilise T1, ce qui est correct.
Je n'ai pas le choix des compteurs, j'utilise MySensors pour ma téléinfo et le programme fourni deux compteurs distincts reconnus automatiquement. Je voudrais regrouper les valeurs des deux compteurs dans un P1 smart meter et ainsi laisser Domoticz utiliser les deux tarifs.

Sais-tu si ce cas à déjà été résolu par quelqu'un ? Dit autrement, existe-t-il une façon d'obliger Domoticz à utiliser le tarif T2 au lieu du T1 dans le calcul du coût des HC?

Merci encore pour ton aide

Re: extraction en lua - encore

Publié : 22 oct. 2015, 23:34
par Steph38
Voici en python ca peu interreser du monde

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: latin-1 -*-

'''
Émission d'un message par le Raspberry Pi,
qui sera transmis à 433 MHz par un émetteur
relié à la pin GPIO 25
Nécessite la présence du fichier vw.py dans le 
même répertoire.
http://www.raspberrypi.org/forums/viewtopic.php?t=84596&p=598087

'''

import time

import pigpio

import vw

import json
import requests
from requests.auth import HTTPBasicAuth

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

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

domoticz_ip='192.168.1.103'
domoticz_port='8080'
user=''
password=''

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

domoticz_idx='14'
terme_recherche='Data'


#===================
domoticzurl = 'http://192.168.1.108: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(val)

#============================
domoticz_idx='33'
terme_recherche='BatteryLevel'


#===================
domoticzurl = 'http://192.168.1.108: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"]):
       val1= domoticzjson["result"][i][terme_recherche]
       
print(val1)

if val1==100:

	TX=25

	BPS=2000 

	pi = pigpio.pi()

	tx = vw.tx(pi, TX, BPS)

	compteur = 0

	start = time.time()

	while (time.time()-start) < 5:
		compteur += 1

		while not tx.ready():
			time.sleep(0.1)

		time.sleep(0.2)

  		while not tx.ready():
  			time.sleep(0.1)

		time.sleep(0.2)
		print ("envoi")

  # tx.put("Bonjour, ici le Raspberry Pi!  Message #{}.".format(compteur))

		tx.put("{}.".format(val))
	
	tx.cancel()

	pi.stop()

Re: extraction en lua - encore

Publié : 22 oct. 2015, 23:57
par oudini
Merci pour ton message Steph38,
:o je suis nul de chez nul en python et je ne comprends donc rien à ta solution mais je ne doute pas qu'elle en intéressera d'autres.

Re: extraction en lua - encore

Publié : 24 oct. 2015, 00:18
par Steph38
Ce sera surement mieu expliquė ici :http://easydomoticz.com/les-batteries-en-z-wave/

Steph

Re: extraction en lua - encore

Publié : 24 oct. 2015, 18:44
par heartblood
oudini a écrit :
Sais-tu si ce cas à déjà été résolu par quelqu'un ? Dit autrement, existe-t-il une façon d'obliger Domoticz à utiliser le tarif T2 au lieu du T1 dans le calcul du coût des HC?

Merci encore pour ton aide
Et pourquoi tu ne changes pas le tarif T2 en tarif T1 (idem pour T1) ?? Mon T1 c'est le prix des HC et T2 le prix des HP.

EDIT : Perso, je n'utilise pas P1 smart meter, je n'ai pas été emballé par ce module. J'ai préféré faire un fichier excel avec tous les taxes d'EDF pour faire une estimation du prix TTC (très proche de la valeur réél)

Re: extraction en lua - encore

Publié : 24 oct. 2015, 19:01
par oudini
@heartblood
DZ applique le même tarif aux deux compteurs, en inversant les tarifs il y en aurait toujours un de faux.

J'ai réussi à m'en sortir avec un système "hybride", un script bash qui extrait et traite les chaînes des compteurs et qui est appelé par un petit script_time_lua avec un os.execute.

Tout marche bien, si ça intéresse du monde je posterai les scripts, la téléinfo via MySensors c'est sympa.

Merci pour ton aide et tes suggestions pertinentes.

@Steph38
Merci pour le lien, j'ai enfin compris le truc...

Re: extraction en lua - encore

Publié : 25 oct. 2015, 15:35
par heartblood
oudini a écrit :@heartblood
DZ applique le même tarif aux deux compteurs, en inversant les tarifs il y en aurait toujours un de faux.

J'ai réussi à m'en sortir avec un système "hybride", un script bash qui extrait et traite les chaînes des compteurs et qui est appelé par un petit script_time_lua avec un os.execute.

Tout marche bien, si ça intéresse du monde je posterai les scripts, la téléinfo via MySensors c'est sympa.

Merci pour ton aide et tes suggestions pertinentes.
Le P1 smart meter permet l'envoie de deux valeurs, v1 au tarif t1 et v2 au tarif t2. Regarde le wiki https://www.domoticz.com/wiki/Domoticz_ ... mart_meter

Je t'en prie :D

Re: extraction en lua - encore

Publié : 26 oct. 2015, 11:27
par rimram31
Il existe des librairies json en lua , je n'en ai pas (encore) installé une mais si j'en crois ce tuto http://www.domoticz.com/wiki/Philips_Hue_Lights, c'est tout a fait possible. Une fois installée (la lib LUA sous /usr/share ...), on doit pouvoir écrire quelque chose comme ça:

Code : Tout sélectionner

json = require('json')
...
obj = json:decode(<json sous forme "texte")
Et enfin obtenir "directement", (je n'ai pas testé, j'ai pas mon pi sous la main mais dans l'idée):

Code : Tout sélectionner

obj['result'][0]['CounterToday']
Un intérêt de json est justement de disposer d'encodeur/décodeurs dans la grande majorité des langages, ça serait dommage de s'en priver :D Steph38 le montre dans son exemple python (utilisant la lib python json).

json n'est jamais qu'une représentation hiérarchique de données. En JSON {} représente un dictionnaire où on utilise un x['nom de clef'] = valeur et [] représente une liste ou on va utiliser alors des indices 0, 1 ... d'où mon obj['result'] puis [0] et enfin ['CounterToday'] car le premier (et seul d'ailleurs) élément de la liste est lui-même un "dictionnaire" (nommé tableau en lua je crois). On peut ainsi explorer une arborescence json.

La recherche textuelle n'est pas le meilleur moyen d'attaquer du json, a fortiori avec du shell :shock: Vous auriez presque intérêt a piper avec du python:

Code : Tout sélectionner

echo "<json a parser>" | python -c "import json,sys;obj=json.load(sys.stdin);print obj['result'][0]['CounterToday'];"
par exemple devrait marcher pour le cas de oudini plus haut.