1er Script avec weewx

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 <\>.
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

re,

bon , j'ai mis de côté ce script, j'en ai trouvé un autre sur le forum (celui en anglais), et je l'ai adapté à ma config.
le voilà

Code : Tout sélectionner

-- Title: script_device_weewx.lua
-- Date: 09-01-2016
-- this script reads the weewxpws xml file and uploads current data to virtual device

commandArray = {}

os.execute('wget http://192.168.0.153/weewx/domoticz.xml -O /home/jeeper/domoticz/scripts/lua/domoticz.xml')

local filename = "/var/www/html/weewx/domoticz.xml"

local line = ''
local temperature = 0
local humidity = 0
local pressure = 0
local tempdevice = ''

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=line
  end

   if string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   end

   if string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   end
print(line)
end

-- Update device id 1, nval 0 sval temp;hum;hum-stat;baro;baro-stat
tempdevice='1|0|'..temperature..';'..humidity..';0;'..pressure..';0'

--force print as string

-- none of these work
--commandArray['UpdateDevice'] = "1|0|" .. temperature .. ";" .. humidity .. ";0;" .. pressure .. ";0"
--commandArray['UpdateDevice'] = '1|0|'..temperature..';'..humidity..';0;'..pressure..';0'
--commandArray['UpdateDevice'] = tempdevice

-- only this one updates the device
commandArray['UpdateDevice'] = tempdevice
print(tempdevice)
return commandArray
il y deux valeurs qui fonctionnent mais pas la temperature. Pourtant on voit la valeur dans les logs!!!
ci-joint copie écran de l'affichage et logs; après si celui-ci fonctionne bien , je me remettrai sur l'autre script.
Capture_7.JPG
Capture_7.JPG (25.91 Kio) Consulté 623 fois
2024-02-11 15:07:00.057 Status: EventSystem: Script event triggered: script_weewx_2
2024-02-11 15:08:00.074 Status: LUA: <weewx>
2024-02-11 15:08:00.074 Status: LUA: <data realtime="temp">20,7<!--Temperature Bureau--></data>
2024-02-11 15:08:00.074 Status: LUA: <data realtime="hum">43<!--Humidite Bureau--></data>
2024-02-11 15:08:00.074 Status: LUA: <data realtime="barometer">997,9<!--Barometre--></data>
2024-02-11 15:08:00.074 Status: LUA: </weewx>
2024-02-11 15:08:00.074 Status: LUA: 1|0| <data realtime="temp">20,7<!--Temperature Bureau--></data>;43;0;997;0
salinois
Dernière modification par Keros le 11 févr. 2024, 15:30, modifié 1 fois.
Raison : Ajout les balises pour les logs. Merci de lire la section Bien utiliser le forum
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: 1er Script avec weewx

Message par Keros »

Non, dans les logs, tu vois la ligne qui est lue du fichier. Cela ne veut pas dire que la donnée de température peut être utilisée dans le script comme valeur.
Et à voir le code pour la température, c'est normal que le widget ne soit pas mis à jour.

On est dans la problématique d'un script copié/collé sans comprendre comment il fonctionne. Il faut déboguer, comme avec le premier script.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

ok avec toi, mais il y a deux valeurs qui fonctionnent, j'ai vérifié sur ma station météo.( humidité et Pression atmosphérique)
et je ne suis pas assez bon à l'heure actuelle pour partir de zéro sur un script.

LUA: 1|0| <data realtime="temp">20,8<!--Temperature Bureau--></data>;46;0;998;0
"temp" est la bonne valeur du fichier et de la station météo.

salinois
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: 1er Script avec weewx

Message par Keros »

Je ne dis pas qu'il faut partir de zéro, c'est impossible. Il faut avoir des exemples, les comprendre et cela permet d'apprendre.

Regarde comment sont récupérées les valeurs humidité et pression.
Si tu regardes ensuite la valeur température, tu verras qu'il y a une différence. Pose-toi la question : pourquoi cette différence ? > les lignes du fichier xml sont quasiment les mêmes > il n'y a pas de raison que le principe soit différent.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

Juste pour m'orienter:

recuperation des valeurs :

Code : Tout sélectionner

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=line 
  end

   if string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   end

   if string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   end
j'ai modifié comme ça:

Code : Tout sélectionner

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=tonumber(string.match(line, "%-?%d+.?%d*"))
  end

   if string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   end

   if string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   end
mais erreur dans les logs !!!
2024-02-11 20:30:00.526 Error: EventSystem: in script_weewx_2: [string "-- Title: script_device_weewx.lua ..."]:33: attempt to concatenate a nil value (local 'temperature')
Dernière modification par Keros le 11 févr. 2024, 21:42, modifié 1 fois.
Raison : Citation supprimée. Merci de ne pas citer le message précédent lors d'une réponse directe.
Flying Domotic
Messages : 772
Inscription : 10 mars 2020, 15:26

Re: 1er Script avec weewx

Message par Flying Domotic »

Il pourrait être habile de nous envoyer l'ensemble du script. Là, par exemple, on ne voit pas la ligne qui provoque l'erreur.

Ceci dit, on pourrait imaginer que le souci vient de l'affichage de la variable 'temperature', qui, probablement n'a pas été chargée.

Pour éviter ça, il peut être prudent, soit de vérifier qu'elle n'est pas nulle (nil) avant de l'utiliser, soit de l'initialiser avant d'entrer dans la boucle à une valeur impossible à obtenir.

Par exemple, avant la boucle for, inclure

Code : Tout sélectionner

temperature = -999
humidity = -999
pressure = -999
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

bonjour Flying Domotic

j'ai mis le script plus haut dans le post, mais je le remets pour toi.

Code : Tout sélectionner

-- Title: script_device_weewx.lua
-- Date: 09-01-2016
-- this script reads the weewxpws xml file and uploads current data to virtual device

commandArray = {}

os.execute('wget http://192.168.0.153/weewx/domoticz.xml -O /home/jeeper/domoticz/scripts/lua/domoticz.xml')

local filename = "/var/www/html/weewx/domoticz.xml"

local line = ''
local temperature = 0
local humidity = 0
local pressure = 0
local tempdevice = ''

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=tonumber(string.match(line, "%-?%d+.?%d*"))
  end

   if string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   end
print(pressure)
   if string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   end
--print(line)
end

-- Update device id 1, nval 0 sval temp;hum;hum-stat;baro;baro-stat
tempdevice='1|0|'..temperature..';'..humidity..';0;'..pressure..';0'

--force print as string
-- none of these work
--commandArray['UpdateDevice'] = "1|0|" .. temperature .. ";" .. humidity .. ";0;" .. pressure .. ";0"
--commandArray['UpdateDevice'] = '1|0|'..temperature..';'..humidity..';0;'..pressure..';0'
--commandArray['UpdateDevice'] = tempdevice

-- only this one updates the device
commandArray['UpdateDevice'] = tempdevice
print(tempdevice)
return commandArray
plus les logs avec la derniere modif en ligne 33:
2024-02-11 20:51:00.278 Status: LUA: 0
2024-02-11 20:51:00.278 Status: LUA: 0
2024-02-11 20:51:00.278 Status: LUA: 0
2024-02-11 20:51:00.278 Status: LUA: 0
2024-02-11 20:51:00.278 Status: LUA: 1002
2024-02-11 20:51:00.278 Error: EventSystem: in script_weewx_2: [string "-- Title: script_device_weewx.lua ..."]:33: attempt to concatenate a nil value (local 'temperature')
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: 1er Script avec weewx

Message par Keros »

Je vois que le code que tu as mis pour temperature est différent de celui pour humidity et pressure.
tonumber(string.match(line, "%d+")) ne fonctionnait pas ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

oui
quand je met ça :

Code : Tout sélectionner

temperature=tonumber(string.match(line, "%-?%d+.?%d*"))
ca me renvoie dans les logs l'erreur :
2024-02-11 21:59:00.083 Error: EventSystem: in script_weewx_2: [string "-- Title: script_device_weewx.lua ..."]:33: attempt to concatenate a nil value (local 'temperature')
pourquoi !!!!!, j'y suis depuis cet AM !!!!!!!!
salinois
Messages : 330
Inscription : 08 févr. 2024, 19:10

Re: 1er Script avec weewx

Message par salinois »

Flying Domotic a écrit : 11 févr. 2024, 20:43 Il pourrait être habile de nous envoyer l'ensemble du script. Là, par exemple, on ne voit pas la ligne qui provoque l'erreur.

Ceci dit, on pourrait imaginer que le souci vient de l'affichage de la variable 'temperature', qui, probablement n'a pas été chargée.

Pour éviter ça, il peut être prudent, soit de vérifier qu'elle n'est pas nulle (nil) avant de l'utiliser, soit de l'initialiser avant d'entrer dans la boucle à une valeur impossible à obtenir.

Par exemple, avant la boucle for, inclure

Code : Tout sélectionner

temperature = -999
humidity = -999
pressure = -999
je pense que c'est ce qu'il veut me faire comprendre

je l'ai fait:

Code : Tout sélectionner

temperature = -999
humidity = -999
pressure = -999

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=line
   end

   if string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   end

   if string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   end
--print(line)
end

-- Update device id 1, nval 0 sval temp;hum;hum-stat;baro;baro-stat
tempdevice= '1|0|'..temperature..';'..humidity..';0;'..pressure..';0'
mais l'affichage dans le widget pour la temperature est toujours à 0.

et la log:
2024-02-11 22:10:00.214 Status: LUA: 1|0| <data realtime="temp">21,0<!--Temperature Bureau--></data>;47;0;1002;0
Dernière modification par salinois le 11 févr. 2024, 22:10, modifié 1 fois.
Répondre