Lua et json svalues d'un dimmer rgb

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

Lua et json svalues d'un dimmer rgb

Message par deennoo »

Suite a l'article de Patrice paru sur le blog : https://easydomoticz.com/lua-et-json/

J'essaye de le mettre en application en paliant a un manque sur les eclairages "dimmables" yeelight et je veux crée un dimmer "variable" avec le cube Xiaomi :

Si je le tourne de droite a gauche et que la lampe est eteinte il doit l'allumer a 5% puis incrémenté de +5 a chaque mouvement en sens horaire
Si je le tourne en sens inversse, il doit descrementé de 5% jusqu a off
Pas de soucis pour la formule je l'ai
Par contre le niveau (Level) n'apparait pas dans svalues donc je dois parser Level depuis le Json.

premiere chose :

mon ampoule a l'idx 8

Code : Tout sélectionner

http://127.0.0.1:8080/json.htm?type=devices&rid=8 
me donne

Code : Tout sélectionner

{
"ActTime": 1484303909,
"result": [
{
"AddjMulti": 1,
"AddjMulti2": 1,
"AddjValue": 0,
"AddjValue2": 0,
"BatteryLevel": 255,
"CustomImage": 0,
"Data": "Off",
"Description": "",
"Favorite": 0,
"HardwareID": 3,
"HardwareName": "yeelight",
"HardwareType": "YeeLight LED",
"HardwareTypeVal": 91,
"HaveDimmer": true,
"HaveGroupCmd": false,
"HaveTimeout": false,
"ID": "C0A8004C",
"Image": "Light",
"IsSubDevice": false,
"LastUpdate": "2017-01-13 11:38:19",
"Level": 5,
"LevelInt": 5,
"MaxDimLevel": 100,
"Name": "YeeLight",
"Notifications": "false",
"PlanID": "0",
"PlanIDs": [
0
],
"Protected": false,
"ShowNotifications": true,
"SignalLevel": "-",
"Status": "Off",
"StrParam1": "",
"StrParam2": "",
"SubType": "White",
"SwitchType": "Dimmer",
"SwitchTypeVal": 7,
"Timers": "false",
"Type": "Lighting Limitless/Applamp",
"TypeImg": "dimmer",
"Unit": 0,
"Used": 1,
"UsedByCamera": false,
"XOffset": "0",
"YOffset": "0",
"idx": "8"
}
],
"status": "OK",
"title": "Devices"
}

Si j'applique ceci tiré de l'article

Code : Tout sélectionner

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux
--   json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows
 
local config=assert(io.popen('/usr/bin/curl http://127.0.0.1:8080/json.htm?type=devices&rid=8'))
 
 local blocjson = config:read('*all')
 config:close()
 --print (blocjson)
 local jsonValeur = json:decode(blocjson)
 nom = jsonValeur.result[1].Name
 data = jsonValeur.result[1].Data
 
 print('****************')
 print(nom)
 print(data)
  
 
commandArray = {}
print('****************')
return commandArray
j'obtiens les infos de mon idx 1, je suis obliger de remplacer :

Code : Tout sélectionner

 nom = jsonValeur.result[1].Name
 data = jsonValeur.result[1].Data
par

Code : Tout sélectionner

 nom = jsonValeur.result[8].Name
 data = jsonValeur.result[8].Data
Pas de soucis avec cela sauf une correction a apporter peut etre.

Deuxieme "probleme" : comment incorporé ceci dans un script device, car a chaque fois que j'actionne quelque chose le script ce lance,

Code : Tout sélectionner

2017-01-13 12:09:46.069  User: Admin initiated a switch command (5/Xiaomi Motion Sensor/On)
2017-01-13 12:09:46.070  010FE2DE
2017-01-13 12:09:46.220  XiaomiGateway: response {"cmd":"write_ack","sid":"158d00010fe2de","data":"{\"error\":\"Unsupported device\"}"}
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0^C2017-01-13 12:09:50.795  Closing application!...
2017-01-13 12:09:50.795  Stopping worker...

voici ce que j'ai pour le moment :

Code : Tout sélectionner

json = (loadfile "/root/domoticz/scripts/lua/JSON.lua")()  -- For Linux
--   json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")()  -- For Windows

local config=assert(io.popen('/usr/bin/curl http://192.168.0.186:8080/json.htm?type=devices&rid=8'))

 local blocjson = config:read('*all')
 config:close()
 --print (blocjson)
 local jsonValeur = json:decode(blocjson)
 nom = jsonValeur.result[8].Name
 data = jsonValeur.result[8].Level

 print('****************')
 print(nom)
 print(data)
  
commandArray = {}
 if (devicechanged['Xiaomi Cube'] == 'clock_wise' and otherdevices['YeeLight'] == 'Off') then
     commandArray['YeeLight']='On'
     elseif  (devicechanged['Xiaomi Cube'] == 'anti_clock_wise' and otherdevices['YeeLight'] ~= 'Off') then
     commandArray['YeeLight']='Off'
 end
 return commandArray
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: Lua et json

Message par vil1driver »

essai ceci

Code : Tout sélectionner

-- script_device_jsonTest.lua

function jsonInfos(device)
  json = assert(loadfile '/root/domoticz/scripts/lua/JSON.lua')()
  local config=assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=devices&rid='..otherdevices_idx[device]..'"'))
  local blocjson = config:read('*all')
  config:close()
  return json:decode(blocjson).result[1]
end

commandArray = {}

if (devicechanged['YeeLight']) then

    -- récupère les infos json du périphérique
    local lampe = jsonInfos('YeeLight')

    print('JSOn test : '..lampe.Name..' est allumée à '..lampe.Level..' %')
    
end

return commandArray 
Dernière modification par vil1driver le 10 févr. 2017, 15:55, modifié 22 fois.
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: Lua et json

Message par deennoo »

vil1driver a écrit :Ajoute ceci au fichier

voila pour la fiabilisation et la simplicité d'usage..
Merci pour le patch
vil1driver a écrit :pour ton histoire de script device, quel est le problème au juste ?
Je vais te répondre un peu plus tard, j'ai réussit a tuer mon Domoticz de test avec un lua.

Code : Tout sélectionner

2017-01-13 12:27:03.231  {"cmd":"read_ack","model":"switch","sid":"158d000125664f","short_id":27474,"data":"{}"}
2017-01-13 12:27:03.249  Incoming connection from: 192.168.0.186
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11902  100 11902    0     0   817k      0 --:--:-- --:--:-- --:--:--  894k
2017-01-13 12:27:03.271  LUA: ****************
2017-01-13 12:27:03.271  LUA: YeeLight
2017-01-13 12:27:03.271  Error: EventSystem: in dimmer cube: [string "json = (loadfile "/root/domoticz/scripts/lua/..."]:21: attempt to call global 'CalcValue' (a number value)
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 10) > this->size() (which is 9)
Abandon
Le soucis est que le script ce declanche a chaque fois qu'un device est en mouvement, pas uniquement le devicechanged du script.
Comme j'ai cree une erreur dans le mon script qui fait planter Domoticz, et que a chaque fois qu'il demarre il met a jour les device xiaomi, il plante et replante...pas grave c'est mon domoticz de bidouille mais attention

c'est reparti

voici mon probleme :

Code : Tout sélectionner

2017-01-13 14:40:01.394  EventSystem: reset all events...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1458  100  1458    0     0   172k      0 --:--:-- --:--:-- --:--:--  177k
2017-01-13 14:40:05.663  (xiaomi) Light/Switch (cube)
2017-01-13 14:40:05.683  {"cmd":"report","model":"cube","sid":"158d00010eebac","short_id":31286,"data":"{\"status\":\"flip90\"}"}
le parsing est lancer a chaque fois que le cube change d'etat, pas uniquement si il fait une rotation
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: Lua et json

Message par vil1driver »

deennoo a écrit : j'ai cree une erreur dans le mon script qui fait planter Domoticz, et que a chaque fois qu'il demarre il met a jour les device xiaomi, il plante et replante...
voila pourquoi mes script ne sont pas dans la base de donnée, je peux aisément au besoin en désactiver avant de lancer domoticz..
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: Lua et json svalues d'un dimmer rgb

Message par deennoo »

Suite et fin de l'histoire,

Sur la derniere beta, les dimmer rgbw stock maintenant leur "level" dans svalues, ce qui rend cette valeur accessible sur les scripts LUA
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
FPA
Messages : 40
Inscription : 23 juin 2017, 10:40

Re: Lua et json

Message par FPA »

vil1driver a écrit :
deennoo a écrit : j'ai cree une erreur dans le mon script qui fait planter Domoticz, et que a chaque fois qu'il demarre il met a jour les device xiaomi, il plante et replante...
voila pourquoi mes script ne sont pas dans la base de donnée, je peux aisément au besoin en désactiver avant de lancer domoticz..
et du coup on fait comment pour virer un scrip stocké dans la bdd qui fait planter domoticz à chaque demarrage? merci!
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: Lua et json

Message par deennoo »

FPA a écrit :
vil1driver a écrit :
deennoo a écrit : j'ai cree une erreur dans le mon script qui fait planter Domoticz, et que a chaque fois qu'il demarre il met a jour les device xiaomi, il plante et replante...
voila pourquoi mes script ne sont pas dans la base de donnée, je peux aisément au besoin en désactiver avant de lancer domoticz..
et du coup on fait comment pour virer un scrip stocké dans la bdd qui fait planter domoticz à chaque demarrage? merci!
1 - Arreter domoticz
2 - Exporter domoticz.db sur ton pc (winscp)
3 - editer la base de donnée avec un editeur sql (db browser for sql par exemple)
4 - aller dans parcourir les donnée et selectionner EventMaster
5 - Trouver l'evenement qui fait planter et passer Status a 0
6 - appliquer le changement et remettre domoticz.db

Biensur fait une copie de ta db avant les changements
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
FPA
Messages : 40
Inscription : 23 juin 2017, 10:40

Re: Lua et json svalues d'un dimmer rgb

Message par FPA »

merci pour l'info.
voici le script pour piloter un dimmer qui à fait tout planter
-- Calcul des besoins de luminosite
-- à l'aide d'un régulateur PID

--
-- 23/06/17 : Version 1 : Redaction initiale

local consigne = 70
local mesure = otherdevices_svalues['Light Level']
local ecart

commandArray = {}
ecart = consigne - mesure
ecart = ecart * 10
if ecart<0 then
ecart= 0
end
if ecart>100 then
ecart=100
end
commandArray['LUMIERE SALON']='Set Level' tostring (ecart)

print (ecart)

return commandArray


je sais que c'est au niveau du commandArray que ça déconne, mais je n'arrive pas à trouver la bonne fonction pour faire "set level (mavariable) '
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Lua et json svalues d'un dimmer rgb

Message par vil1driver »

Code : Tout sélectionner

commandArray['LUMIERE SALON']='Set Level'..ecart 
Dernière modification par vil1driver le 23 juin 2017, 17:10, modifié 1 fois.
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
FPA
Messages : 40
Inscription : 23 juin 2017, 10:40

Re: Lua et json svalues d'un dimmer rgb

Message par FPA »

vil1driver a écrit :

Code : Tout sélectionner

commandArray['LUMIERE SALON']='Set Level'..
ecart 
Il faut faire 2 points à la ligne ou juste 2 points?
Répondre