[LUA] Vigilance MétéoFrance
Re: LUA: vigilance météoFrance
c'est ce que j'ai fait mais ça ne change pas !
Raspberry Pi + Rfxcom + Domoticz 3.8153
Oregon - 3x Thgr122Nx / Chacon - 6 x micromodule 1000w, contact de porte, OWL - CM180 /4x imagintronix T°+ hum, sonnette chacon , cam aviden visia 4, cam aviden visia 7 ext. Alert via Free SMS. RFlink V47 USB 868MHz
Oregon - 3x Thgr122Nx / Chacon - 6 x micromodule 1000w, contact de porte, OWL - CM180 /4x imagintronix T°+ hum, sonnette chacon , cam aviden visia 4, cam aviden visia 7 ext. Alert via Free SMS. RFlink V47 USB 868MHz
Re: LUA: vigilance météoFrance
As tu passé la variable debugging à true afin de voir son exécution dans les logs?
Le script télécharge à chaque exécution un fichier xml dans le répertoire tmp : /tmp/vigilance.xml
ouvre le ficher et vérifie l’adéquation entre les données remontées dans DZ et celle de ce fichier ainsi que la date de création du fichier
les états de vigilance sont limités dans le temps, vérifie sur le site de météofrance si tu est toujours en vigilance orange (et que les données du fichier correspondent aux données du site)
Le script télécharge à chaque exécution un fichier xml dans le répertoire tmp : /tmp/vigilance.xml
ouvre le ficher et vérifie l’adéquation entre les données remontées dans DZ et celle de ce fichier ainsi que la date de création du fichier
les états de vigilance sont limités dans le temps, vérifie sur le site de météofrance si tu est toujours en vigilance orange (et que les données du fichier correspondent aux données du site)
Re: LUA: vigilance météoFrance
En fait, le type de risque n’apparaît pas car le XML n'affiche que les risques >=3 , c'est bien ça ?
Sinon super bien le script !
Sinon super bien le script !
Raspberry Pi + Rfxcom + Domoticz 3.8153
Oregon - 3x Thgr122Nx / Chacon - 6 x micromodule 1000w, contact de porte, OWL - CM180 /4x imagintronix T°+ hum, sonnette chacon , cam aviden visia 4, cam aviden visia 7 ext. Alert via Free SMS. RFlink V47 USB 868MHz
Oregon - 3x Thgr122Nx / Chacon - 6 x micromodule 1000w, contact de porte, OWL - CM180 /4x imagintronix T°+ hum, sonnette chacon , cam aviden visia 4, cam aviden visia 7 ext. Alert via Free SMS. RFlink V47 USB 868MHz
Re: LUA: vigilance météoFrance
Cest bien cela
Merci
Merci
Re: LUA: vigilance météoFrance
Bonjour petite question sur le script,
il fonctionne parfaitement, trop parfaitement même.
Je m'explique il se déclenche 3 fois par jour à X H et Y Mn, en cas d alerte il envoi des notifications , sauf que durant la minute de déclenchement il envoi 7-8 fois la même notification, je suppose donc que le script à le temps de s exécuter plusieurs fois.
n'étant pas du tout un pro du lua: y a t il une possibilité pour que le script n’envoie qu'une seule notification en cas d'alerte ?
il fonctionne parfaitement, trop parfaitement même.
Je m'explique il se déclenche 3 fois par jour à X H et Y Mn, en cas d alerte il envoi des notifications , sauf que durant la minute de déclenchement il envoi 7-8 fois la même notification, je suppose donc que le script à le temps de s exécuter plusieurs fois.
n'étant pas du tout un pro du lua: y a t il une possibilité pour que le script n’envoie qu'une seule notification en cas d'alerte ?
-
vil1driver
- Messages : 5661
- Inscription : 30 janv. 2015, 11:07
- Localisation : Rennes (35)
Re: LUA: vigilance météoFrance
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
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua
Un ex domoticzien
Re: LUA: vigilance météoFrance
Bah j étais pas sur le bon script lol,
Mais c est bien celui de papoo que j utilise.
Je le dis sur l autre post
Je m a gourru de topic XD
Mais c est bien celui de papoo que j utilise.
Je le dis sur l autre post
Je m a gourru de topic XD
-
vil1driver
- Messages : 5661
- Inscription : 30 janv. 2015, 11:07
- Localisation : Rennes (35)
Re: LUA: vigilance météoFrance
Oui merci j'ai bien compris...
Mais peux tu essayer de tenir compte de ma réponse ?
Sinon pourquoi venir demander de l'aide ?
As tu vérifié que tu as choisi le bon type ?
Car ton erreur est là !
Mais peux tu essayer de tenir compte de ma réponse ?
Sinon pourquoi venir demander de l'aide ?
As tu vérifié que tu as choisi le bon type ?
Car ton erreur est là !
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
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua
Un ex domoticzien
Re: LUA: vigilance météoFrance
Explique moi mieux alors comme dit je suis une buse en lua
Ou ce modifie le type dont tu parles
j ai juste modifié ce qui est demandé en haut du script
mes idx :
560 virtuel 82560 1 Vigilance Alert General Alert risque non defini -
561 virtuel 82561 1 Alert Crue General Alert Pas de vigilance Crue - -
559 virtuel 00082559 1 Commentaire Meteo General Text En début d'après-midi, ligne orageuse active, avec grêle et fortes rafales de vent touchant la Lorraine et l'Alsace. Canicule toujours en cours avec un début d'atténuation sur la façade ouest.
Ou ce modifie le type dont tu parles
Code : Tout sélectionner
--[[
name : script_time_vigilance_meteofrance.lua
auteur : papoo
version : 1.30
date de création : 11/06/2016
Date de mise à jour : 25/06/16
Principe : Ce script a pour but de remonter les informations de vigilance de météoFrance 3 fois par jour à 07H10 13H10 et 18H10
Les informations disponibles sont :
- couleur vigilance météo (Rouge, Orange, Jaune, Vert)
- risque associé : vent violent, pluie-inondation, orages, inondations, neige-verglas, canicule, grand-froid, avalanche, vagues-submersion
Une vigilance peut ne pas être associée à un risque. dans ce cas, affichage de la mention "risque non défini".
- Conseils météo
- commentaires météo
- couleur vigilance crue avec 4 niveaux d'alerte
Niveau 4 Rouge : Risque de crue majeure. Menace directe et généralisée de la sécurité des personnes et des biens.
Niveau 3 Orange : Risque de crue génératrice de débordements importants susceptibles d'avoir un impact significatif sur la vie collective et la sécurité des biens et des personnes.
Niveau 2 Jaune : Risque de crue génératrice de débordements et de dommages localisés ou de montée rapide et dangereuse des eaux, nécessitant une vigilance particulière notamment dans le cas d'activités exposées et/ou saisonnières.
Niveau 1 Vert : Pas de vigilance particulière requise.
URL post : http://easydomoticz.com/forum/viewtopic.php?f=17&t=2160
Ce script utilise Lua-Simple-XML-Parser https://github.com/Cluain/Lua-Simple-XML-Parser
]]--
-- ========================================================================
-- Variables à éditer
-- ========================================================================
local departement = 11 -- renseigner votre numéro de département sur 2 chiffres exemples : 01 ou 07 ou 87
local dz_vigilance_alert = 560 -- renseigner l'id du device alert vigilance meteo associé (dummy - alert)
local dz_alert_crue = 561 -- renseigner l'id du device alert vigilance crue associé (dummy - alert)
local dz_conseil_meteo = 558 -- renseigner l'id du device texte Conseils Météo associé si souhaité, sinon nil
local dz_commentaire_meteo = 559 -- renseigner l'id du device texte Commentaire Météo associé si souhaité, sinon nil
local send_notification = 3 -- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local send_notification_crue = 3 -- 0: aucune notification, 1: toutes (meme verte), 2: vigilances jaune, orange et rouge, 3: vigilances orange et rouge 4: seulement vigilance rouge
local debugging = false -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local display_conseils = false -- true pour voir les conseils sans condition, false seulement en cas de vigilance dans le département sélectionné
local display_commentaire = false -- true pour voir les commentaires sans condition, false seulement en cas de vigilance dans le département sélectionné
-- ========================================================================
-- Fin Variables à éditer
-- ========================================================================
local indexArray=0
---------------------------------------------------------------------------
--Fonctions
---------------------------------------------------------------------------
function voir_les_logs (s)
if (debugging) then
print ("<font color='#f3031d'>".. s .."</font>");
end
end
function risqueTxt(nombre)
if nombre == 1 then return "vent violent"
elseif nombre == 2 then return "pluie-inondation"
elseif nombre == 3 then return "orages"
elseif nombre == 4 then return "inondations"
elseif nombre == 5 then return "neige-verglas"
elseif nombre == 6 then return "canicule"
elseif nombre == 7 then return "grand-froid"
elseif nombre == 8 then return "avalanche"
elseif nombre == 9 then return "vagues-submersion"
else return "risque non defini" end
end
---------------------------------------------------------------------------------
-- Lua-Simple-XML-Parser
---------------------------------------------------------------------------------
XmlParser = {};
self = {};
function XmlParser:ToXmlString(value)
value = string.gsub(value, "&", "&"); -- '&' -> "&"
value = string.gsub(value, "<", "<"); -- '<' -> "<"
value = string.gsub(value, ">", ">"); -- '>' -> ">"
value = string.gsub(value, "\"", """); -- '"' -> """
value = string.gsub(value, "([^%w%&%;%p%\t% ])",
function(c)
return string.format("&#x%X;", string.byte(c))
end);
return value;
end
function XmlParser:FromXmlString(value)
value = string.gsub(value, "&#x([%x]+)%;",
function(h)
return string.char(tonumber(h, 16))
end);
value = string.gsub(value, "&#([0-9]+)%;",
function(h)
return string.char(tonumber(h, 10))
end);
value = string.gsub(value, """, "\"");
value = string.gsub(value, "'", "'");
value = string.gsub(value, ">", ">");
value = string.gsub(value, "<", "<");
value = string.gsub(value, "&", "&");
return value;
end
function XmlParser:ParseArgs(node, s)
string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a)
node:addProperty(w, self:FromXmlString(a))
end)
end
function XmlParser:ParseXmlText(xmlText)
local stack = {}
local top = newNode()
table.insert(stack, top)
local ni, c, label, xarg, empty
local i, j = 1, 1
while true do
ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i)
if not ni then break end
local text = string.sub(xmlText, i, ni - 1);
if not string.find(text, "^%s*$") then
local lVal = (top:value() or "") .. self:FromXmlString(text)
stack[#stack]:setValue(lVal)
end
if empty == "/" then -- empty element tag
local lNode = newNode(label)
self:ParseArgs(lNode, xarg)
top:addChild(lNode)
elseif c == "" then -- start tag
local lNode = newNode(label)
self:ParseArgs(lNode, xarg)
table.insert(stack, lNode)
top = lNode
else -- end tag
local toclose = table.remove(stack) -- remove top
top = stack[#stack]
if #stack < 1 then
error("XmlParser: nothing to close with " .. label)
end
if toclose:name() ~= label then
error("XmlParser: trying to close " .. toclose.name .. " with " .. label)
end
top:addChild(toclose)
end
i = j + 1
end
local text = string.sub(xmlText, i);
if #stack > 1 then
error("XmlParser: unclosed " .. stack[#stack]:name())
end
return top
end
function XmlParser:loadFile(xmlFilename, base)
if not base then
base = system.ResourceDirectory
end
local path = system.pathForFile(xmlFilename, base)
local hFile, err = io.open(path, "r");
if hFile and not err then
local xmlText = hFile:read("*a"); -- read file content
io.close(hFile);
return self:ParseXmlText(xmlText), nil;
else
print(err)
return nil
end
end
function newNode(name)
local node = {}
node.___value = nil
node.___name = name
node.___children = {}
node.___props = {}
function node:value() return self.___value end
function node:setValue(val) self.___value = val end
function node:name() return self.___name end
function node:setName(name) self.___name = name end
function node:children() return self.___children end
function node:numChildren() return #self.___children end
function node:addChild(child)
if self[child:name()] ~= nil then
if type(self[child:name()].name) == "function" then
local tempTable = {}
table.insert(tempTable, self[child:name()])
self[child:name()] = tempTable
end
table.insert(self[child:name()], child)
else
self[child:name()] = child
end
table.insert(self.___children, child)
end
function node:properties() return self.___props end
function node:numProperties() return #self.___props end
function node:addProperty(name, value)
local lName = "@" .. name
if self[lName] ~= nil then
if type(self[lName]) == "string" then
local tempTable = {}
table.insert(tempTable, self[lName])
self[lName] = tempTable
end
table.insert(self[lName], value)
else
self[lName] = value
end
table.insert(self.___props, { name = name, value = self[name] })
end
return node
end
---------------------------------------------------------------------------
-- Fin Fonctions
---------------------------------------------------------------------------
commandArray = {}
now=os.date("*t")
if (now.min == 10 and ((now.hour == 7) or (now.hour == 13) or (now.hour == 18))) then -- 3 éxecutions du script par jour à 7H10, 13h10 et 18H10
--if now.min % 56 == 0 then -- éxécution du script toutes les X minutes
print("script_time_vigilance_meteofrance.lua")
-- deux methodes pour récupérer les informations xml, WGET ou CURL si vous décommentez la methode curl pensez à commenter la methode wget
-- début methode wget
local fname ="vigilance.xml"
os.execute("wget -q -O " .. fname .. " http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml")
-- fin methode wget
-- début methode curl
--local fname ="/tmp/vigilance.xml"
--os.execute("curl http://vigilance.meteofrance.com/data/NXFR34_LFPW_.xml > ".. fname .." && chmod 777 " .. fname)
-- fin methode curl
voir_les_logs("Fichier local : " ..fname,debugging)
local f = io.open(fname, "r")
if f == nil then
print("Error opening file '" .. fname .. "'.")
os.exit(1)
end
local testXml = f:read("*all")
f:close()
local parsedXml = XmlParser:ParseXmlText(testXml)
if (parsedXml) then local abr = parsedXml.cartevigilance
for i in pairs(abr:children()) do
if (abr:children()[i]:name() == "datavigilance") then
if (tonumber(abr:children()[i]["@dep"]) == departement) then
CouleurVigilance = tonumber(abr:children()[i]["@couleur"])
voir_les_logs("--- --- --- Couleur Vigilance : ".. CouleurVigilance .. " pour le departement : ".. departement,debugging)
if (#abr:children()[i]:children() > 0) then
for j = 1, #abr:children()[i]:children() do
if (abr:children()[i]:children()[j]:name() == "crue") then
crue = tonumber(abr:children()[i]:children()[j]["@valeur"])
if crue ~= nil then
voir_les_logs("--- --- --- Crue trouvée : ".. crue,debugging)
else
voir_les_logs("--- --- --- pas d'information Crue trouvée",debugging)
end
elseif (abr:children()[i]:children()[j]:name() == "risque") then
risque = tonumber(abr:children()[i]:children()[j]["@valeur"])
voir_les_logs("--- --- --- Risque trouvée : ".. risque,debugging)
end
end
end
end
elseif (abr:children()[i]:name() == "entetevigilance") then
for j in pairs(abr:children()[i]:children()) do
if (abr:children()[i]:children()[j]:name() == "vigilancecommentaire") then
commentaire = abr:children()[i]:children()[j]["@texte"]
if commentaire ~= nil then
voir_les_logs("--- --- --- Commentaire : " ..commentaire,debugging)
else
voir_les_logs("--- --- --- pas de Commentaire",debugging)
end
end
if (abr:children()[i]:children()[j]:name() == "vigilanceconseil") then
conseil = abr:children()[i]:children()[j]["@texte"]
if conseil ~= nil then
voir_les_logs("--- --- --- Conseils : ".. conseil,debugging)
end
end
end
end
end
else
print("erreur parsedXml")
end
risque = risqueTxt(risque)
if CouleurVigilance == nil and dz_vigilance_alert ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert ..'|0|'.. risque}
voir_les_logs("--- --- --- Aucune donnée disponible pour la departement : ".. departement,debugging)
indexArray=indexArray+1
end
if CouleurVigilance ~= nil then
voir_les_logs("--- --- --- CouleurVigilance : ".. CouleurVigilance,debugging)
if tonumber(CouleurVigilance) == 1 then -- niveau 1
if dz_vigilance_alert ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|1|'.. risque}
indexArray=indexArray+1
end
if send_notification > 0 and send_notification < 2 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- Pas de vigilance --- --- ---",debugging)
elseif tonumber(CouleurVigilance) == 2 then -- niveau 2
if dz_vigilance_alert ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|2|'.. risque}
indexArray=indexArray+1
end
if send_notification > 0 and send_notification < 3 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance faible ".. risque.. " --- --- ---",debugging)
elseif tonumber(CouleurVigilance) == 3 then -- niveau 3
if dz_vigilance_alert ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|3|'.. risque}
indexArray=indexArray+1
end
if send_notification > 0 and send_notification < 4 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance Forte ".. risque.. " --- --- ---",debugging)
elseif tonumber(CouleurVigilance) > 3 then -- niveau 4
if dz_vigilance_alert ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_vigilance_alert..'|4|'.. risque}
indexArray=indexArray+1
end
if send_notification > 0 and send_notification < 5 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance meteo#'.. risque}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance très forte ".. risque.. " --- --- ---",debugging)
else
print("niveau non defini")
end
end
-- ====================================================================================================================
-- Conseil météo
-- ====================================================================================================================
if ( dz_conseil_meteo ~= nil and conseil ~= nil and CouleurVigilance > 1 ) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == true ) then -- Mise à jour du devise texte conseil météo si il existe
commandArray[indexArray] = {['UpdateDevice'] = dz_conseil_meteo..'|0|'.. conseil}
indexArray=indexArray+1
elseif (dz_conseil_meteo ~= nil and conseil == nil) or ( dz_conseil_meteo ~= nil and conseil ~= nil and display_conseils == false ) then -- Mise à jour du devise texte conseil météo si il existe même s'il n'y a pas de conseil disponible
commandArray[indexArray] = {['UpdateDevice'] = dz_conseil_meteo..'|0|Aucun conseil disponible'}
indexArray=indexArray+1
end
-- ====================================================================================================================
-- Commentaire météo
-- ====================================================================================================================
if ( dz_commentaire_meteo ~= nil and commentaire ~= nil and CouleurVigilance > 1 ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == true ) then -- Mise à jour du devise texte commentaire météo si il existe
commandArray[indexArray] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|'.. commentaire}
indexArray=indexArray+1
elseif (dz_commentaire_meteo ~= nil and commentaire == nil ) or ( dz_commentaire_meteo ~= nil and commentaire ~= nil and display_commentaire == false ) then -- Mise à jour du devise texte commentaire météo si il existe même s'il n'y a pas de commentaire disponible
commandArray[indexArray] = {['UpdateDevice'] = dz_commentaire_meteo..'|0|Aucun commentaire disponible'}
indexArray=indexArray+1
end
-- ====================================================================================================================
-- vigilance crue
-- ====================================================================================================================
if dz_alert_crue ~= nil and crue ~= nil then
voir_les_logs("--- --- --- Vigilance Crue : ".. crue,debugging)
if tonumber(crue) == 1 then -- niveau 1
if dz_alert_crue ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|1|Pas de vigilance Crue'}
indexArray=indexArray+1
end
if send_notification_crue > 0 and send_notification_crue < 2 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Pas de vigilance Crue'}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- Pas de vigilance crue --- --- ---",debugging)
elseif tonumber(crue) == 2 then -- niveau 2
if dz_alert_crue ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|2|Risque de crue génératrice de débordements localisés'}
indexArray=indexArray+1
end
if send_notification_crue > 0 and send_notification_crue < 3 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements localisés'}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance faible Crue --- --- ---",debugging)
elseif tonumber(crue) == 3 then -- niveau 3
if dz_alert_crue ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|3|Risque de crue génératrice de débordements importants'}
indexArray=indexArray+1
end
if send_notification_crue > 0 and send_notification_crue < 4 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue génératrice de débordements importants'}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance Forte Crue --- --- ---",debugging)
elseif tonumber(crue) > 3 then -- niveau 4
if dz_alert_crue ~= nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|4|Risque de Crue majeure'}
indexArray=indexArray+1
end
if send_notification_crue > 0 and send_notification_crue < 5 then
commandArray[indexArray] = {['SendNotification'] = 'Alerte vigilance crue#Risque de crue majeure'}
indexArray=indexArray+1
end
voir_les_logs("--- --- --- vigilance très forte Crue --- --- ---",debugging)
else
print("niveau non defini")
end
if dz_alert_crue ~= nil and crue == nil then
commandArray[indexArray] = {['UpdateDevice'] = dz_alert_crue..'|0|Pas d\'information vigilance Crue'}
indexArray=indexArray+1
end
end
-- ====================================================================================================================
-- fin vigilance crue
-- ====================================================================================================================
end -- if now
return commandArrayj ai juste modifié ce qui est demandé en haut du script
mes idx :
560 virtuel 82560 1 Vigilance Alert General Alert risque non defini -
561 virtuel 82561 1 Alert Crue General Alert Pas de vigilance Crue - -
559 virtuel 00082559 1 Commentaire Meteo General Text En début d'après-midi, ligne orageuse active, avec grêle et fortes rafales de vent touchant la Lorraine et l'Alsace. Canicule toujours en cours avec un début d'atténuation sur la façade ouest.
Re: LUA: vigilance météoFrance
Je suppose que tu as mis ton script dans " réglages", "plus d'options", " événements"
vil1driver te demande si tu as bien mis " time"

vil1driver te demande si tu as bien mis " time"

Domoticz V2022.2
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY
sous Buster, Homebridge,RfLink
Raspberry pi3, Google home mini
plein de truc wifi !! de l'esp-01 jusque le nodemcu en passant par le wemos et même du DIY