extraction en lua - encore

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 <\>.
Répondre
oudini
Messages : 12
Inscription : 30 avr. 2015, 15:09

extraction en lua - encore

Message 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
heartblood
Messages : 189
Inscription : 13 août 2015, 09:50

Re: extraction en lua - encore

Message 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
oudini
Messages : 12
Inscription : 30 avr. 2015, 15:09

Re: extraction en lua - encore

Message 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
Steph38
Messages : 44
Inscription : 12 août 2015, 18:13

Re: extraction en lua - encore

Message 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()
oudini
Messages : 12
Inscription : 30 avr. 2015, 15:09

Re: extraction en lua - encore

Message 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.
Steph38
Messages : 44
Inscription : 12 août 2015, 18:13

Re: extraction en lua - encore

Message par Steph38 »

Ce sera surement mieu expliquė ici :http://easydomoticz.com/les-batteries-en-z-wave/

Steph
heartblood
Messages : 189
Inscription : 13 août 2015, 09:50

Re: extraction en lua - encore

Message 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)
oudini
Messages : 12
Inscription : 30 avr. 2015, 15:09

Re: extraction en lua - encore

Message 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...
heartblood
Messages : 189
Inscription : 13 août 2015, 09:50

Re: extraction en lua - encore

Message 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
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: extraction en lua - encore

Message 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.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Répondre