Weewx & Domoticz sont dans un bateau ...

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 <\>.
domcars0
Messages : 238
Inscription : 18 févr. 2017, 20:23

Weewx & Domoticz sont dans un bateau ...

Message par domcars0 »

Pour ceux qui ont des stations météo compatibles weewx ( ou wview) mais pas domoticz et qui voudraient voir les infos météo de leur petite station sur leur interface domoticz.
Voici une démarche qui permet cela.
Dans Domoticz, créer les dispositifs ( à partir d'un matériel de type 'Dummy', appelons le 'Weewx') correspondant à votre matériel météo (par exemple pour une Oregon Scientific WMR88 j'ai créé : 1 'Temp + Humidity + Baro' nommé 'Météo Jardin', 1 'Temp + Humidity' nommé 'Temp. Salon', 1 'Temp + Humidity' nommé 'Temp. Cave',
, 1 'Rain' nommé 'Précipitations Jardin' et un 'Wind+Temp+Chill' nommé 'Vent Jardin') et repérer les Idx de ces périphériques.

Dans le fichier de configuration de votre skin weewx (/etc/weewx/skins/MySkin/skin.conf), créer un template de generateur [CheetahGenerator] et le renseigner comme suit:
exemple :

-----skin.conf----
...
[CheetahGenerator]
...
[[ToDate]]
...
[[[domoticz]]]
template = domoticz.xml.tmpl

...
-------------------

Puis créer le fichier domoticz.xml.tmpl (avec les informations nécessaires à vos dispositifs)

Code : Tout sélectionner

<weewx>
     <data realtime="temp">$current.outTemp.formatted<!--Temp Jardin--></data>
     <data realtime="hum">$current.outHumidity.formatted<!--Humidity Jardin--></data>
     <data realtime="inTemp">$current.inTemp.formatted<!--Temp Salon--></data>
     <data realtime="inHum">$current.inHumidity.formatted<!--Humidity Salon--></data>
     <data realtime="auxTemp">$current.extraTemp1.formatted<!--Temp Cave--></data>
     <data realtime="auxHum">$current.extraHumid1.formatted<!--Humidity Cave--></data>
     <data realtime="barometer">$current.barometer.formatted<!--Barometre--></data>
     <data realtime="wind">$current.windSpeed.formatted<!--Vitesse Vent--></data>
     <data realtime="Winddir">$current.windDir.formatted<!--Direction vent--></data>
     <data realtime="Windgust">$current.windGust.formatted<!--Rafales--></data>
     <data realtime="Windcomp">$current.windDir.ordinal_compass<!--Vent Compas--></data>
     <data realtime="WindChill">$current.windchill.formatted<!--Temp Windchill--></data>
     <data realtime="rainrate">$current.rainRate.formatted<!--Taux de precipitation--></data>
     <data realtime="Rain">$alltime.rain.sum.formatted<!-- Total des Precipitations --></data>
</weewx>
Weewx va alors générer, à intervalle régulier, un fichier domoticz.xml sur votre site web météo.

Le principe est de récupérer ce fichier xml sur le serveur domoticz et de le parcourir avec un script lua afin de mettre à jour vos capteurs.

Exemple de script lua qui va renseigner la BdD domoticz (dans ... domoticz/scripts/lua/script_time_weewx.lua)

---------------------------script_time_weewx.lua-------------------------

Code : Tout sélectionner

-- Title: script_device_weewx.lua
-- Date: 10-01-2016
-- this script reads the weewxpws xml file and uploads current data to virtual device
-- format of the xml file =
--  <weewx>
--      <data realtime="temp">8.5<!--outsideTemp--></data>
--      <data realtime="hum">73.2<!--outsideHumidity--></data>
--      <data realtime="inTemp">19.5<!--outsideTemp--></data>
--      <data realtime="inHum">53.2<!--outsideHumidity--></data>
--      <data realtime="barometer">1025.5<!--Pressure--></data>
--  </weewx>
--
--
-- Config 
local wind_device_idx = 13
local rain_device_idx = 11
local garden_device_idx = 8
local room_device_idx = 9
local aux_device_idx = 14

-- Attention au nom du "Dispositif" , 
-- c'est celui que l'on a mis dans la Config (on en choisi un au hasard parmis l'un des dispositifs de notre weewx) 
s = otherdevices_lastupdate['Température Salon']
-- returns a date time like 2013-07-11 17:23:12

-- Remplacer 'Vent Jardin' par le nom de votre dispositif anémomètre
prev_wind = otherdevices_svalues['Vent Jardin'] 

-- End Config 

commandArray = {}

t1 = os.time()

year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)

t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = (os.difftime (t1, t2))

-- ON ne mets à  jour que tous les 5 mns
if ( difference < 300 ) then
        return commandArray
end

-- ca fonctionne mais c'est parfois un peu long et on dépasse les 10 secondes... on fait donc cela par crontab 
-- os.execute('wget http://my-weewx.site.fr/domoticz.xml -O /tmp/domoticz.xml')
-- os.execute('sed s#,#.# /tmp/domoticz.xml > /tmp/domoticz.xml-pre')

local filename = "/tmp/domoticz.xml-pre"

local line , tempdevice = ''
local temperature,humidity,pressure,inhumidity,intemperature,auxhumidity,auxtemperature,rain,rainrate,wind,winddir,windgust,windchill = 0
local windcomp =  'N'

for line in io.lines(filename) do
   if string.find(line,"\"temp\"") then
      temperature=tonumber(string.match(line, "%-?%d+.?%d*"))
   elseif string.find(line,"\"hum\"") then
      humidity=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"inTemp\"") then
      intemperature=tonumber(string.match(line, "%-?%d+.?%d*"))
   elseif string.find(line,"\"inHum\"") then
      inhumidity=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"auxTemp\"") then
      auxtemperature=tonumber(string.match(line, "%-?%d+.?%d*"))
   elseif string.find(line,"\"auxHum\"") then
      auxhumidity=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"barometer\"") then
      pressure=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"rainrate\"") then
      rainrate=100 * tonumber(string.match(line, "%d+.?%d*"))
   elseif string.find(line,"\"Rain\"") then
      rain=tonumber(string.match(line, "%d+.?%d*"))
   elseif string.find(line,"\"wind\"") then
      wind=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"Winddir\"") then
      winddir=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"Windgust\"") then
      windgust=tonumber(string.match(line, "%d+"))
   elseif string.find(line,"\"Windcomp\"") then
      windcomp=string.match(line, "Windcomp\">([NESO/A]+)<!--")
   elseif string.find(line,"\"WindChill\"") then
      windchill=tonumber(string.match(line, "%-?%d+.?%d*"))
   end
end


-- Si la vitesse du vent est nulle winddir et windcomp garde la valeur précédente
if ( wind == 0  or wind == nil ) then
        winddir,windcomp = prev_wind:match("([^;]+);([^;]+)")
        wind = 0
end

-- A l'initialisation du device domoticz on peut avoir des valeurs farfelues
if winddir == nil then
        winddir = 0
end
if  windcomp =='N/A'  then
        windcomp = 'N'
end

if windchill == nil then
        windchill = 0
end

if windgust== nil then
        windgust= 0
end

-- Conversion de win et wingust (domoticz attend 10 * Winspeed [m/s] -- weewx nous donne Winspeed [km/h]
wind = math.ceil(wind / 0.36)
windgust = math.ceil(windgust / 0.36)

-- Conditions Salon
if not ( inhumidity == nil or intemperature == nil ) then
        tempdevice = room_device_idx..|0|'..intemperature..';'..inhumidity..';0'
        commandArray [1] = {['UpdateDevice'] = tempdevice }
end

-- Meteo Locale idx = 8
if not ( humidity == nil or temperature == nil or pressure == nil ) then
        tempdevice = garden_device_idx..'|0|'..temperature..';'..humidity..';0;'..pressure..';0'
        commandArray [2] = {['UpdateDevice'] = tempdevice }
end

-- Pluie Locale idx = 11
if not ( rainrate == nil or rain == nil ) then
        tempdevice = rain_device_idx..'|0|'..rainrate..';'..rain
        commandArray [3] = {['UpdateDevice'] = tempdevice }
end

-- Vent Locale idx=13 dir;comp;speed;gust;temp;windchill
if not (  temperature == nil ) then
	tempdevice = wind_device_idx..'|0|'..winddir..';'..windcomp..';'..wind..';'..windgust..';'..temperature..';'..windchill
	commandArray [4] = {['UpdateDevice'] = tempdevice }
end

-- Conditions Aux idx=14 (WC ou Cave)
if not ( auxhumidity == nil or auxtemperature == nil ) then
        tempdevice = aux_device_idx..'|0|'..auxtemperature..';'..auxhumidity..';0'
        commandArray [5] = {['UpdateDevice'] = tempdevice }
end

return commandArray

NB: pour accélerer le script lua, la récupération du fichier domoticz.xml sur le site de weewx ne sera pas faite par le script lua mais par un crontab.

-----------Exemple de crontab -------------

Code : Tout sélectionner

2-57/5 * * * * wget http://my-weewx.site.fr/domoticz.xml -O /tmp/domoticz.xml && sed s#,#.# /tmp/domoticz.xml > /tmp/domoticz.xml-pre
Ce crontab récupère chaque 5 minutes (à partir de NNh02mn, car weewx génére à NNh01mn ) le fichier depuis le site weewx et il remplace les ',' par des '.' (weewx sépare partie entière et décimle par des ',' alors que domoticz veut des '.' ).

Vous pouvez ainsi avoir un truc du genre:
Domoticz2.png
Domoticz2.png (43.22 Kio) Consulté 15431 fois
Have fun !!
Remarque: Sur le snapshot ci-dessus, indice UV et Prévisions météos proviennent de WeatherUndergound, pas de weewx (je n'ai pas encore de capteur UV ;o) .
Dernière modification par domcars0 le 13 mars 2018, 17:19, modifié 8 fois.
La liberté a un prix... celui de l'effort.
czech77
Messages : 2
Inscription : 02 août 2017, 15:27

Re: Weewx & Domoticz

Message par czech77 »

error
2017-08-02 16:27:00.497 Error: EventSystem: in script_time_weewx: [string "--..."]:29: bad argument #1 to 'sub' (string expected, got nil)
2017-08-02 16:28:00.136 Error: EventSystem: in /usr/local/domoticz/var/scripts/lua/script_time_weewx.lua: /usr/local/domoticz/var/scripts/lua/script_time_weewx.lua:35: bad argument #1 to 'sub' (string expected, got nil)
2017-08-02 16:28:00.139 Error: EventSystem: in script_time_weewx: [string "--..."]:29: bad argument #1 to 'sub' (string expected, got nil)
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Weewx & Domoticz

Message par Neutrino »

Bonjour,

C'est la première fois que je vois ça ! :o
Même pas le minimum de politesse et d'infos... :shock:

Essaye encore...

Bonne soirée.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
czech77
Messages : 2
Inscription : 02 août 2017, 15:27

Re: Weewx & Domoticz

Message par czech77 »

Code : Tout sélectionner

-- Conditions Salon
if not ( inhumidity == nil or intemperature == nil ) then
        tempdevice = room_device_idx..|0|'..intemperature..';'..inhumidity..';0'
tempdevice = room_device_idx..'|0|'..intemperature..';'..inhumidity..';0'
даже я вижу простые ошибки
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Weewx & Domoticz

Message par vil1driver »

czech77 a écrit : 2017-08-02 16:27:00.497 Error: EventSystem: in script_time_weewx: [string "--..."]:29: bad argument #1 to 'sub' (string expected, got nil)
Line 29:

Code : Tout sélectionner

year = string.sub(s, 1, 4)

Code : Tout sélectionner

s = otherdevices_lastupdate['Température Salon']
And

Code : Tout sélectionner

prev_wind = otherdevices_svalues['Vent Jardin'] 
Changes the name of these devices by yours
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
berserk
Messages : 76
Inscription : 30 nov. 2015, 21:55

Re: Weewx & Domoticz

Message par berserk »

Salut donc moi pour les températures pas de problème ça roule. Par contre c'est l'accumulation de pluie. Imaginons que jeudi il a plu 8mm et bah je me retrouve avec 8mm le jeudi et 8mm le vendredi!!. Moi mon reporting xml de weewx est de 5mm. Que me conseil tu pour que je n'ai pas l'accumulation de la veille il faut que je joue sur mon cron ?

Merci d'avance


Ci joint un exemple
Screenshot_20170821-110704.png
Screenshot_20170821-110704.png (182.44 Kio) Consulté 14825 fois
domcars0
Messages : 238
Inscription : 18 févr. 2017, 20:23

Re: Weewx & Domoticz

Message par domcars0 »

Effectivement, le Total de Rain ne repassait pas à 0 à minuit automatiquement :-( ...

J'ai modifié le script du premier Post, mettez à jour.
Dernière modification par domcars0 le 07 mars 2018, 16:13, modifié 1 fois.
La liberté a un prix... celui de l'effort.
domopat24
Messages : 16
Inscription : 21 janv. 2018, 08:08

Re: Weewx & Domoticz

Message par domopat24 »

Bonjour

Je suis nouveau dans le monde de domoticz et je n'ai pas encore saisi le traitement de certaines 'datas'.
J'utilise le script sans problème avec weewx mais pour les valeurs 'rain' 'windspeed' et 'windgust' présentent dans la liste des 'devices' ,
elles ne sont pas les mêmes à l'affichage dans les widgets.
J'ai forcé ces valeurs avec api/jason et je ne retrouve toujours pas les mêmes présentes dans les widgets.
En listant les 'devices' les 'datas' sont OK mais 'Rain' 'Speed' et 'Gust' sont différents.
Je précise que bien sur c'est dans 2 'devices' différent.
Je n'ai pas vu ou su trouver des infos dans la doc et dans les forums.

Je remercie l"auteur du script qui m'a permis de bien démarrer avec domoticz.
domcars0
Messages : 238
Inscription : 18 févr. 2017, 20:23

Re: Weewx & Domoticz

Message par domcars0 »

Je ne suis pas sur de bien avoir compris ton problème, mais les unités dans lesquelles sont transmises les données de weewx ne sont pas toujours identiques à celles que tu affiches .. ceci pouvant expliquer cela. Les valeurs affichées sur les widgets de domoticz sont elles conformes aux valeurs que t'indique ta station météo ?
Dernière modification par domcars0 le 11 févr. 2018, 22:33, modifié 1 fois.
La liberté a un prix... celui de l'effort.
Lamusicadomi
Messages : 107
Inscription : 22 avr. 2017, 11:01

Weewx & Domoticz

Message par Lamusicadomi »

Bonjour,

Je me permets d'utiliser ce thème pour vous demander comment faire pour que weewx soit mis a jour toutes les 5 minutes ?
En effet, actuellement la mise à jour est toutes les 30 minutes...
Comment faire pour changer ? Est ce dans weewx.conf ou dans skin.conf et où ?
A bientôt !
Répondre