Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

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 <\>.
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: RE: Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par deennoo »

jackslayter a écrit :le script que j'avais marchait bien et puis plus du tout , j'ai essayé avec le level en json , rien.
je pense que mon variateur n'est plus compatible.
je suis donc passé aux scènes avec 25%,50%,... et un bouton qui monte et un autre qui descend
Peux tu le partager ? Stp
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par jackslayter »

Code : Tout sélectionner

--script_device_lampe.lua
commandArray = {}
MaxDimLevel = 16
step = 100.0 / MaxDimLevel
increment = 2
button = 'controle inten salon'
light = 'lampe salon'
    if (devicechanged[button]=='On') then
       if ('Off' ~= string.len(otherdevices_svalues[light])) then
          local currentlevel = tonumber(otherdevices_svalues[light])
          if (currentlevel < MaxDimLevel) then
             currentlevel = step * currentlevel
             newlevel =  math.ceil(currentlevel + (increment * step))
             --print('Increase ' .. light .. ' from ' .. math.ceil(currentlevel) .. '% to ' .. newlevel .. '%')
             commandArray[light]='Set Level ' .. newlevel
          end
       end
    elseif (devicechanged[button]=='Off') then
       if ('Off' ~= string.len(otherdevices_svalues[light])) then
          local currentlevel = tonumber(otherdevices_svalues[light])
          if (currentlevel < MaxDimLevel) then
             currentlevel = step * currentlevel
             newlevel =  math.ceil(currentlevel - (increment * step))
             --print('Increase ' .. light .. ' from ' .. math.ceil(currentlevel) .. '% to ' .. newlevel .. '%')
             commandArray[light]='Set Level ' .. newlevel
          end
       end
    end

return commandArray
et la cde json pour mettre à jour le variateur

Code : Tout sélectionner

/json.htm?type=command&param=switchlight&idx=27&switchcmd=Set%20Level&level=6
tu peux utiliser cette commande pour recup le level

Code : Tout sélectionner

curl "http://192.168.1.1:8080/json.htm?type=devices&rid=27" | sed -e 's/[{}]/''/g' | grep '"Level" :' | sed 's/:/ /1' | sed 's/,/ /1' | awk -F" " '{ print $2 }'
et mon topic ouvert sur Dz http://www.domoticz.com/forum/viewtopic ... 002#p45002
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par Neutrino »

Sinon, je prendrais le problème dans l'autre sens.

Code : Tout sélectionner

Télécommande----Infra Rouge---->Capteur->Lircrc->script bash
Le script bash se contente de lire le level avec la commande de jackslayter, de l'incrémenter et enfin de faire appel à l'API JSON pour l'action dans Dz.
Pas de LUA et une exécution plus rapide je pense.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par deennoo »

Je continue a y reflechir, vraiment il faut vite que DZ finissent les intégrations de Hardware.

Il semble qu'aucun device rgbw n'a sa valeur de couleur ou de dim, ccessible par le JSON ou en LUA .

Je pourrais même faire un script qui va piloter directement l'API Milight...

C'est juste une question de perfectionnisme, je VEUX que le niveau réel soit le même que dans Domoticz !!!
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par vil1driver »

deennoo a écrit :(...)
Mais non les MIlight n'affiche rien dans la section svalues, que dalle, nada, nipe.
(...)
as tu testé un simple otherdevices['Appliques'] qui remonte la ligne status (dans ton json: "Status" : "Set Level: 25 %",)
reste juste à jouer avec string.gsub pour ne garder que le 25
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
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par deennoo »

Je peux essayer, mais je vais attendre la prochaine version officiel, j'ai lu qu'il y allait avoir une refonte complète de la gestion des éléments RGB WW et CW dans tous les protocoles.


Cela arrive pour Mars, la patience peut faire gagner du temps.

Merci de votre temps les copains.
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
DavidFromRouen
Messages : 157
Inscription : 26 févr. 2016, 23:40

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par DavidFromRouen »

Bonjour à tous.

Voilà, certains d'entre vous s'en sont rendu compte, cela fait une grosse semaine que je découvre les joies de Domoticz.
Je commence à me débrouiller et c'est vraiment passionnant.
J'essaie au maximum de me débrouiller par moi-même, mais y'a des moments.. ;)
Je souhaiterai que Domoticz me donne la température d'une sonde, de manière vocale.
J'ai trouvé plusieurs morceaux de scripts ici et ailleurs, mais rien que je ne puisse utiliser car incomplet.
Pour ce qui est vocal, je maîtrise. Il y a deux manières que j'essaie en ce moment et qui ont justement été expliquées sur le forum:

1- le message préenregistré en MP3 qui vient de http://text2speech.us/
2- le message transcrit à la volée venant de http://www.voicerss.org/

Je me suis amusé à faire quelques scripts très simples pour par exemple dire vocalement l'état du portail (ouvert ou fermé)

dans le cas 1 (MP3)

Code : Tout sélectionner

#!/bin/bash
mplayer -ao alsa -noconsolecontrols /home/pi/PortailOuvert.mp3



dans le cas 2 (VOICERSS)

Code : Tout sélectionner

#!/bin/bash
tts "Attention. Le portail est toujours ouvert"
Fin de la parenthèse : D

Du coup, comme dis au début, je souhaiterai que Domoticz me donne la température (c'est une sonde extérieure) si elle atteint un certain seuil.
J'ai vu sur le forum quelque chose de très proche (alerter à chaque degré en 30° et 45°) mais le script n'est pas entier.

D'après ce que j'ai compris, il faut un script JSON qui récupérera la valeur de la sonde et un autre script.
J'ai vu aussi le super script GoodMorning de Jmleglise mais il ne fonctionne pas. (bien sur j'ai épuré en enlevant les prévisions météo et les annonces d'ordures...)

Bref, je suis un peu perdu.

Je crois que je vais acheter un bouquin sur le lua :lol:

Quelqu'un pourrait-il me donner les quelques lignes magiques du script qu'il me faudrait ?
Pyrrhus
Messages : 130
Inscription : 11 juin 2015, 14:57

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par Pyrrhus »

Salut!
je m'exerce aussi aux joies du lua donc je peux pas bien t'aider encore dans ce langage.
Par contre, je suis passé expert en récupération de valeur en json !
ma méthode, c'est d'installer un parser (trieur) Json qui récuperera ce que tu veux dans la commande json. J'ai installé jq sur mon raspberry:

Code : Tout sélectionner

git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
sudo ./configure --disable-maintainer-mode
sudo make
sudo make install
Si tu as un message d'erreur pour "autoreconf" c'est qu'il doit être installé:

Code : Tout sélectionner

sudo apt-get install dh-autoreconf
Imagine que tu veux recupérer les valeurs d'un capteur domoticz dans ton terminal:

Code : Tout sélectionner

curl -s "http://ip_du_rasp:port/json.htm?type=devices&rid=idx_ton_device"
Tu verras toutes les valeurs qui correspondent à ton capteur.
Exemple d'un capteur si tu veux juste récupérer la valeur "Temp" avec jq (temperature)

Code : Tout sélectionner

curl -s "http://ip_du_rasp:port/json.htm?type=devices&rid=idx_de_ton_capteur"| jq -r .result[].Temp
Et oh miracle seule la valeur que tu veux s'affiche :

Code : Tout sélectionner

21.5
Oui il fait pas tres froid en ce moment chez moi :D

Le script:

Code : Tout sélectionner

#!/bin/bash
#on cree une variable temperature
TEMP=$(curl -s "http://ip_du_rasp:port/json.htm?type=devices&rid=idx_de_ton_capteur"| jq -r .result[].Temp)
#on ordonne la sortie vocale
tts "Il fait $TEMP degres celsius "
Je ne suis pas familier du tts. Pour ma part j'utilise un vieux téléphone sur lequel j'ai installé paw server et branché un haut parleur.
tuto ici: http://www.abavala.com/paw-synthese-voc ... s-android/
chez moi la sortie vocale s'écrit donc:

Code : Tout sélectionner

curl -s "http://ip_du_telephone:8080/actions/text_to_speech.xhtml?texte=Il%20fait%20$TEMP%20degres%20celsius"
il faut remplacer les "espace" par des %20

Et ça marche du tonnerre !

Ah toi d'intégrer le script au lua avec la commande

Code : Tout sélectionner

os.execute('/chemin/du/script.sh')
Dernière modification par Pyrrhus le 31 mars 2016, 22:19, modifié 1 fois.
DavidFromRouen
Messages : 157
Inscription : 26 févr. 2016, 23:40

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par DavidFromRouen »

Merci à toi !! Je vais me pencher là dessus et je te redis.
Merci beaucoup pour le temps passé pour moi. ;)
DavidFromRouen
Messages : 157
Inscription : 26 févr. 2016, 23:40

Re: Récupérer une valeur présente dans le JSON pour l'utiliser en LUA

Message par DavidFromRouen »

Bon bein ça commence mal.
J'ai essayé tant bien que mal une bonne partie de la soirée, j'avais des messages d'erreur à gogo, des plantages...
Bref rien de bon. J'ai changé de µSD j'ai remis tout propre depuis le début.
Tout ce qui est installation se passe bien, mais lors de la commande finale... erreur...
Peut-être une erreur de syntaxe ?

pi@raspberrypi:~$ curl -s "http://192.168.1.27:8080/json.htm?type=device&rid=1"
<html><head><title>Unauthorized</title></head><body><h1>401 Unauthorized</h1></body></html>pi@raspberrypi:~$



EDIT: Si j’exécute le script manuellement, sous WinSCP,

J'ai une sortie vocale, sauf que la voix ne donne pas le chiffre des degrés et j'ai le retour suivant:

La commande '"./Essai.lua"'
a échoué avec pour code de retour 0 et pour message
parse error: Invalid numeric literal at line 1, column 60.
Répondre