Page 5 sur 8

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 15:12
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é 609 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

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 15:37
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.

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 16:01
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

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 17:56
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.

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 20:31
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')

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 20:43
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

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 20:49
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')

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 21:46
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 ?

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 22:00
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 !!!!!!!!

Re: 1er Script avec weewx

Publié : 11 févr. 2024, 22:03
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