Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'tuto hc2'.



Plus d’options de recherche

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Bienvenue
    • Nouveau ? Présentez-vous
    • Le bistrot
    • Mon installation domotique
    • Annonces et suggestions
  • La Home Center et ses périphériques
    • La Home Center pour les nuls
    • HC 2 & Lite
    • HC 3
    • Modules Fibaro
    • Modules Z-wave
    • Périphériques et matériels autres
    • Plugins
    • Quick App
    • Multimédia (audio, vidéo ...)
    • Chauffage et Energie
    • Actionneurs & Ouvrants (Portail, volets, piscines, ...)
    • Eclairage
    • Applications Smartphones et Tablettes
  • Autres solutions domotiques
    • Box / Logiciel
    • Modules Nice (433 & 866 MHz)
    • Modules Zigbee
    • GCE Electronics
    • Modules Bluetooth Low Energy
  • Objets connectés
    • Les Assistants Vocaux
    • Netatmo
    • Philips Hue
    • DIY (Do It Yoursel)
  • Sécurité
    • Alarmes
    • Caméras
    • Portiers
    • Serrures
  • Informatique / Réseau
    • Tutoriels
    • Matériels Réseaux
    • Matériels Informatique
    • NAS
    • Virtualisation
  • Les bonnes affaires
    • Sites internet
    • Petites annonces

Rechercher les résultats dans…

Rechercher les résultats qui…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


Jabber


Skype


Ville :


Intéret :


Version

133 résultats trouvés

  1. mprinfo

    Vd - Surveillance Free Memory Hc2

    Surveillance Free Memory HC2 Voici un VD qui va vous permettre de connaitre la taille maximum et minimum de la mémoire libre de votre HC2 ainsi que la taille libre en temps réel C'est un VD très simple, il permet de connaitre les piques de mémoire maximum et minimum. Cela ne veut pas dire que les problémes de RAM que certains connaissent sont du à la RAM Le SWAP (fichier échange n'est pas pris en compte dans ce VD) car il n'est pas accessible via l'api de la box. De plus il n'est utilisé que lorsque RAM libre est inférieur a 5%. Le cache et le Buffers sont considéré comme de la RAM utilisé. Codes des différents Boutons : Bouton UPDATE local SelfId = fibaro:getSelfId() local pause = fibaro:get(SelfId, 'IPAddress') local NivAlerte = fibaro:get(SelfId, 'TCPPort') local IdTel = fibaro:getGlobal("TelPascal") local HC2 = Net.FHttp("127.0.0.1",11111) local response, status, errorCode = HC2:GET("/api/diagnostics") local result = json.decode(response) local RamFree = tonumber(result.memory.free) local RamCache = tonumber(result.memory.cache) local RamBuffers = tonumber(result.memory.buffers) local heure = os.date("%H:%M:%S", os.time())--os.date("%T") local date = os.date("%d/%m") local RamMax = tonumber(string.sub(fibaro:getValue(SelfId, "ui.labMax.value"), -4, -2)) local RamMini = tonumber(string.sub(fibaro:getValue(SelfId, "ui.labMini.value"),-4, -2)) ----------------------------------------------------------------- --- Message d'alerte Push ----------------------------------------------------------------- local push = tonumber(fibaro:getValue(SelfId, "ui.labPush.value")) if RamFree < tonumber(NivAlerte) then if push == nil then push = 0 end if push > 0 then push = push - tonumber(pause) fibaro:debug("difference"..push) else local Message = string.format("HC2 Espace Memoire faible %s le %s a %s", RamFree, os.date("%d/%m/%Y"), os.date("%R")) fibaro:call(IdTel, "sendPush", Message) push = 600 -- 10mn end else push = "" end ------------------------------------------------------------------ if RamMax == nil or RamMini == nil then RamMax = 0 RamMini = 0 end if RamFree > RamMax then RamMax = string.sub("0"..RamFree.." %", -4) fibaro:call(SelfId,"setProperty","ui.labMax.value", date.." à "..heure.." - "..RamMax) end if RamFree < RamMini or RamMini == 0 then RamMini = string.sub("0"..RamFree.." %", -4) fibaro:call(SelfId,"setProperty","ui.labMini.value", date.." à "..heure.." - "..RamMini) end ------------------------------------------------------------------ -- Mise a jour de label ------------------------------------------------------------------ fibaro:call(SelfId,"setProperty","ui.labPush.value", push) fibaro:call(SelfId,"setProperty","ui.labFreeRam.value", heure.." - "..RamFree.." %") fibaro:call(SelfId,"setProperty","ui.labSwap.value", heure.." - "..RamCache .." %") fibaro:call(SelfId,"setProperty","ui.labelBuffers.value", heure.." - "..RamBuffers .." %") Bouton RESET local SelfId = fibaro:getSelfId() local heure = os.date("%T") fibaro:call(SelfId,"setProperty","ui.labMini.value", "") fibaro:call(SelfId,"setProperty","ui.labMax.value", "") Bouton REBOOT function confirm(msg, labelId, secondes) local current = fibaro:getValue(fibaro:getSelfId(), "ui."..labelId..".value") if (current == msg) then fibaro:call(fibaro:getSelfId(), "setProperty", "ui."..labelId..".value", " ") return true else fibaro:call(fibaro:getSelfId(), "setProperty", "ui."..labelId..".value", msg) fibaro:sleep(secondes*1000) fibaro:call(fibaro:getSelfId(), "setProperty", "ui."..labelId..".value","") return fibaro:getValue(fibaro:getSelfId(), "ui."..labelId..".value") == " " end end -- ----------------------------- -- A vous de jouer by Steven --- -- ----------------------------- local message = "Ré-appuyer pour confirmer" -- le message de confirmation local label_id = "lblMessage" -- l'ID du label qui recevra le message local duree = 3 -- la durée max entre 2 clique (en seconde) if ( confirm(message, label_id, duree) ) then fibaro:log("Confirmé") local SelfId = fibaro:getSelfId() local HC2 = Net.FHttp("127.0.0.1",11111) response, status, errorCode = HC2:POST("/api/settings/reboot", "data=shutdown -h"); if errorCode == 0 then fibaro:log(status); else fibaro:log("error"); end else fibaro:log("Annulé") message = "Demande Annulée..." confirm(message, label_id, 10) message = "" confirm(message, label_id, 1) end Main Loop local SelfId = fibaro:getSelfId() local pause = fibaro:get(SelfId, 'IPAddress') ----------------------------------------------------------------- fibaro:call(fibaro:getSelfId(), "pressButton", "6") fibaro:sleep(pause*1000) Utilisation : il va falloir renseigner 3 valeurs Le temps de rafraichissement des valeurs, ce temps sera exprimé en seconde. Pour renseigner cette valeur il suffit de rentrer un chiffre a la place de Adresse IP:Exemple : Pour une mise a jour toute les 3 mn Adresse IP : 180 Le % de mémoire libre restants à partir du quel je veux être averti par push. Pour renseigner cette valeur il suffit de rentrer un chiffre a la place de Port TCP: Exemple : Pour recevoir un push lorsque la mémoire vive libre est inférieur à 25 % PortTCP: 25 L'ID de votre SmartPhone ou Apple Phone local IdTel = fibaro:getGlobal("TelPascal") --si votre tel est enregistré dans une VG ou local IdTel = 69 -- id du telephone Cette ligne ce trouve dans le bouton UPDATE ligne 4 Prochaine évolution : amélioration de la boucle pour l'envoi de push Icône du VD réalisé par notre amis DID Voici le VD a importer sur votre HC2 : Free_Memory_v1.10.vfib
  2. Watchdog Version 1.3 Voici une scène permettant de surveiller le fonctionnement des Scènes et Main Loop de Modules Virtuels sur Home Center 2 en version 4.x. Pour ce faire, les messages de la fenêtre de Debug sont analysés. De plus, pour les scènes uniquement, le nombre d'instances est compté. En cas de problème détecté, la scène ou le virtual device considéré est automatiquement redémarré, et une notification peut être envoyée. Copier/coller le script LUA suivant dans une nouvelle scène : --[[ %% autostart %% properties %% globals --]] -------------------------------------------------- -- Scene : Watchdog -- Author : Lazer -- Version : 1.3 -- Date : June 2017 -------------------------------------------------- -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { } local userID = {} -- Email local smartphoneID = {} -- Push local sms = { ["VD_ID"] = 0, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false -- -- Message function -- function Message(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>') else fibaro:debug(message or '<nil>') end end -- -- Notification function -- function Notification(message, param) local message = message or "<vide>" Message("yellow", "Notification : "..message) if param then for _, notif in ipairs(param) do if debug then Message("grey", notif) end -- Envoi Push if notif == "push" and smartphoneID then for _, id in ipairs(smartphoneID) do if debug then Message("grey", "Send Push smartphone ID : "..id) end fibaro:call(id, "sendPush", message) end -- Envoi Email elseif notif == "email" and userID then for _, id in ipairs(userID) do if debug then Message("grey", "Send Email user ID : "..id) end fibaro:call(id, "sendEmail", "HC2 Watchdog", message) end -- Envoi SMS elseif notif == "sms" and sms then if debug then Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or "")) end fibaro:setGlobal(sms["VG_Name"], message) if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"]) end end end else Message("orange", "Warning : no notification options given") end end -- -- Restart function -- function Restart(type, id, restart, notification, reason) Message("blue", 'Restart '..type..'('..id..')') -- Prepare API URL local getURL = "" local putURL = "" if type:lower() == "scene" then getURL = 'http://127.0.0.1:11111/api/scenes/'..id putURL = 'http://127.0.0.1:11111/api/scenes/'..id elseif type:lower() == "vd" then getURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id putURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id end -- Load VD/Scene local httpClient = net.HTTPClient() httpClient:request(getURL, { success = function(response) if response.status == 200 then local jsonTable = json.decode(response.data) local name = jsonTable.name or "" if restart and restart == true then -- Add new line at end of scene lua code if type:lower() == "scene" and jsonTable.lua then jsonTable.lua = jsonTable.lua .. "\n" response.data = json.encode(jsonTable) end -- Save VD/Scene httpClient:request(putURL, { success = function(response) if response.status == 200 then Message("green", type.."("..id..") successfully restarted") Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") a été redémarré : "..(reason or "???"), notification) else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'PUT', -- headers = { -- ["content-type"] = 'application/x-www-form-urlencoded;' -- }, data = response.data } }) else Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") doit être redémarré manuellement : "..(reason or "???"), notification) end else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'GET' } }) end -- function -- -- Check function -- function Check(interval) Message(nil, "Check") -- Browse VD/Scene list local httpClient = net.HTTPClient() local elements = #watchdog for i = 1, elements do -- Initialization local countscene_found = false if debug then Message(nil, "Check : type="..watchdog[i].type.." id="..watchdog[i].id) end -- Check number of running scene instances if watchdog[i].type:lower() == "scene" and watchdog[i].count and watchdog[i].count > 0 then local countScenes = fibaro:countScenes(watchdog[i].id) if countScenes < watchdog[i].count then Message("orange", watchdog[i].type..'('..watchdog[i].id..') '..countScenes..' running instance') countscene_found = true Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, countScenes..' instance') elseif debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') '..countScenes.." running instance") end end if countscene_found == false then -- Do not enter this loop if scene has already been restarted -- Prepare API URL local getURL = "" if watchdog[i].type:lower() == "scene" then getURL = "http://127.0.0.1:11111/api/scenes/"..watchdog[i].id.."/debugMessages" elseif watchdog[i].type:lower() == "vd" then getURL = "http://127.0.0.1:11111/api/virtualDevices/"..watchdog[i].id.."/debugMessages/0" else Message("red", "Error : unknown type value") end if getURL ~= "" then if debug then Message("grey", getURL) end -- Load VD/Scene debug messages httpClient:request(getURL, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) local current_timestamp = os.time() local oldest_timestamp = current_timestamp local match_found = false local no_match_found = false local reason = "" -- Reverse browsing of debug messages for j = #jsonTable, 1, -1 do oldest_timestamp = jsonTable[j].timestamp -- Check if debug message match lookup string within allowed interval if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and jsonTable[j].txt:match(watchdog[i].match.text) then if jsonTable[j].timestamp > current_timestamp - watchdog[i].match.interval then if debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].match.text..'"') end match_found = true end end -- Check if debug message match forbidden string if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and jsonTable[j].txt:match(watchdog[i].no_match.text) then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].no_match.text..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end if watchdog[i].no_match.type and watchdog[i].no_match.type ~= "" and jsonTable[j].type == watchdog[i].no_match.type then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found type "'..watchdog[i].no_match.type..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end end -- for if debug and oldest_timestamp > current_timestamp - watchdog[i].match.interval then Message("grey", watchdog[i].type..'('..watchdog[i].id..') oldest debug timestamp more recent than interval') end -- Restart VD/Scene if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and match_found == false and oldest_timestamp < current_timestamp - watchdog[i].match.interval then Message("orange", watchdog[i].type..'('..watchdog[i].id..') String "'..watchdog[i].match.text..'" not found') reason = 'Chaine « ' .. watchdog[i].match.text .. ' » non trouvée' if #jsonTable > 0 then reason = reason .. ', dernier message : ' .. os.date('%H:%M:%S', (jsonTable[#jsonTable].timestamp or 0)) .. ' « ' .. (jsonTable[#jsonTable].txt or "<nil>") .. ' »' end Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) --if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and no_match_found == true then elseif no_match_found == true then Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) end else Message("red", "Error : empty response") end else Message("red", "Error : status=" .. tostring(response.status)) end end, error = function(err) Message("red", 'Error : ' .. err) end, options = { method = 'GET' } }) end end end -- for -- Wait if interval and interval > 0 then setTimeout(function() Check(interval) end, interval*1000) end end -- function -- -- Main loop -- local trigger = fibaro:getSourceTrigger() if trigger["type"] == "autostart" then Message(nil, "Watchdog instance autostart") -- Check function call delayed to prevent killing all other scenes not already started right after HC2 boot setTimeout(function() Check(intervalle) end, delay*1000) else Message(nil, "Watchdog instance manual launch") -- Call Check function Check(nil) end . Le paramétrage du script s'effectue dans les quelques lignes situées sous le commentaire "User variables" : intervalle : durée entre 2 vérifications delay : délai avant la première vérification. En effet, cette scène ayant la propriété autostart afin de démarrer automatiquement au boot de la box, le risque est de démarrer avant les autres Scène/VD, et de forcer un redémarrage de ceux-ci alors qu'ils n'ont pas encore effectivement démarré. Ce délai laisse donc aux autres Scène/VD le temps de démarrer et de s'initialiser proprement. watchdog : tableau dont chaque ligne représente une Scène ou un Virtual Device à monitorer : type : "Scene" ou "VD" id : valeur numérique représentant l'ID de la Scène ou VD à monitorer match : texte qui doit être trouvé pendant un certain laps de temps afin de confirmer le bon fonctionnement du VD/Scène. Cela correspond typiquement à un message affiché cycliquement à intervalle régulier. Les 2 champs suivants doivent être renseignés pour que la condition soit prise en compte (condition ET) : text : chaine de caractères à trouver interval : durée en secondes no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. count : valeur valable pour les scènes uniquement, et indiquant le nombre minimal d'instances qui doivent fonctionner pour confirmer le bon fonctionnement de la scène. Cela correspond typiquement à l'instance de type boucle infinie lancée en autostart. restart : true ou false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. notification : liste séparée par des virgules des moyens de notifications à employer. userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notifications par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires : VD_ID : ID du module virtuel VD_Button : ID du bouton du module virtuel VG_Name : nom de la variable globale debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage de la scène. Exemple de paramètres : -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { {type = "Scene", id = 1, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence Lazer {type = "Scene", id = 2, match = {text="Last run", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- DomoCharts {type = "Scene", id = 3, match = {text="Durée des traitements", interval=11*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- GEA {type = "VD", id = 1, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Surveillance Station {type = "VD", id = 2, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Clock Sync {type = "VD", id = 3, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- My Batteries {type = "VD", id = 4, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Evénements {type = "VD", id = 5, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Network Monitor {type = "VD", id = 6, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- GEA Alarm {type = "VD", id = 7, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true) {type = "VD", id = 8, match = {text="Start main process", interval=31*60}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}} -- Freebox Serveur } local userID = {1} -- Email local smartphoneID = {1, 2} -- Push local sms = { ["VD_ID"] = 99, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false
  3. Bonjour, Voilà , le code est enfin correct, je le partage donc. Je n'ai pas beaucoup de temps ce soir, mais voici 2-3 points: - Ce VD crée automagiquement 3 Variables globales (si demandé dans les options) - Ce VD est multilingue - Ce VD fait des push de la météo à deux moments de la journée - CE VD s'adapte aux mobiles et à l'interface web - Ce VD télécharge automagiquement les icônes - Ce VD a besoin d'une clef APi de Wunderground, - La partie mobile du VD n'est pas encore complètement terminée. Merci à Jompa68 de forum.fibaro.com pour le code de base Pour l'installer: - Téléchargez le vfib attaché et importez le dans la HC2 - Changer l'icône du slider avec l'icône attachée: - Utilisez le dernier code disponible sur github: https://github.com/sjauquet/YAMSWU Qui ajoute la création de VG qui contiendront la météo prononçable par une synthèse vocale comme S.A.R.A.H.: http://www.domotique-fibaro.fr/index.php/topic/6446-yams-wu-yet-another-meteo-station-wunderground-version/page-4#entry132933 et placez-le dans le main loop du VFIB (V3.9) attaché à ce message - Changez l'api key. Pour cela, créez un compte wunderground et allez la récupérer ici: http://www.wunderground.com/weather/api/ WU.APIkey = "xxxxxxxxxxxxxxx" - Ensuite définissez les variables suivantes: WU.PWS = "IGVLEBOR5" -- The PWS location to get data from (Personal Weather Station) WU.LOCID = "SWXX0076" -- The location ID to get data from (City location) WU.station = "PWS" -- Choose your prefered method to retrieve from: PWS or LOCID Personnellement je préfère utiliser les infos d'une pws près de chez moi. Pour trouver ces variables: @bono2007 écrivait: Pour trouver, j'ai eu la station PWS en cliquant dans "Search locations" sur Wunderground, on te propose "search nearest station", et il a proposé une station météo proche. Sinon en entrant ta ville, tu peux cliquer sur "change Station" et tu verras une carte avec d'autres stations météo. Exemple : j'ai entré "Boussois" et j'ai comme station météo "Cit du Grand Bois, Récquignies ( IRECQUIG2) J'ai modifié WU.PWS = "IRECQUIG2" Et tout devrait fonctionner :-) Virtual device avec code V3.7 (ancien à remplacer !!! ) YAMS_WU.vfib Virtual device avec code V3.9 YAMS_WU V3.9.vfib Voici les dernières captures d'écran pour avoir une idée: à gauche en mode Browser Web, à droite en mode Mobile (les icônes ne sont pas téléchargeables) Attention, ancien code ci-dessous ! ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- WU WeatherData - Fetch weather data from wunderground.com. Multilanguage support! -- Original Code by Jonny Larsson 2015 http://forum.fibaro.com/index.php?/topic/19810-wu-weatherdata-version-202-2015-10-25/ -- forked by Sébastien Jauquet 11/2015 -- Inspired by GEA(steven), stevenvd, Krikroff and many other users. -- Source - forum.fibaro.com, domotique-fibaro.fr and worldwideweb -- -- Version 3.7 -- -- PWS = Personal Weather Station -- LOCID = Public station -- -- 2014-03-22 - Permissions granted from Krikroff -- 2014-03-23 - Added rain and forecast, Added FR language. -- 2014-03-23 - Language variable changed to get the translation from wunderground.com in forcast -- 2014-03-24 - Added PL language -- 2014-03-24 - Select between PWS or LOCID to download weather data -- 2015-10-23 - New source code. -- 2015-11-13 - V3.0 - Fork Code by Sebastien Jauquet (3 days forecast, rain in mm) -- 2015-11-14 - V3.1 - Compatibilty with GEA, French translation -- 2015-11-14 - V3.2 - Catch rain errors (-999mm null empty etc.) -- 2015-11-14 - V3.3 - Catch json decode error (was stopping main loop) with pcall (can be extended to other jdon datas if needed) -- 2015-11-16 - V3.4 - Generate HTML and non HTML version (for compatibility with mobiles) -- 2015-11-18 - V3.5 - Fixed bug not updating Meteo_Day becaus WU.now was only updated at first launch -- 2015-11-18 - V3.6 - Merged some changes from jompa new version -- 2015-11-18 - Added autmatic creation of Global Variables if not existing -- 2015-11-19 - V3.7 - Modify schedule management and CleanUp code -- Look for nearest station here: http://www.wunderground.com ------------------------------------------------------------------------------------------- -- MAIN CODE -- ------------------------------------------------------------------------------------------- WU = {} -- WU settings WU.APIkey = "xxxxxxxxxxxxxxx" -- Put your WU api key here WU.PWS = "IGVLEBOR5" -- The PWS location to get data for (Personal Weather Station) WU.LOCID = "SWXX0076" -- The location ID to get data for (City location) WU.station = "PWS" -- PWS or LOCID -- Other settings WU.translation = {true} WU.language = "FR"; -- EN, FR, SW, PL (default is en) WU.smartphoneID = 1347 -- your smartphone ID WU.sendPush = true -- send forecast as push message WU.push_fcst1 = "07:00" -- time when forecast for today will be pushed to smartphone WU.push_fcst2 = "18:15" -- time when forecast for tonight will be pushed to smartphone WU.GEA = true -- subst % with %% when storing in the VG's (because gea bug with % in push messages) WU.CreateVG = true -- will atomaticaly create global variables at first run if = true updateEvery = 30 -- get data every xx minutes WU.startTime = os.time() WU.scheduler = os.time()+60*updateEvery WU.currentDate = os.date("*t"); WU.now = os.date("%H:%M"); DoNotRecheckBefore = os.time() WU.selfId = fibaro:getSelfId() WU.version = "3.7" WU.translation["EN"] = { Push_forecast = "Push forecast", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperature", Humidity = "Humidity", Pressure = "Pressure", Wind = "Wind", Rain = "Rain", Forecast = "Forecast", Station = "Station", Fetched = "Fetched", Data_processed = "Data processed", Update_interval = "Next update will be in (min)", No_data_fetched = "No data fetched", NO_STATIONID_FOUND = "No stationID found", NO_DATA_FOUND = "No data found" } WU.translation["FR"] = { Push_forecast = "Push des prévisions", Exiting_loop_slider = "Sortie de boucle (Slider Changé)", Exiting_loop_push = "Sortie de boucle (Pour Push)", Last_updated = "Mise à jour", Temperature = "Actuellement", Humidity = "Hum", Pressure = "Pression", Wind = "Vent", Rain = "Pluie", Forecast = "Prévisions pour ce", Station = "Station", Fetched = "Données Reçues", Data_processed = "Données mises à jour", Update_interval = "Prochaine Mise à jour prévue dans (min)", No_data_fetched = "Pas de données reçues !!", NO_STATIONID_FOUND = "StationID non trouvée !!", NO_DATA_FOUND = "Pas de données disponibles !!" } WU.translation["SW"] = { Push_forecast = "Push forecast", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatur", Humidity = "Fuktighet", Pressure = "Barometer", Wind = "Vind", Rain = "Regn", Forecast = "Prognos", Station = "Station", Fetched = "Hà¤mtat", Data_processed = "All data processat", Update_interval = "Nà¤sta uppdatering à¤r om (min)", No_data_fetched = "Inget data hà¤mtat", NO_STATIONID_FOUND = "StationID ej funnet", NO_DATA_FOUND = "Ingen data hos WU" } WU.translation["PL"] = { Push_forecast = "Push prognoza", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatura", Humidity = "Wilgotnosc", Pressure = "Pressure", Wind = "Wiatr", Rain = "Rain", Forecast = "Forecast", Station = "Station", Fetched = "Fetched", Data_processed = "Data processed", No_data_fetched = "No data fetched", Update_interval = "Next update will be in (min)", NO_STATIONID_FOUND = "No stationID found", NO_DATA_FOUND = "No data found" } WU.translation["NL"] = { Push_forecast = "Push verwachting", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatuur", Humidity = "Vochtigheid", Pressure = "Druk", Wind = "Wind", Rain = "Regen", Forecast = "Verwachting", Station = "Weerstation", Fetched = "Ontvangen", Data_processed = "Gegevens verwerkt", Update_interval = "Volgende update in (min)", No_data_fetched = "Geen gegevens ontvangen", NO_STATIONID_FOUND = "Geen stationID gevonden", NO_DATA_FOUND = "Geen gegevens gevonden" } WU.translation["DE"] = { Push_forecast = "Push vorhersage", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatur", Humidity = "Luftfeuchtigkeit", Pressure = "Luftdruck", Wind = "Wind", Rain = "Regen", Forecast = "Vorhersage", Station = "Station", Fetched = "Abgerufen", Data_processed = "Daten verarbeitet", No_data_fetched = "Keine Daten abgerufen", Update_interval = "Das nà¤chste Update in (min)", NO_STATIONID_FOUND = "Keine stationID gefunden", NO_DATA_FOUND = "Keine Daten gefunden" } Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); end WU.createGlobalIfNotExists = function (varName, defaultValue) if (fibaro:getGlobal(varName) == "") then Debug("red", "Global Var: "..varName.." HAS BEEN CREATED") newVar = {} newVar.name = varName HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json.encode(newVar)) end end WU.substPercent = function(doublePercentSymbol) if WU.GEA then doublePercentSymbol = string.gsub(doublePercentSymbol, "%%.", "%%%%") end return doublePercentSymbol end WU.cleanJson = function(jsontocheck,returnIfTrue) if jsontocheck == "-999.00" or jsontocheck == "--" or jsontocheck == json.null then jsontocheck = returnIfTrue end local ok = pcall(function() testConcatenate = "Test Concatenate: " .. jsontocheck -- test for non concatenate value end ) if (not ok) then decode_error = true Debug( "red", "decode raised an error") fibaro:call(WU.smartphoneID , "sendPush", "decode error in WU Meteo") end return jsontocheck end WU.HtmlColor = function(StringToColor,color) if MobileDisplay == false then StringToColor= "<font color=\""..color.."\"> "..StringToColor.."</font>" end return StringToColor end WU.IconOrText = function(icon,txt) if MobileDisplay == false then IconOrText = "<img src="..icon.."\>" else IconOrText = txt end return IconOrText end WU.getSlider = function() ValeurSliderfunct = fibaro:getValue(WU.selfId , "ui.WebOrMobile.value") return tonumber(ValeurSliderfunct) end WU.setSlider = function(position) fibaro:call(WU.selfId , "setProperty", "ui.WebOrMobile.value", position) return WU.getSlider() end WU.checkMobileOrWeb = function() ValeurSliderSleep = WU.getSlider() -- check slider value at first run if ValeurSliderSleep <= 50 then if ValeurSliderSleep == 1 then MobileDisplay = false else MobileDisplay = false WU.runDirect = 1 sleepAndcheckslider = 20*updateEvery -- exit wait loop Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]); end WU.setSlider(1) -- désactive le run immediat lors du prochain test end if ValeurSliderSleep >= 50 then if ValeurSliderSleep == 98 then else MobileDisplay = true WU.runDirect = 1 sleepAndcheckslider = 20*updateEvery -- exit wait loop Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]); end WU.setSlider(98) -- désactive le run immediat lors du prochain test end return WU.getSlider() end WU.fetchWU = function() decode_error = false WU.checkMobileOrWeb() local WGROUND = Net.FHttp("api.wunderground.com",80); local response ,status, err = WGROUND:GET("/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json"); if (tonumber(status) == 200 and tonumber(err)==0) then Debug( "cyan", WU.translation[WU.language]["Fetched"]) if (response ~= nil) then WU.now = os.date("%H:%M") jsonTable = json.decode(response); if jsonTable.response.error ~= nil then Debug( "red", WU.translation[WU.language]["NO_DATA_FOUND"]) fibaro:sleep(15*1000) return end stationID = jsonTable.current_observation.station_id; humidity = jsonTable.current_observation.relative_humidity temperature = jsonTable.current_observation.temp_c pression = jsonTable.current_observation.pressure_mb wind = jsonTable.current_observation.wind_kph rain = WU.cleanJson(jsonTable.current_observation.precip_today_metric,"0") weathericon = jsonTable.current_observation.icon_url fcstday1 = jsonTable.forecast.txt_forecast.forecastday[1].title -- Day meteo fcst1 = jsonTable.forecast.txt_forecast.forecastday[1].fcttext_metric fcst1icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst1SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst1Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst1Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst1avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst1avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst1mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_day.mm,"0") fcstday2 = jsonTable.forecast.txt_forecast.forecastday[2].title -- Evening Meteo fcst2 = jsonTable.forecast.txt_forecast.forecastday[2].fcttext_metric fcst2icon = jsonTable.forecast.txt_forecast.forecastday[2].icon_url fcst2SmallTxt = jsonTable.forecast.simpleforecast.forecastday[2].conditions fcst2Tmax = jsonTable.forecast.simpleforecast.forecastday[2].high.celsius fcst2Tmin = jsonTable.forecast.simpleforecast.forecastday[2].low.celsius fcst2avewind =jsonTable.forecast.simpleforecast.forecastday[2].avewind.kph fcst2avewinddir =jsonTable.forecast.simpleforecast.forecastday[2].avewind.dir fcst2mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_night.mm,"0") fcstday3 = jsonTable.forecast.txt_forecast.forecastday[3].title -- Tomorrow fcst3 = jsonTable.forecast.txt_forecast.forecastday[3].fcttext_metric fcst3icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst3SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst3Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst3Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst3avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst3avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst3mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[2].qpf_allday.mm,"0") fcstday5 = jsonTable.forecast.txt_forecast.forecastday[5].title -- In 2 days fcst5 = jsonTable.forecast.txt_forecast.forecastday[5].fcttext_metric fcst5icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst5SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst5Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst5Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst5avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst5avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst5mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[3].qpf_allday.mm,"0") if (stationID ~= nil) and decode_error == false then fibaro:call(WU.selfId , "setProperty", "ui.lblStation.value", locationID); if temperature < 5 then cTemperature = WU.HtmlColor(temperature,"blue") elseif temperature > 18 then cTemperature = WU.HtmlColor(temperature,"red") else cTemperature = WU.HtmlColor(temperature,"yellow") end fibaro:call(WU.selfId , "setProperty", "ui.lblTempHum.value", WU.translation[WU.language]["Temperature"]..": "..cTemperature.." °C - "..WU.translation[WU.language]["Humidity"]..": "..humidity); fibaro:call(WU.selfId , "setProperty", "ui.lblWindRain.value", WU.translation[WU.language]["Wind"]..": "..wind.." km/h - "..WU.translation[WU.language]["Rain"]..": "..rain.." mm"); if (WU.now >= "00:00" and WU.now <= "15:59") then -- donne meteo du jour entre 00:00 (ou 3h) et 15:59. permet de garder la météo du soir jusqu'a 3h du matin, sinon change à minuit fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday1,"yellow")..": "..WU.HtmlColor(fcst1.." ("..fcst1mm.." mm)","green")); fibaro:setGlobal("Meteo_Day", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday1..": ".." "..fcst1.." ("..fcst1mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst1icon,fcst1SmallTxt)); elseif (WU.now >= "16:00" and WU.now <= "23:59") then -- donne meteo soirée entre 16:00 et 23:59 fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday2,"yellow")..": "..WU.HtmlColor(fcst2.." ("..fcst2mm.." mm)","green")); fibaro:setGlobal("Meteo_Day", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday2..": ".." "..fcst2.." ("..fcst2mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst2icon,fcst2SmallTxt)); end -- Meteo of Tomorrow fibaro:call(WU.selfId , "setProperty", "ui.lblFcstTomorrow.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday3,"yellow")..": "..WU.HtmlColor(fcst3.." ("..fcst3mm.." mm)","green")); fibaro:setGlobal("Meteo_Tomorrow", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday3..": ".." "..fcst3.." ("..fcst3mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIconTomorrow.value",WU.IconOrText(fcst3icon,fcst3SmallTxt)); -- Meteo in 2 Days fibaro:call(WU.selfId , "setProperty", "ui.lblFcst2Days.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday5,"yellow")..": "..WU.HtmlColor(fcst5.." ("..fcst5mm.." mm)","green")); fibaro:setGlobal("Meteo_In_2_Days", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday5..": ".." "..fcst5.." ("..fcst5mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon2Days.value",WU.IconOrText(fcst5icon,fcst5SmallTxt)); if WU.sendPush then if (os.date("%H:%M") == WU.push_fcst1) then -- fibaro:call(WU.smartphoneID , "sendPush", fcstday1.." - "..fcst1) -- envoie meteo du matin elseif (os.date("%H:%M") == WU.push_fcst2) then fibaro:call(WU.smartphoneID , "sendPush", fcstday2.." - "..fcst2) -- envoie meteo du soir end end if WU.sendPush then fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value", WU.translation[WU.language]["Push_forecast"].." = true"); else fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value",WU.translation[WU.language]["Push_forecast"].." = false"); end WU.scheduler = os.time()+updateEvery*60 fibaro:call(WU.selfId, "setProperty", "ui.lblUpdate.value", WU.translation[WU.language]["Last_updated"]..": "..os.date("%c")); Debug( "cyan", WU.translation[WU.language]["Data_processed"]) Debug( "white", WU.translation[WU.language]["Update_interval"].." "..updateEvery) else Debug( "red", WU.translation[WU.language]["NO_STATIONID_FOUND"]) end else fibaro:debug("status:" .. status .. ", errorCode:" .. errorCode); end end sleepAndcheckslider = 0 while sleepAndcheckslider <= 20*updateEvery do fibaro:sleep(3000) WU.checkMobileOrWeb() sleepAndcheckslider = sleepAndcheckslider+1 if (DoNotRecheckBefore <= os.time()) and ((WU.scheduler == os.time) or (os.date("%H:%M") == WU.push_fcst1) or (os.date("%H:%M") == WU.push_fcst2)) then Debug("orange", WU.translation[WU.language]["Exiting_loop_push"]); DoNotRecheckBefore = os.time()+60 sleepAndcheckslider = 20*updateEvery end end end Debug( "orange", "WU Weather - Original LUA Scripting by Jonny Larsson 2015"); Debug( "orange", "YAMS WU - Fork by Sébastien Jauquet 11/2015"); Debug( "orange", "Version: "..WU.version); if WU.station == "LOCID" then locationID = WU.LOCID elseif WU.station == "PWS" then locationID = WU.PWS end if WU.CreateVG then WU.createGlobalIfNotExists("Meteo_Day", "") WU.createGlobalIfNotExists("Meteo_Tomorrow", "") WU.createGlobalIfNotExists("Meteo_In_2_Days", "") end while true do WU.fetchWU() end
  4. Cet après midi, j'ai eu le support Fibaro qui s'est connecté sur ma box pour voir pourquoi elle plantait une fois par semaine.... "Coup de bol" elle a planté pendant que ils étaient occupé à regarder... Diagnostic: trop de requètes... Ah bon, cà d ? Vous avez trois Virtual device qui font du polling. Ah bon, lesquels ? les 1322 1458 et 1856 font des requêtes toutes les 3 secondes... Heuu... et c'est trop ? Essayez de diminuer pour voir... Bon, on va pas discuter de ça ici mais je me suis donc mis en tête de diminuer les requêtes. Effectivement on n'en a besoin que lorsque l'on regarde le VD, le reste du temps... ça tourne pour rien. J'ai donc cherché un moyen de pouvoir mélanger en même temps l'update rapide quand on regarde et l'update lent quand il dort. Pour l'update rapide, j'ai bricolé un truc avec un slider, qui me permet de demander un update unique ou de décider facilement d'une durée de mise à jour. - si on clique sur le slider entre 0 et 10, ça fait une mise à jour unique - si on clique sur le slider entre 10 et 99, ça lance une série de 89 updates à une fréquence définie dans le script du slider - Si 89 updates ne suffisent pas, il y a un "multiplicateur" qui permet de multiplier les 89 updates par ce que l'on veut. 10 donne 890 updates... - Si on change le nombre d'updates automatiques, ou que l'on passe en manuel, l'instance s'arrête et une autre commence avec les nouvelles valeurs. Votre code à rafraîchir lors de chaque loop est à mettre dans la fonction refresh_datas à la ligne 20 Pour l'update lent, via mainloop, j'utilise un bout de code de @steven (encore lui) ;-) qui me semble être particulièrement bien foutu et qui ne charge pas la box. le main loop simule un clic sur le slider en position 1. mais cela ne perturbe pas le décompte automatique s'il y en avait un en cours. Voici à quoi ça ressemble: Je vous ai même concocté tout ça dans un vfib rien que pour ne pas vous fatiguer V1.1: Fast_Updates V1.1.vfib Et voici les scripts: Script du slider: local selfId = fibaro:getSelfId() local ValeurSlider = _sliderValue_ --fibaro:getValue(selfId, "ui.Slider1.value") local sleepAndcheckslider, ValeurSliderBeforeSleep, ValeurSliderSleep, multiplier_loop, lastCheck, position local multiplier = 4 -- number of slider value (10 to 99) so 89 values max. To have 356 loops, set multiplier to 4 local sleepBetweenUpdates = 200 -- 1000 = +- 1 second waiting time between each refresh_datas -- Put your refresh code in the function refresh_datas (line 84) sleepBetweenUpdates = sleepBetweenUpdates/50 function getSlider() ValeurSliderfunct = fibaro:getValue(selfId, "ui.updateauto.value") return tonumber(ValeurSliderfunct) end function setSlider(position) fibaro:call(selfId, "setProperty", "ui.updateauto.value", position) -- fibaro:call(selfId, "setSlider", 25, position) -- set and execute return getSlider() end function refresh_datas() ------------------------------------ YOUR CODE HERE ----------------------------------------- fibaro:call(selfId, "setProperty", "ui.example.value", os.date("%d/%m/%y %H:%M:%S")) ----------------------------------- END OF YOUR CODE ---------------------------------------- end if ValeurSlider == 1 then -- Main loop refresh refresh_datas() fibaro:debug("Main loop refresh at "..os.date("%d/%m/%y %H:%M:%S")) lastCheck = "Last Update: " ..os.date("%d/%m/%y %H:%M:%S") fibaro:call(selfId, "setProperty", "ui.updateStatus.value", lastCheck) end if (ValeurSlider < 10 and ValeurSlider > 1) or (ValeurSlider == 0) then -- Manual refresh ValeurSlider = setSlider(0) fibaro:call(selfId, "setProperty", "ui.updateStatus.value", "Updating Once") fibaro:debug("Manual refresh at "..os.date("%d/%m/%y %H:%M:%S")) refresh_datas() lastCheck = "Last Update: " ..os.date("%d/%m/%y %H:%M:%S") fibaro:sleep(1000) fibaro:call(selfId, "setProperty", "ui.updateStatus.value", lastCheck) fibaro:sleep(1000) end ValeurSlider = getSlider() while ValeurSlider > 10 do -- Automatic refresh setSlider(ValeurSlider) multiplier_loop = 0 while multiplier_loop < multiplier do refresh_datas() multiplier_loop = multiplier_loop + 1 fibaro:call(selfId, "setProperty", "ui.updateStatus.value", "Updates left: "..((ValeurSlider*multiplier)-(10*multiplier))) sleepAndcheckslider = 0 ValeurSliderBeforeSleep = ValeurSlider --fibaro:debug("Silder Value before sleep: " .. ValeurSliderBeforeSleep) while sleepAndcheckslider <= 50 do fibaro:sleep(sleepBetweenUpdates) ValeurSliderSleep = getSlider() if ValeurSliderSleep == 1 then -- if it's the VD main loop pushing the slider, ignore and set value before ValeurSlider = ValeurSliderBeforeSleep setSlider(ValeurSlider) end if ValeurSliderSleep ~= ValeurSliderBeforeSleep then multiplier_loop = multiplier ValeurSlider = 1 end -- chack if slider value not changer between wait (to avoid multiple instances) sleepAndcheckslider = sleepAndcheckslider+1 end end ValeurSlider = ValeurSlider - 1 if ValeurSlider == 10 -- 3600 = 2h then fibaro:debug("End of automatic refresh at "..os.date("%d/%m/%y %H:%M:%S")) ValeurSlider = setSlider(0) lastCheck = 'Last Update: ' ..os.date("%d/%m/%y %H:%M:%S") fibaro:call(selfId, "setProperty", "ui.updateStatus.value", lastCheck) end end Script main loop: -- FAST UPDATES by sjauquet -- V1.1 13/11/2015 --local Verification = fibaro:get(selfId,"TCPPort") -- 1ère fois que le main loop s'exécute, on crée une variable nommée "instance" car elle n'existe pas. Elle existera au 2ème passage donc ne sera pas recrée. if (not instance) then -- on indique la fréquence d'execution souhaitée (en minutes) instance = { lastrun = 0, every = 1 } fibaro:debug("first run") end -- on vérifie la différence entre cette exéction et la dernière (stocké dans instance.lastrun) diff = os.date("*t", os.difftime(os.time(), instance.lastrun)) -- si la différence en minutes et supérieure ou égale à la fréquence souhaitée (instance.every) if (diff.min >= instance.every) then -- TON CODE --- local selfId = fibaro:getSelfId(); local position = 1; fibaro:call(selfId, "setSlider", 2, position); -- set and execute -- FIN DE TON CODE --- -- on stock l'heure de la nouvelle exécution instance.lastrun = os.time() fibaro:debug("executed") end
  5. Bonjour, Petit partage d'un VD qui permet de récupérer les valeurs des 8 entrées et des 8 sorties d'une ipx800 afin de les exploiter ou dans des VDs, ou dans GEA :- Il faut donc 8 variables globales pour les entrées : IPX_IN1 IPX_IN2 etc jusqu'à IPX_IN8 Il faut 8 variables globales pour les sorties : RELAIS1 RELAIS 2 etc jusqu'à RELAIS8 Deux boutons de MAJ et 16 labels. Certains libellés dans ce VD sont adapté à mon utilisation, modifiez les! (Pensez également à changer l'adresse ip, chez moi 192.168.1.60) Suite aux remarques (très intéressante) de ce fil, voilà la nouvelle version : VERSION 3 (MAJ du 28/11/15) - Permet d'utiliser le PUSH de l'ipx (et donc ne faire qu'une requête lors d'un changement d'état d'une entrée) - A configurer dans l'ipx (appuie sur le BP Maj de ce VD) - Code plus simple - Permet la mise à jour des VDs qui changent les icônes. - Permet de gérer les sorties avec le retour d'info A reconfigurer pour votre usage : Pour les entrées : Variable local VD_nom (juste pour se rappeler sur quoi c'est branché ) Variable local VD_ID_IPX (L'id des VD à mettre à jour) - Mettre nil si aucune action voulu Variable local VD_BP_IPX (Le BP a appuyer pour la MAJ du Vd en question) - Mettre nil si aucune action voulu Variable local VariablesIPX (qui correspond au variables globales a modifier en fonction des entrées) Pour les sorties : local VD_NOM_SORTIES (Toujours pour se rappeler sur quoi c'est branché ) local VD_ID_IPX_SORTIES (L'id des VD à mettre à jour) - Mettre nil si aucune action voulu local VD_BP_IPX_SORTIES (Le BP a appuyer pour la MAJ du Vd en question) - Mettre nil si aucune action voulu local VD_LABEL_SORTIES (les valeurs des labels à modifier) Supprimer les lignes de debug après mise en place Coté IPX : On configure le push sur les entrées afin d'appuyer sur le BP MAJ Entrée et on configure le push sur les sorties afin d'appuyer sur le BP MAJ Sorties. Exemple pour les entrées : /api/callAction?deviceID=104&name=pressButton&arg1=9 104 étant l'id du VD MAJ et 9 étant le bouton à appuyer pour la maj des entrées Exemple pour les sorties : /api/callAction?deviceID=104&name=pressButton&arg1=18 104 étant l'id du VD MAJ et 18 étant le bouton à appuyer pour la maj des sorties Bouton de MAJ Entrées : HC2 = Net.FHttp("192.168.1.60") response = HC2:GET("/api/xdevices.json?cmd=10") response = json.decode(response) local i = 1 local TotalEntrees = 8 + 1 local Rvar = {response.IN1,response.IN2,response.IN3,response.IN4,response.IN5,response.IN6,response.IN7,response.IN8} local VariablesIPX = {"IPX_IN1","IPX_IN2","IPX_IN3","IPX_IN4","IPX_IN5","IPX_IN6","IPX_IN7","IPX_IN8"} local VD_NOM = {"IR","Libre","Etat AL","En Al","Courrier","Scene3","Scene2","Scene1"} -- Juste pour Aide local VD_ID_IPX = {nil,nil,88,88,92,nil,nil,nil} -- ID des VD à mettre à jour local VD_BP_IPX = {nil,nil,3,3,2,nil,nil,nil} -- Numéro des boutons de MAJ des VD DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time()) fibaro:log(DateHeure.."") fibaro:debug(DateHeure) while i < TotalEntrees do fibaro:debug(i) fibaro:setGlobal(VariablesIPX[i], Rvar[i]) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..i..".value", Rvar[i]); fibaro:debug("Reponse entrée IPX : " ..i.." = " ..Rvar[i]) fibaro:debug("Nom du module = " ..VD_NOM[i]) if VD_ID_IPX[i] == nil then fibaro:debug("VD non configuré, rien à faire.") else fibaro:debug("Il faut appuyer sur le bouton : " ..VD_BP_IPX[i].. " de la VD id : " ..VD_ID_IPX[i]) fibaro:call(VD_ID_IPX[i], "pressButton", VD_BP_IPX[i]) end i = i + 1 end Bouton de Maj Sorties : HC2 = Net.FHttp("192.168.1.60") response = HC2:GET("/api/xdevices.json?cmd=20") response = json.decode(response) local i = 1 local TotalSorties = 8 + 1 local RvarSorties = {response.OUT1,response.OUT2,response.OUT3,response.OUT4,response.OUT5,response.OUT6,response.OUT7,response.OUT8} local VariablesIPXSorties = {"RELAIS1","RELAIS2","RELAIS3","RELAIS4","RELAIS5","RELAIS6","RELAIS7","RELAIS8"} local VD_NOM_SORTIES = {"VanneEAU","SecheServiette","ECL-EXT","Arrosage","PAC-Piscine","Filtration-Piscine","ECL-Piscine","Ventilation"} -- Juste pour Aide local VD_ID_IPX_SORTIES = {nil,85,84,nil,95,94,93,74} -- ID des VD à mettre à jour local VD_BP_IPX_SORTIES = {nil,4,4,nil,4,4,4,4} -- Numéro des boutons de MAJ des VD local VD_LABEL_SORTIES = {9,10,11,12,13,14,15,16} -- Label pour affichage des sorties DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time()) fibaro:log(DateHeure.."") fibaro:debug(DateHeure) while i < TotalSorties do fibaro:debug(i) fibaro:setGlobal(VariablesIPXSorties[i], RvarSorties[i]) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..VD_LABEL_SORTIES[i]..".value", RvarSorties[i]); fibaro:debug("Reponse Sortie IPX : " ..i.." = " ..RvarSorties[i]) fibaro:debug("Nom du module = " ..VD_NOM_SORTIES[i]) if VD_ID_IPX_SORTIES[i] == nil then fibaro:debug("VD non configuré, rien à faire.") else fibaro:debug("Il faut appuyer sur le bouton : " ..VD_BP_IPX_SORTIES[i].. " de la VD id : " ..VD_ID_IPX_SORTIES[i]) fibaro:call(VD_ID_IPX_SORTIES[i], "pressButton", VD_BP_IPX_SORTIES[i]) end i = i + 1 end Exemples de VD Entrée : 1 label, 1 bouton de MAJ local icone = { ["DETECTION"] = 100, --numéro icone à renseigner ["PASDETECTION"] = 99, } if fibaro:getGlobalValue("IPX_IN1") == '1' then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Non") fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["PASDETECTION"]) else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Oui") fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["DETECTION"]) fibaro:log("Mouvement!!") end Exemple de Vd pour contrôle sortie 7 (et retour d'info) : 1 label, deux bouton ON/OFF, un bouton Maj Bouton on : Simplement mettre "Set071" en chaine et cochant "en attente de réponse du périphérique" Bouton off : "Set070" en chaine et cochant "en attente de réponse du périphérique" Bouton Maj : local icone = { ["ECLPON"] = 90, --numéro icone à renseigner ["ECLPOFF"] = 89, } if fibaro:getGlobalValue("RELAIS7") == '1' then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "On") fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["ECLPON"]) fibaro:log("Eclairage ON") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Off") fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["ECLPOFF"]) fibaro:log("Eclairage OFF") end ANCIENNE VERSION 1 (Plus lourde, bcp de requêtes et ne met pas les VD d'état additionnel à jour) Coté bouton de MAJ : HC2 = Net.FHttp("192.168.1.60") response = HC2:GET("/api/xdevices.json?cmd=10") response = json.decode(response) fibaro:setGlobal("IPX_IN1", response.IN1) fibaro:setGlobal("IPX_IN2", response.IN2) fibaro:setGlobal("IPX_IN3", response.IN3) fibaro:setGlobal("IPX_IN4", response.IN4) fibaro:setGlobal("IPX_IN5", response.IN5) fibaro:setGlobal("IPX_IN6", response.IN6) fibaro:setGlobal("IPX_IN7", response.IN7) fibaro:setGlobal("IPX_IN8", response.IN8) DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time()) fibaro:log(DateHeure.."") fibaro:debug(DateHeure) local relais1 = fibaro:getGlobalValue("IPX_IN1") local relais2 = fibaro:getGlobalValue("IPX_IN2") local relais3 = fibaro:getGlobalValue("IPX_IN3") local relais4 = fibaro:getGlobalValue("IPX_IN4") local relais5 = fibaro:getGlobalValue("IPX_IN5") local relais6 = fibaro:getGlobalValue("IPX_IN6") local relais7 = fibaro:getGlobalValue("IPX_IN7") local relais8 = fibaro:getGlobalValue("IPX_IN8") if (relais1 == '0') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Oui") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Non") end if (relais2 == '0') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label2.value", "Actif") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label2.value", "Off") end if (relais3 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label3.value", "Armé") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label3.value", "Désarmé") end if (relais4 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label4.value", "En Alarme!") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label4.value", "RAS") end if (relais5 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label5.value", "Oui") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label5.value", "Non") end if (relais6 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label6.value", "On") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label6.value", "Off") end if (relais7 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label7.value", "On") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label7.value", "Off") end if (relais8 == '1') then fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label8.value", "On") else fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label8.value", "Off") end Boucle principal : local myDeviceID = fibaro:getSelfId() if type(n) == "nil" then n1 = tonumber(os.time()) fibaro:call(myDeviceID, "pressButton", "1") n = 1 end if tonumber(os.time()) > n1 + (4) then fibaro:call(myDeviceID, "pressButton", "1") n1 = tonumber(os.time()) end Eclairage_Piscine.vfib IPX800_E-S.vfib
  6. Hello Faisant suite au VD de Krikroff avec Waze, je me suis dit que cela sera sympa d'avoir un VD 'info trafic transport' J'ai donc regarder les api de dispo J'ai trouvé un API d'un mec bien sympa qui récupère les infos RATP (Metro et RER partie RATP) Avec mes très faibles connaissances, j'ai donc bricolé un petit VD pour récupérer l’état du trafic et aussi l'horaire d'un prochain train ... (merci à Lazer également) à‡a doit être très perfectible, donc si vous avez des idées d’optimisation, en ce jours de HC2 surchargé c'est toujours bien de partager :-) C'est pas un VD "universel", dans le sens ou vous allez avoir besoin de modifier 2/3 choses dans le code pour l'adapter à vos stations/lignes habituelles. si vraiment il y a un besoin, on pourrait faire quelque chose de plus propre. Avec l’état du trafic je push des nofifs avec GEA, on pourrait aussi le mettre ce push dans le main loop avec un sleep. Dans mon cas perso, je remonte l’état du RER A et du metro1 et je push toutes les 15Mn l’état trafic du RER si trafic perturbé Je remonte aussi l'horaire temps réel du prochain RER, qui part de la Défense à destination de la maison :-) Avant d'importer le VD, vous allez devoir créer un variable : EtatTrafic , sans valeur particulière. Dans le code il faut modifier : 1/les IDs de vos icônes (merci à Did) local TraficOk = 1121 local TraficNok = 1122 2/pour la partie RER, si vous voulez le A mettre un 1 si vous voulez le B un 2 local LineRer = jsonTable.response.rers[1].line local EtatRer = jsonTable.response.rers[1].title local EtatLongRer = jsonTable.response.rers[1].message 3/pour le metro, idem suivant votre ligne 1,2 etc... local LineMetro = jsonTable.response.metros[1].line local EtatMetro = jsonTable.response.metros[1].title si vous voulez faire un push plutôt sur le métro que sur le RER, suffit de remplacer la ligne local EtatLongRer = jsonTable.response.rers[1].message par local EtatLongRer = jsonTable.response.metros[1].message avec bien sur le paramètre [1] qui vous correspond et aussi d'ajuster les labels ... (je pourrais aider si besoin c'est pas compliqué) 3/Pour la partie horaire un poil plus compliqué (faudrait créer des variables locales pour faire plus simple ...) mais grosso modo allez ici http://api-ratp.pierre-grimaud.fr/v2/rers/a ou ici http://api-ratp.pierre-grimaud.fr/v2/metros/1 en modifiant bien sur le N° de la ligne qui vous intéresse. et récupérer le 'slug' de votre ligne et la destination et modifier l'appel API en conséquence local response ,status, err = TRAFIC:GET("/v2/rers/a/stations/grande+arche+la+defense?destination=st+germain+en+laye+poissy+cergy") ensuite la boucle for i=1, Max do if jsonTable.response.schedules[i].destination == "Poissy" then ProchainRer = jsonTable.response.schedules[i].message break elseif jsonTable.response.schedules[i].destination == "Cergy-Le Haut" then ProchainRer = jsonTable.response.schedules[i].message break else ProchainRer = 0 end end est pour mon cas particulier car j'ai 2 possibilités de desitnations pour rentrer. A adapter suivant vos cas. Ensuite je rafraichi le VD et push l'état du trafic avec GEA -- Push Trafic GEA.add(true, 2*60, "", {{"VirtualDevice", id["ETAT_TRAFIC"], 1},{"Repeat"}}) -- Refresh toutes les 2mn l'etat du trafi GEA.add ({"Global!", "EtatTrafic", "OK"}, 15*60, "#value#",{{"Repeat"}}) -- Push Etat toutes les 15mn si NOK Voilà en gros, je suis désolé c'est pas plug en play, mais c'est pas très compliqué à modifier, car moi même j'ai réussi lol Si il y a un intérêt plus important, je pourrai regarder pour faire quelque chose de plus facile à intégrer chez vous. J'essai de regarder maintenant la partie TRANSCILIEN, ça fonctionne de la même façon avec l'API Transicilien, sauf que je récupérer un XML et pas un JSON, donc je sais pas trop comment le lire ... idem si intérêt, on peut regarder ensemble. Etat_Trafic.vfib
  7. Krikroff

    Hc2 Waze Calculator

    Après longue absence voici un petit script permettant d’utiliser sur notre HC2 le service de trafic et de navigation communautaire WAZE (https://www.waze.com/fr/) Le principe du script est très simple : 1 scène pour interroger l’ API Waze pour tous les trajets parametrés et autant de vd qui seront mis à jour par la dite scène.] 1 - Installation Importer le vd HC2_Waze_Calculator.vfib sur le HC2, 1x pour un trajet, 2x pour deux etc... Créer la scène HC2 Waze Calculator cf. fichier HC2 Waze Calculator Scene.txt puis passer au paramètrage 2 - Paramétrage Configurer l'object params: nom, id du vd cible, polling, latitude, longiture etc... pour tous les trajets. Pour trouver les coordonnées GPS, latitude et longitude il existe les services : www.coordonnees-gps.fr, www.torop.net/coordonnees-gps.php, www.gpsfrance.net etc. local params = { { name = "Trajet 1", virtualDeviceId = 1449, from = { name = "Palais de l'Élysée", x = 2.3167538999999806, -- longitude y = 48.8704156 -- latitude }, to = { name = "Théâtre Guignol", x = 2.311747670173645, -- longitude y = 48.86977710077997 -- latitude }, pollingMs = 60*1000 }, { name = "Trajet 2", virtualDeviceId = 1452, from = { name = "Palais de l'Élysée", x = 2.3167538999999806, -- longitude y = 48.8704156 -- latitude }, to = { name = "Théâtre Guignol", x = 2.311747670173645, -- longitude y = 48.86977710077997 -- latitude }, pollingMs = 5*60*1000 } } 4 - Icône Merci à Moicphil de m’avoir suggéré la chose et aussi pour son icône tip-top Fichier du vd: HC2_Waze_Calculator.vfib Fichier de la scène: HC2 Waze Calculator Scene.txt
  8. sebcbien

    Yams - Yet Another Meteo Station

    Bonjour, Je crée ce petit fil pour publier mes modifications du plugin météo de Steven. Voici à quoi ça ressemble: Voici la version de Steven: (chez moi le mm de pluie ne fonctionnent pas) http://www.domotique-fibaro.fr/index.php/topic/1211-support-gea/page-220#entry92618 Et voici ma version modifiée qui pousse les résultats dans 3 Variables Globales (à créer) afin de pouvoir être utilisées ailleurs comme par exemple dans GEA. voici le fichier du VD: Prévision_Météo.vfib et le screenshot: Pour la configuration, il suffit donc de créer les 3 VG non prédéfinies: Meteo_Lendemain Meteo_Actuelle Meteo_Actuelle_Jou et de mettre le nom de la ville ici: local ville = "bruxelles" Voici le code principal pour info: local ville = "bruxelles" local Meteo_Actuelle_Local = " " local Meteo_Lendemain_Local = " " local Meteo_Actuelle_Journee_Local = " " local dateTag = os.date("%H:%M", os.time()) -- ================================== -- local URL = Net.FHttp("www.prevision-meteo.ch") response, status, errorCode = URL:GET("/services/json/" .. ville) local jsonTable = json.decode(response) local lieu = jsonTable.city_info.name .. " ["..jsonTable.city_info.elevation.. "m]" local current = jsonTable.current_condition.condition -- conditions actuelle local current_journee = jsonTable.fcst_day_0.condition -- conditions générale de la journée local temp = jsonTable.current_condition.tmp .. "°C ["..jsonTable.fcst_day_0.tmin .. "°/" .. jsonTable.fcst_day_0.tmax.."°]" local Meteo_Day = jsonTable.fcst_day_0.day_long local Meteo_Time = "["..jsonTable.current_condition.hour.."]" local pluie = 0 local snow = false for k, v in pairs(jsonTable.fcst_day_0.hourly_data) do if (tonumber(v.APCPsfc) > 0) then pluie = pluie + tonumber(v.APCPsfc) fibaro:debug("Pluie à "..k.." - Total du jour: "..pluie.."mm") end if v.ISSNOW == 1 then snow = true fibaro:debug("K: "..k.." = !! NEIGE !!") end end pluie = pluie .. " " if (snow) then pluie = pluie .. "!! NEIGE !!" end local id = fibaro:getSelfId() fibaro:call(id, "setProperty", "ui.Label1.value", lieu) fibaro:call(id, "setProperty", "ui.Label2.value", current_journee) fibaro:call(id, "setProperty", "ui.Label3.value", current) fibaro:call(id, "setProperty", "ui.Label4.value", temp) fibaro:call(id, "setProperty", "ui.Label5.value", pluie.." mm") Meteo_Actuelle_Local = Meteo_Time.." Météo Actuelle: "..current.." T°: "..temp.." Pluie: "..pluie.." mm" fibaro:setGlobal("Meteo_Actuelle", Meteo_Actuelle_Local) fibaro:debug(dateTag .." "..Meteo_Actuelle_Local) Meteo_Actuelle_Journee_Local = Meteo_Time.." Météo de ce "..Meteo_Day..": "..current_journee.." T°: "..temp.." Pluie: "..pluie.." mm" fibaro:setGlobal("Meteo_Actuelle_Jou", Meteo_Actuelle_Journee_Local) fibaro:debug(dateTag .." "..Meteo_Actuelle_Journee_Local) current = jsonTable.fcst_day_1.condition temp = "["..jsonTable.fcst_day_1.tmin .. "°/" .. jsonTable.fcst_day_1.tmax.."°]" Meteo_Day = jsonTable.fcst_day_1.day_long pluie = 0 snow = false for k, v in pairs(jsonTable.fcst_day_1.hourly_data) do if (tonumber(v.APCPsfc) > 0) then pluie = pluie + tonumber(v.APCPsfc) fibaro:debug("Pluie à "..k.." - Total du jour: "..pluie.."mm") end if v.ISSNOW == 1 then snow = true fibaro:debug("K: "..k.." = !! NEIGE !!") end end pluie = pluie .. " " if (snow) then pluie = pluie .. "!! NEIGE !!" end fibaro:call(id, "setProperty", "ui.Label6.value", current) fibaro:call(id, "setProperty", "ui.Label7.value", temp) fibaro:call(id, "setProperty", "ui.Label8.value", pluie.." mm") Meteo_Lendemain_Local = Meteo_Time.." Météo de demain "..Meteo_Day..": "..current.." T°: "..temp.." Pluie: "..pluie.." mm" fibaro:setGlobal("Meteo_Lendemain", Meteo_Lendemain_Local) fibaro:debug(dateTag .." ".. Meteo_Lendemain_Local) Et pour finir, voici le code GEA pour exploiter tout ceci: Je l'ai écrit de cette manière qu'il n'y a pas de push si on n'est pas à la maison et uniquement une seule fois par jour chaque météo (du jour et du lendemain) - la météo du jour est poussée sur le smartphone au matin au moment ou on désactive le mode nuit pour savoir le temps lorsque l'on s'habille) - la météo du lendemain est poussée le soir au retour sur le smartphone afin de savoir le temps du lendemain pour préparer les vêtements des enfants avant de les mettre au lit. afin de me passer de VG, j'ai ajouté un petit délai, donc mettre ça en fin de liste GEA local estAt_Home = {"Global", "PresentState", "At_Home"} local estAway = {"Global", "PresentState", "Away"} local est_AtHome_Or_Kids_Sleeping = {"Global", "PresentState", "Kids_Sleeping|At_Home"} ---------------------METEO---------------------- -- Météo soir 10 min après retour maison (away pendant plus de 30 minutes) isLongAwayOff = false GEA.add(estAway, 30*60, "", {{"function",function() isLongAwayOff = true end}}) GEA.add({estAt_Home,{"Global!", "Meteo_Lendemain", ""},{"function",function() return isLongAwayOff end}}, 10*60, "#value[2]#",{{"Time", "17:00", "20:30"},{"Portable", id["PHONE_SEB"]},{"Portable", id["PHONE_GG"]},{"function",function() isLongAwayOff=false end}}) ------------------------------ -- Météo matin Instantanée au changement de presentState GEA.add({est_AtHome_Or_Kids_Sleeping}, -1, "",{{"function",function() fibaro:debug(" ------- waiting 1 s for PrevisousState dependent actions ------") end},{"function",function() fibaro:sleep(1100) end}}) GEA.add({est_AtHome_Or_Kids_Sleeping,{"Global!", "Meteo_Actuelle_Jou", ""},{"Global", "PreviousState", "Night_All_Off"}}, -1, "#value[2]#",{{"Portable", id["PHONE_SEB"]},{"Portable", id["PHONE_GG"]}}) -- !!!!!!!!!!! LES ACTIONs instantanées placées CI DESSOUS AURONT UN DELAI DE 1,1 A CHAQUE CHANGMENT de PresentState = à At_Home ou Kids_Sleepin !!!!!!!!!! ------------- La variable globale previousState est définie par la scène ci-dessous, qui permet au script de savoir dans quel état se trouvait la maison juste avant le changement de la VG PresentState Pour cela il faut crée une VG PreviousState (de préférence prédéfinie) Connaitre l'état précédent de la maison peut être utile a de nombreuses occasions dont ici la météo. Mais je l'utilise aussi pour différencier si la maison est au réveil ou au passage en mode nuit etc. Ce n'est pas nécessaire donc mais utile pour une meilleure domotisation avec moins de notifications inutiles, actions à réaliser manuellement. --[[ %% properties %% globals PresentState --]] local This_Instance_State = fibaro:getGlobalValue("PresentState"); fibaro:debug(os.date("%a %d/%m", os.time()).." new start with PresentState = " .. This_Instance_State); while This_Instance_State == fibaro:getGlobalValue("PresentState") do fibaro:sleep(1000); --fibaro:debug("waiting with this instance = "..This_Instance_State) end fibaro:setGlobal("PreviousState", This_Instance_State); fibaro:debug(os.date("%a %d/%m", os.time()).." Exit With PreviousState set at: ".. This_Instance_State);
  9. Voici un script pour l'extension Greasemonkey de Firefox afin de faciliter le login sur l'interface Web de notre box préférée : Remplissage automatique du compte admin Focus sur le champs Mot de passe Il ne reste plus qu'à taper le mot de passe, et appuyer sur la touche Entrée. Dans le panneau des extensions de Firefox, rechercher et installer Greasemonkey : Sur la gauche, cliquer sur le nouvelle section Scripts utilisateur, puis sur Nouveau Script... : Rentrer les informations suivantes : Nom : Fibaro HC2 Espace de nom : http://www.domotique-fibaro.fr Description : Remplie automatiquement le champ login avec le compte admin et met le focus sur le champs password Inclus : http://*/fibaro/*/home/login.html* Dans la fenêtre de l'éditeur qui s'ouvre, copier/coller le code suivant : // ==UserScript== // @name Fibaro HC2 // @namespace http://www.domotique-fibaro.fr // @description Remplie automatiquement le champ login avec le compte admin et met le focus sur le champs password // @include http://*/fibaro/*/home/login.html* // @version 1.0 // @grant none // ==/UserScript== var inputlogin = document.querySelectorAll("input#login"); inputlogin[0].value = "admin"; var inputpassword = document.getElementById("pwd"); inputpassword.focus(); Enregistrer et fermer la fenêtre, le script apparait : Aller sur la fenêtre de connexion de la box, qui devrait ressembler à ceci : Il ne reste plus qu'à taper le mot de passe, et appuyer sur la touche Entrée. Théoriquement, ce script doit également fonctionner pour l'extension Tampermonkey de Chrome (testé par @crazymonster999). Pour ceux qui voudraient aller plus loin et automatiser complètement le login (et qui n'ont pas peut de laisser leur mot de passe en clair dans le script) voir le message de @crazymonster999 plus bas dans cette page.
  10. Lazer

    Network Monitor

    Network Monitor Version 1.20 Voici un module virtuel permettant de surveiller plusieurs équipements sur le réseau local (et aussi sur Internet), et d'envoyer des notifications en cas de problème détecté. Icônes : Je propose ces 2 icônes, mais d'autres icônes sont disponibles dans les pages du topic : Configuration : Après import du module virtuel, modifier la section "User Variables" du 1er bouton du module virtuel : -- User variables local userID = {5} -- Mail local smartphoneID = {73, 127} -- Push local sms = { ["VD_ID"] = 98, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local icons = { ["OK"] = 1028, -- Normal Icon ID ["Error"] = 1045 -- Error Icon ID } local DEVICES = { -- ["Service Name"] = { IP Address , Port, Protocol, Data to send, Expected return code, Expected data, Retry, {Notification methods}, VG, VG }, ["Eco-Devices"] = {"192.168.1.1", 80, "http", "/index1.htm", 200, "Eco Devices" , 1, {"push", "email", "sms"}, nil, nil}, ["HP ProLiant Remote Access Card"] = {"192.168.1.2", 80, "http", "/login.html", 200, "Remote Access Card" , 1, { "email" }, nil, {"Vacances", "1"}}, ["HP ProLiant Gen8 ILO"] = {"192.168.1.3", 443, "tcp", "", nil, "" , 1, { "email" }, nil, nil}, ["ESXi"] = {"192.168.1.4", 80, "http", "/", 301, "" , 1, {"push", "email", "sms"}, nil, nil}, ["Synology DiskStation"] = {"192.168.1.5", 5000, "http", "/webman/index.cgi", 200, "DiskStation" , 1, {"push", "email", "sms"}, nil, nil}, ["Raspberry PI"] = {"192.168.1.6", 80, "http", "/", 200, "Welcome to nginx" , 1, {"push", "email", "sms"}, nil, nil}, ["Sonos"] = {"192.168.1.7", 1400, "http", "/status", 200, "Options" , 1, {"push", "email" }, nil, {"Vacances", "1"}}, ["SMS Gateway"] = {"192.168.1.8", 9090, "http", "/", 200, "Welcome to SMS Gateway" , 5, {"push", "email" }, nil, nil}, ["VRT-IP"] = {"192.168.1.9", 80, "http", "/", 200, "Volets Roulant de Toit" , 1, {"push", "email" }, nil, nil}, ["IPX800"] = {"192.168.1.10", 80, "http", "/user/index2.htm", 200, "IPX800" , 1, {"push", "email" }, nil, nil}, ["Foscam"] = {"192.168.1.11", 88, "http", "/", 200, "IPCam Client" , 1, {"push", "email", "sms"}, nil, {"Vacances", "0"}}, ["Hikvision"] = {"192.168.1.12", 80, "http", "/doc/page/login.asp", 200, "login" , 1, {"push", "email", "sms"}, nil, nil}, ["HAproxy"] = {"192.168.1.13", 80, "http", "/", 503, "" , 1, {"push", "email", "sms"}, nil, nil}, ["FHEM"] = {"192.168.1.14", 8083, "http", "/fhem", 200, "EnOcean" , 1, {"push", "email", "sms"}, nil, nil}, ["Freebox"] = {"192.168.1.15", 80, "http", "/login.php", 200, "Freebox OS" , 1, { "sms"}, nil, nil}, ["OpenVPN"] = {"192.168.1.16", 443, "tcp", "", nil, "" , 1, { "email", "sms"}, nil, nil}, ["Redhat"] = {"192.168.1.17", 22, "tcp", nil, nil, "OpenSSH" , 1, { "email" }, nil, nil}, ["Google"] = {"www.google.fr", 80, "http", "/", 200, "Recherche Google" , 1, { "sms"}, nil, nil}} } local debug = false userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notification par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires. icons : si vous avez 2 icônes personnalisées, remplacer les valeurs nil par les ID numériques de vos icones (à trouver dans /api/icons) DEVICES : c'est la partie la plus longue à paramétrer, pour cela je vous ai laissé un exemple de tout ce que je monitore chez moi (j'ai juste changé les IP). C'est assez parlant, vous pouvez copier/coller en respectant bien la syntaxe. A noter que si l'avant-dernière colonne qui contient le nom facultatif d'une variable globale à incrémenter, celle-ci est automatiquement créée par le module. La dernière colonne permet d'annuler le monitoring d'un équipement particulier en fonction de la valeur d'une variable globale. debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage du bouton du module virtuel. Dans la Main Loop, le code est de Steven. Il y a une variable nbHeure permettant de paramétrer l'intervalle de vérification, par défaut à 1 heure. Si vous voulez un rafraichissement inférieur à 40 minutes, il suffit de tout remplacer par un simple fibaro:sleep(), car cette fonction ne plante pas pour les durées inférieures. Network_Monitor_v1.01.vfib Network_Monitor_v1.10.vfib Network_Monitor_v1.20.vfib
  11. Zorgonaute84

    Particle Photon Et Hc2

    Pour ceux qui ne connaissent pas le Particle Photon, il s'agit d'une petite carte électronique programmable avec une puce Wifi embarquée. La programmation de la puce se fait avec un IDE en ligne disponible sur le site de Particle et le language est très sensiblement le même que pour les cartes Arduino. L'avantage de cette puce, c'est d'une sa taille (De mémoire ils parlent de 6x plus petites qu'un Arduino), le wifi intégré, et le prix : 19USD hors frais de port et enfin (et surtout), le Particle Cloud ! Le Particle Cloud permet a votre puce d'être connecté, consultable et pilotable en tout instant via vos propres requêtes REST. En gros, avec cette puce vous êtes capable de fabriquer n'importe quoi pour votre système domotique et de l'intégrer totalement avec votre HC2. Le tuto qui va suivre portera de manière générique sur la communication bi directionnel entre le Photon et votre HC2. Je publierai plus tard et dans un autre sujet, le code source d'un module permettant d'activer et désactiver l'alarme d'une HC2 avec confirmation d'activation et retour d’échec (avec informations des portes restées ouvertes qui ont causées l’échec). Ce Alarme Button comme je l'ai appelé est basé sur le hardware de l'Internet Button vendu sur le site de Particle (il s'agit d'une puce Photon pluggé sur une carte avec 4 boutons, un accéléromètre et 11 LED RGB disposées en cercle. (Voir Internet Button). Communication du HC2 --> Particle Photon : a/ Exécuter quelque chose sur le Particle Photon : Tout d'abord, il faut déclarer dans le code de votre Photon votre fonction publique (a l'intérieur de votre boucle void setup ) : void setup() { Spark.function("NomDeLaFonctionCLOUD", NomDeLaFonctionLOCAL); } NomDeLaFonctionCLOUD sera le nom appelé depuis la HC2 (ATTENTION contrairement a mon exemple le nom ici ne doit pas dépasser les 12 caractères) NomDeLaFonctionLOCAL sera le nom de votre fonction exécutée dans le code de votre Photon : int NomDeLaFonctionLOCAL() { // Les trucs a exécuter } Et voila, c'est fini du côté de votre Photon. Maintenant, sur votre HC2. A noter que la connexion avec le Photon se fait en https et non http. Ce qui veut dire que la fonction netFhttp n'est pas possible ! Il faut donc utiliser la commande Net.HttpClient qui fonctionne uniquement dans une scène ! Donc exit le code dans un virtual device. A vous de voir comment vous voulez vous y prendre, mais pour ma part, j'ai créer une scène dédiée a la communication avec le Photon. Mes virtuals device ne font que passer 2 arguments dans une variable global, arguments repris par la scène de communication avec le Photon. Donc pour comprendre le schéma, l'appui sur un bouton de mon virtual device, modifie une variable pour contenir le nom de la fonction a exécuter, puis une seconde variable avec un éventuel paramètre. Puis ma scène se déclenche automatiquement, récupère ces deux valeurs pour communiquer avec le photon et réinitialise les variables pour la prochaine utilisation. D'un point de vue authentification sur le Cloud, il vous faut récupérer le N° unique de votre device Photon et le Token d'authentification. Voici donc le code de ma scène pour gérer l’exécution d'une scene. (Les deux variables globales que j'ai créé auparavant sont donc : IntBut_Function et IntBut_Argument) : local Device ='xxxxxxxxxxx' local Token ='xxxxxxxxx' local FunctionRequested = fibaro:getGlobalValue("IntBut_Function") local ArgumentSent = fibaro:getGlobalValue("IntBut_Argument") ------------------ FONCTION SPARK ------------------ function SparkFunction(Name,Argument) local Path = 'https://api.particle.io/v1/devices/'..Device..'/'..Name..'?access_token='..Token local Spark = net.HTTPClient(); Spark:request(Path, { options = { method = 'POST', headers = {["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"} , data = 'arg='..Argument } , success = function(response) if tonumber(response.status) == 200 then print('Function "'..Name..'" ('..Argument..') sent with success'); SparkTable = json.decode(response.data) else print('Function "'..Name..'" ('..Argument..') Error Status : '..response.status); end end , error = function(err) print('Connection error = ' .. err) end }); end ------------------ FIN DE FONCTION SPARK ------------------ Cette fonction est donc générique pour tous les appels de fonctions. J'ajoute alors a cette scène a la suite, un bout de code comme celui-ci pour chaque fonction : if FunctionRequested == "NomDeLaFonctionCLOUD" -- Ici il s'agit du nom de la fonction Cloud déclaré précedement dans le code de notre Photon then SparkFunction(FunctionRequested, ArgumentSent) end PS : J'aurais pu exécuter le code de la fonction en direct sans passer par ce bout de code, mais j'ai fais ce choix afin de pouvoir également exécuter d'autres actions que celle de communiquer avec le Photon. Et enfin pour lancer tout le processus depuis un virtual device ou depuis une scène, il suffit d'intégrer ces deux lignes de codes dans un bouton ou ailleurs : fibaro:setGlobal("IntBut_Argument",ArgumentATransmetre) fibaro:setGlobal("IntBut_Function",NomDeLaFonctionCLOUD) b/ Récupérer la valeur d'une variable contenue dans le Photon : Cette fois nous souhaitons récupérer la valeur d'une variable. On déclare une variable public dans le code source du Photon : //Particle.variable("LaVariableCLOUD", &LaVariableLOCAL, STRING); Puis dans la HC2, l'approche est exactement la même, mais il faudra tout d'abord créer une autre variable global pour stocker temporairement le nom de la variable demandé et une autre pour stocker le résultat (ex : IntBut_Variable et MaVariableDeResultat). Et voici la fonction a intégrer dans la scène gérant la communication avec le Photon : local VariableRequested = fibaro:getGlobalValue("IntBut_Variable") --------------------- VARIABLE SPARK ---------------------- function SparkVariable(Name) local Path = 'https://api.particle.io/v1/devices/'..Device..'/'..Name..'?access_token='..Token local Spark = net.HTTPClient(); local Result Spark:request(Path, { options = { method = 'GET', headers = {["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"} , } , success = function(response) if tonumber(response.status) == 200 then print('Variable "'..Name..'" requested with success'); SparkTable = json.decode(response.data) Result = SparkTable.result fibaro:setGlobal("MaVariableDeResultat",Result) else print('Function "'..Name..' Error Status : '..response.status); end end , error = function(err) print('Connection error = ' .. err) end }); end ------------------ FIN DE VARIABLE SPARK ------------------ Puis le bloc d'appel a ajouter a la suite : if VariableRequested == "LaVariableCLOUD" -- Ici il s'agit du nom de la variable Cloud déclaré précedement dans le code de notre Photon then SparkFunction(VariableRequested) end et enfin le code a intégrer a un boutton pour autre pour appeler tout le bazard : fibaro:setGlobal("IntBut_Variable","LaVariableCLOUD") Communication du Particle Photon --> HC2 : Cette fois ce sera beaucoup plus simple. A noter qu'il est possible de modifier la valeur d'une variable via un requete REST mais que cette modification ne déclenche pas une éventuelle scène associée. Je vais alors vous montrer ce qui me semble être la requête la plus utile, a savoir une requête demandant l'appuie sur le bouton d'un Virtual Device : Ici tout ce passe dans le code source du Photon : Comme vous pouvez le voir, il faut renseigner l'adresse IP de la box, votre admin:password en base 64, l'ID du device a actionner et le N° du boutton. Dans mon exemple ci-dessous le Photon demande l'appui sur le bouton 1 du device 50 dès sont initialisation : String server = "AdresseIPdelaHC2"; // Adresse IP de la box Fibaro String FibaroLogin = "xxxxxxxxxxx"; // admin:password en base 64 int FibaroDeviceID = 50; // N°ID du device Fibaro a piloter int NduBoutton = 1; // N° du bouton a actionner void setup() { FibaroCommunication("{\"args\":[" + String(NduBoutton) + "]}"); } void loop() { } /////////// FONCTION PRIVE DE COMMUNICATION AVEC LA FIBARO /////////// bool FibaroCommunication(String PostData) { if (Fibaro.connect(server,80)) { Serial.println("Connection Success"); Fibaro.print("POST /api/devices/"); Fibaro.print(NduBoutton); Fibaro.print("/action/pressButton"); Fibaro.println(" HTTP/1.1"); Fibaro.print("Host: "); Fibaro.println(server); Fibaro.print("Authorization: Basic "); Fibaro.println(FibaroLogin); Fibaro.print("Content-Length: "); Fibaro.println(PostData.length()); Fibaro.println(); Fibaro.println(PostData); return true; } else { Serial.println("Connection Failed."); return false; } } Bon voila, c'est terminé ! En espérant avoir été assez clair ! Vous verrez on peut faire de vrai merveilles avec ce Photon couplé a notre HC2.
  12. Salut à tous, Je voulais partager avec vous la solution que j'ai choisi pour mon suivi de consommation avec graph HC/HP. Pour le monitoring de la consommation j'ai choisi le "NorthQ Stromsensor - Z-Wave". Il est bien détecté par la HC2 et remonte une quantité de consommation électrique depuis la mise en service. Donc pas de valeur instantanée. Pour faire un graphique, j'ai simplement créé un virtual device associé à plusieurs variables globales : - EDF_HC qui est postionnée à 0 ou à 1 en fonction de l'heure pour savoir si on est heure creuse ou heure pleine - EDF_LAST_GLOBAL qui sera utilisée pour stocker la dernière valeur du compteur que l'on a lu Il suit un simple calcul différentiel entre la dernière consommation et l'actuelle que l'on trace en fonction de l'heure HC/HP Pour tracer, j'utilise une fois de plus le service thingspeak qui offre une méthode ultra-simple pour des graphs sympa. La méthode n'est pas parfaitement précise car entre deux réveils du plugin (~30mn) on a pu changer d'heures HC/HP et donc compter des KW/h dans la mauvaise catégorie. Cependant, je vis très bien avec ça car je suis plus intéressé par la tendance que par une valeur "parfaite" à 100%. Voici le code que j'utilise : Il vous reste à ajuster l'id de votre compteur (89 ici) et votre clé d'API thingspeak. Sur thingspeak, j'utilise un plot avec 2 fields, le premier pour les HC, le second pour les HP. thingspeak = Net.FHttp('api.thingspeak.com') while true do local current_kwh = fibaro:getValue(89,'value') local last_kwh = fibaro:getGlobalValue('EDF_LAST_GLOBAL') local kwh_to_report = current_kwh - last_kwh fibaro:setGlobal('EDF_LAST_GLOBAL', current_kwh) local field_nb = 1 local other_field= 2 if fibaro:getGlobalValue("EDF_HC") == "1" then field_nb=2 other_field=1 end payload = 'key=VOTREAPIWRITEKEY&field'.. field_nb .. '='..kwh_to_report .. "&field" ..other_field.."=0" fibaro:debug("About to report " .. kwh_to_report .. "KWh (" .. current_kwh .. " - " .. last_kwh .. ")") current_date = os.date("%x") local loops = 0 while true do response, status, errorCode = thingspeak:POST('/update', payload) if tonumber(status) == 200 then break; end if loops == 10 then fibaro:setGlobal("Compteur_Elec_Fail", fibaro:getGlobalValue('Compteur_Elec_Fail') + kwh_to_report) fibaro:log("Failed at updating elec consumption") loops = 0 break; else fibaro:debug("Failed at sending info, retrying " .. loops .. "/10") end fibaro:sleep(500) loops = loops + 1 end fibaro:debug("Sleeping before retrying") fibaro:sleep(1800000) end Voici une petite copie d'écran de ce que ça donne après 1j en fonctionnement: Voilà , En esperant que ça aide, Erwan
  13. Je voulais partager avec vous la solution que j'ai mis en place pour suivre ma consommation d'eau. Alors j'ai choisi d'un installer un compteur d'eau "Débitmètre avec sortie d'impulsion Compteur d'eau Générateur de débit d'eau 1 Imp./L Qn 1,5m³/h" J'ai connecté l'impulsion sur un détecteur domotique universel FGBS-0001 entre la pin IN2 et GND. Coté HC2, le capteur est vu comme un capteur de présence, dans mon cas j'ai choisi un capteur de porte. Je coche la case qui permet d'exclure ce capteur des alarmes. Je désactive les alarmes (paramètre 13) en mode broadcast disable. Enfin, j'active dans les options avancées du capteur , le mode scène (paramètre 14 positionné sur ON). Je sauvegarde ce paramètre. Ensuite, j'utilise le service ThingSpeak.com pour pouvoir grapher les résultats. Ce service à l'avantage d'être très simple à mettre en place. Il suffit de créé un "Channel" et je nomme le "field1" -> 'Consommation d'eau'. Dans l'onglet "API Keys" du site ThingSpeak, je sauve la valeur de la clé pour le mode écriture ("Write API Key"). Sur le graphique de ce channel, je choisi le mode "SUM 60 minutes en mode ligne" pour avoir un affichage cumulé des consommations sur une période de 1 heure. Je créé un Virtual Device que je nomme "Graph Eau" avec un bouton que je nomme "grapheau". Et J'utilise le code LUA suivant : fibaro:log('Actualisation consommation eau') thingspeak = Net.FHttp('api.thingspeak.com') payload = 'key=VOTREWRITEAPIKEY&field1=1' response, status, errorCode = thingspeak:POST('/update', payload) Je vais dans le menu Scène et je créé une nouvelle scène que je nomme "Graphique Eau", je créé la scène avec le mode utilisant les blocs pour plus de simplicité. Le paramètre 14 du capteur de présence indique que sur l'entrée IN2, un front montant (OFF -> ON) déclenche un code scène 20. Donc j'indique que "SI le capteur du compteur d'eau == "scène activation" 20 alors j’exécute le bouton "grapheau" du virtual device "Graph Eau". Et voilà ! Cela nous donne un graphique heure par heure de la consommation d'eau. Il est à noter que j'ai choisi un compteur qui me donne 1 impulsion par litre rendant l'interprétation des résultats plus facile. J'espère que cela vous sera utile, je trouve la solution assez élégante et facile à mettre en place.
  14. Bonjour, Je reviens sur un tuto proposé par Steven sur la génération d'ID pour le GEA. http://www.domotique-fibaro.fr/index.php/topic/3477-g%C3%A9n%C3%A9rateur-did-pour-gea-ou-autre-script/?hl=%20local%20%20doit Mon problème est que depuis la V4 et le manque de template (j'ai beaucoup de devices Aeons Labs), je suis amené à faire des reconfigure (le soft reconfigure ne marchant pas toujours) faisant que mes devices changent d'ID. Ayant aussi une slave HC2, le lien s'étant perdu aussi quelques fois, l'ensembles des ID était changé une fois la slave reconnectée. Cela devenait un vrai casse tête pour modifier l'ensemble des VD et scenes. Ce que est constant chez moi, ce sont les noms ! Donc l'idée est de pouvoir appeler les devices par leur nom, pas par leur ID. Je suis donc reparti du script de Steven pour stoker dans une variable globale tous les ID et les noms, permettant ensuite dans le code de faire appel au device par son nom. La solution se compose donc : - d'une variable globale idTable à créer - un script de génération de cette variable (voir plus bas) - d'une fonction de decode de la variable globale en entête de vos scripts/VD : idALL=json.decode(fibaro:getGlobal('idTable')) - et finalement de l'appel à l'ID de module idALL["NOM_DU_MODULE"] dans chaque call : exemple : fibaro:call(tonumber(idALL["NOM_DU_MODULE"]), "turnOff") Même si le problème est déplacé vers le fait qu'il faut retenir les noms (j'utilise le script original de Steven pour en avoir la liste une fois pour toute gardé dans un fichier word), je peux dire qu'au bout de 3 mois, cela a changé ma vie. Ce n'est bien sà»r utile que si vous faites évoluer votre installation, ou avez des besoins de reconfigurer ou de tester la V4... Ce n'est donc sans doute pas adapté à tout le monde. Limitations : - Le seul endroit où les id sont encore nécessaires, c'est en entête de scenes pour les déclencheurs - cela ne marche qu'en V4, car les V3 ne permet pas d'avoir des variables avec une longue string (je sais pas la limite). En v4, j'en ai pas vu le bout :-) Voici le script. Encore merci à Steven --[[ %% properties %% globals --]] local hidden = false --- true pour exporter les devices cachés local dead = false -- true pour exporter les devices morts local excludeType = {"com.fibaro.zwaveDevice", "weather", "HC_user", "iOS_device", "com.fibaro.voipUser"} local excludeID = {} local devicesJSon = api.get("/devices") local devices = {} local names = {} local rooms = {} function addName(name, roomname) if (type(names[name]) == "nil") then names[name] = true return name else return addName(name.."_"..roomname, roomname) end end function getRooms() local roomsJSon = api.get("/rooms") rooms[0] = "inconnu" for k, v in ipairs(roomsJSon) do rooms[v.id] = v.name end end function rename(name, roomname) local name = name:upper():gsub("[éêèà«]", "E"):gsub("EE", "E"):gsub("[à»à¼ù]", "U"):gsub("UU", "U"):gsub("[à âà¤]", "A"):gsub("AA", "A"):gsub("[à¶ô]", "O"):gsub("OO", "O"):gsub("[îà¯]", "I"):gsub("II", "I"):gsub("%W", "_") local roomname = roomname:upper():gsub("[éêèà«]", "E"):gsub("EE", "E"):gsub("[à»à¼ù]", "U"):gsub("UU", "U"):gsub("[à âà¤]", "A"):gsub("AA", "A"):gsub("[à¶ô]", "O"):gsub("OO", "O"):gsub("[îà¯]", "I"):gsub("II", "I"):gsub("%W", "_") return addName(name, roomname) end getRooms() for k, v in pairs(devicesJSon) do local doit = (hidden or v.visible) and (dead or not v.dead) if (doit) then for h, w in pairs(excludeType) do if (v.type == w) then doit = false end end if (doit) then for h, w in pairs(excludeID) do if (v.id == w) then doit = false end end end end if (doit) then table.insert(devices, v) end end table.sort(devices, function(a, return a.roomID<b.roomID end) local result = "<BR><BR>-- IDs générés le : " .. os.date("%d/%m/%y à %X") local room = -1 local lastinfo = ""; result = result .. "<BR><BR>local id = {" resultVar = "{" for k, v in ipairs(devices) do if (room ~= v.roomID) then room = v.roomID result = result .. "<BR>--"..rooms[v.roomID].."<BR>" end lastinfo = rename(v.name, rooms[v.roomID]) result = result .. lastinfo .. " = " .. v.id .. ", " resultVar = resultVar .. '"'..lastinfo .. '":' .. v.id .. "," end result = result .. "<BR>}" result = result .. "<BR>" result = result .. "<BR>-- usage :" result = result .. "<BR>-- fibaro:getValue(id[\""..lastinfo .."\"], \"value\")" result = result .. "<BR>-- GEA.add(id[\""..lastinfo .."\"], 30, \"\")" resultVar = resultVar .. '"FIN":999}' --print(result) fibaro:setGlobal("idTable", resultVar) -- TEST local id=json.decode((fibaro:getGlobal('idTable'))); print(fibaro:getGlobal('idTable'))
  15. Clé Usb Recovery Explication en image de la FAT32 Je vais vous expliquer ce que contient la partition FAT32 de la clé USB Recovery Je précise que ni moi ni le forum de peux être tenu responsable en car d'une mauvaise utilisation de ce TUTO Je ne ferai aucun support sur ce tuto 1 - Il faut eteindre ca box FIBARO via le bouton. 2 - Retirer la clé USB Recovery de la box (je passe le démontage des plaques pour y avoir accés ) 3 - Brancher la clé USB Recovery sur un PC Windows (Pour mac je sais pas si il lit les fat32) 4 - Accéder à la clé USB Recovery via l'explorateur de fichier Windows 5 - Voici ce que vous allez voir : 3 Répertoires et 1 Fichier le fichier network.conf contient la configuration réseau de votre HC2 Passons au répertoire Backups On retrouve ici toutes nos sauvegardes Regardons d'un peu plus prêt une sauvegarde On y trouve 4 fichiers et un dossier scenes checksum = Il contient le numero MD5 pour la vérification de la sauvegarde Info = fichier contenant les infos de la sauvegarde (date, heures, nombres de pièce etc...) sql = base de données sql Regardons de plus prêt le dossier scenes dans le dossier on retrouve tout les scripts de nos scènes ainsi qu'un fichier html par scéne Passons au répertoire log Ce répertoire est vide Le répertoire system checksum : stock le MD5 de l'image (image.gz) image.gz : c'est l'image qui sera restauré lors d'un recovey les fichiers version3 et version4 sont vide Mettre a jour l'image qui sert au recovery Pour cela il suffit de télécharger l'une des images partager par @jojo est de copier les fichiers dans le dossier system https://drive.google.com/drive/folders/0B1AXBMQhZAKAWlpsWk1FTEhlMHM Donc on s' aperçoit qu'il n'est pas très compliquer de faire une copie de ces sauvegardes sur notre PC Pour ceux qui aurait l'idée de modifier la base sql, il faudra recalculer le MD5, mais je dé-conseil de faire cela car en cas d'erreur c'est recovery obligatoirement
  16. Zorgonaute84

    Virtual Device Wunderground

    Je partage avec vous un "autre" module virtual device pour Wunderground. C'est une version simplifié des autres modules déja existant, mais qui a le mérite de répondre a mon besoin et peut-être au votre. Je précise que j'ai utilisé des extraits de code d'autres modules Wunderground pour constituer celui-ci. Le module : WU_Weather.vfib Et les icones : Pour configurer le module, il faut ajouter au variable du bouton rafraichir vos informations : local username = "Votre Login"; local password = "Votre mot de passe"; local APIkey = "Votre clef API"; -- API Key obtenue sur Wunderground local StationID = "Le Station ID"; -- The PWS location to get data for (Personal Weather Station) local station = "pws"; -- Inscrire si il s'agit d'une station "pws" ou "locid" Vous avez besoin d'un compte chez Wunderground, donc il faut renseigner le login et le mot de passe pour commencer. Ensuite vous devez demander un clef API sur Wunderground, c'est gratuit et rapide, vous êtes juste limité en nombre de requête par jour, c'est pour ça que le module ne se rafraîchie que toutes les 5 minutes. Et enfin vous devez indiquer le code de la station que vous souhaitez suivre. Pour le trouver c'est simple, il faut aller sur le site de Wunderground, afficher la station qui vous interesse, et le stationID se trouve dans la barre d'adresse. Il faut également indiquer le type de station, "pws" quand il s'agit d'une station personnel ou "locid" pour les stations officiel. Idem l'info se trouve dans la barre d'adresse. Ensuite, toujours dans le code du bouton rafraichir il faut modifier le numéro des icones. Car vos icones n'auront pas les même numéros. Vous devez donc tous les importer, reperer leur numéro et mettre a jour cette partie du code : function getIcon(Ciel) if(Ciel == "clear") then return 1070 elseif(Ciel == "mostlysunny") then return 1071 elseif(Ciel == "partlycloudy") then return 1072 elseif(Ciel == "mostlycloudy") then return 1073 elseif(Ciel == "cloudy") then return 1074 elseif(Ciel == "rain") then return 1076 elseif(Ciel == "snow") or (Ciel == "sleet") or (Ciel == "flurries") then return 1077 elseif(Ciel == "tstorms") then return 1079 else return 1080 end end
  17. Faire un RECOVERY en moins de 30 mn By MPRInfo Tout en Image Comment on passe la box en mode recovery ? (éteindre la box, puis appuyer sur les deux boutons simultanément) Petite précision avant de commencer : J'ai modifié l'image recovery sur ma clef usb, j'ai aussi modifié la taille de la partition fat32 de ma clef recovery de 8go Donc lors de ce recovery je ne vais donc pas passer par la 3.60 mais directement en 4.031 Cela ne change rien au principe pour les box anciennes comme la mienne il faudra passer par la V3 je suis donc en 4.031 pour ceux qui on une image recovery ancienne on doit arrivé en 3.60 si mais souvenir sont bon il faut donc faire la mise a jours pour passer en V4 On passe ensuite en 4.054 Stable On accepte de prendre pleins des risque sans rien dire ou râler Après acceptation il faut parfois re saisir l'adresse de la box pour avoir l'image suivante On ferme le navigateur est on vide le cache comme a chaque mise à jours Ensuite si on veut on peut installer la 4.055B la procédure est la même On oublie pas de nouveau a vider le cache du navigateur une fois la mise a jour faite On ferme le navigateur est on vide le cache comme a chaque mise à jours Pour la clef ou j'ai augmenté la taille voici un aperçu : Liens utiles : Images Clé Usb : https://www.domotique-fibaro.fr/topic/6824-images-clã©-usb/ Clé Usb Recovery Explication En Image De La Fat32 : https://www.domotique-fibaro.fr/topic/5534-clé-usb-recovery-explication-en-image-de-la-fat32/ The END
  18. Bonjour, J'ai été confronté à quelques soucis avec un appareil qui ne réagissait plus (figé) de temps en temps. Comme j'y accède en http et qu'il ne répondait plus via ce mode, j'ai créé un VD pour le redémarrer électriquement via un module fibaro qui lui fourni son électricité. C'est mon premier VD, il est bien possible qu'il ne soit pas très propre. Il modifier quelques lignes dans le code LUA des deux boutons en plus de l'adresse IP et du port du device et c'est tout. Bouton Check: local iconOK=163 -- icon for OK status local iconCHK=164 -- icon for CHECKING status local iconDOWN=165 -- icon for DOWN status local pushDEV=144 -- id of the device where to send push notification, set to nil if push not wanted local URL="/index.html" local debug=true -- or false Bouton Reboot: powerSwitchId = 53 -- id of the device for power Voilà , j'espère que cela va aider certaines personnes ici. Edit: petite erreur dans le script du bouton Check, c'est pushDEV et non pushDev... Surveillance_url.vfib
  19. Berale64

    Coupatan

    Aller, un petit gadget pour les vacances. Vous vous souvenez peut être de ces minuteur mécanique que l'on trouvait dans les cuisines pour surveiller le temps de cuisson. Tous les scripts que l'on fait démarrent à heure fixe pour un temps donné. Je voulais quelque chose comme un coupatan. Je définis le temps et je démarre maintenant. C'est ce que j'ai fait. Deux étiquettes : Temps et Device. Pour le temps, il y avait la solutions des sliders, mais j'ai préféré des boutons cumulables. Si je clique sur 10, puis sur 5 et enfin deux fois sur 1 j'obtiens 17. Trois boutons pour les trois devices que je veux contrôler avec ce VD. (Il manque vraiment un truc du genre io.read chez Fibaro). Le device choisi est affiché dans l'étiquette. Un bouton Start, un Stop si besoin est, et un Reset pour remettre le temps à zero. Le temps sera mis à jour dans l'étiquette "Temps" toutes les 10 secondes ainsi que dans la petit bande "Log" en bas du VD pendant l'éxécution. Il faut créer deux variables globales "Timer" et "TimerID". A vous d'adapter les boutons des devices. Enjoy ! Timer.vfib PS: rien dans le main loop, c'est trop merd... que !
  20. Berale64

    Settimeout

    En convertissant une scène en mode block je suis tombé sur la fonction setTimeout. Cette fonction retarde d'un delay défini l'exécution d'une séquence lua. Si la fonction sleep suspend le déroulement d'une scène, la fonction setTimeout met en arrière plan les instructions de la fonction, mais la scène lua poursuit son cours. --[[ %% properties 52 value 52 armed %% globals --]] fibaro:debug("Start"); fibaro:debug("scene n "..fibaro:countScenes()); local val = fibaro:getValue(52, "value"); local arm = fibaro:getValue(52, "armed"); fibaro:debug("Etat "..val.." "..arm); setTimeout(function() ------ début de la fonction local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(52, "value"); fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0); if (( (tonumber(val) == 0 and tonumber(arm) == 0) ) and (os.time() - deviceLastModification0) >= 120) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(163, "turnOff"); end end, 120000) ------- fin de lafonction avec delai de 120 secondes fibaro:debug("End"); Le but de ce script est d'éteindre une lampe si plus d'activité (52 = détecteur de mouvement) pendant 2 mn. Analyse du debug. On voit que la scène s'exécute de Start à End en mettant la fonction timeout en attente. A chaque passage, il y a deux scènes qui démarrent. Val = 1 activation du détecteur, val = 0 retour au repos après 20 secondes. Quand le délai arrive à 120 secondes et pas de modification de l'état du détecteur, les instructions sont exécutées. Ici, éteindre la lumière. Il me semble que cette fonction peut ouvrir des horizons pour nos petit bidouillages.
  21. Voici un nouveau venu dans la série backup/restore. Avec ce couple scène / VD vous pourrez faire un backup (hors de votre HC2) de vos panneaux de chauffage (Heating Panels) et ensuite un restore sur une nouvelle box (ou après un recovery). Avec la scène en mode débug, on crée le backup des heating panels. Le système génère deux tables une pour la liste des Heating Panels et une autre avec la configuration de chaque heating panel On colle le résultat du debug de la scène dans le bouton restore du VD (que vous exportez sur votre disque dur). Créer manuellement autant de heating panels qu'il y en a à restaurer (car il n'est pas possible de prédire facilement (et de manière fiable) les ID qui seront générés par le système) Récupérer les ID de ces nouveau Heating Panels via http://<ip>/api/panels/heating Dans la table "ListeHP", remplacer les ID actuels par les nouveaux ID Appuyez sur le bouton restore. (Si vous lancez le restore en Debug, vous avez un débug détaillé de ce qu'il a fait). Ceci peut également être utilisé pour : (=> faites attention à ce que les noms repris dans les tables ListeHP et ConfigHP soient parfaitement identiques) Renommer un panneaux de chauffage Faire une copie d'un panneau de chauffage, et donc l'utiliser comme template d'un nouveau … PS : les instruction se trouvent également dans le Main Loop du VD v3:: correction bug API Backup_HeatPanel_v3.0.vfib Backup_HeatPanel_v3.0.lua Historique : v2 : Backup_HeatPanel_v2.0.lua Backup_HeatPanel_v2.0.vfib v1.1 : optimisation du code du bouton backup grâce à Steven Backup_HeatPanel_v1.1.vfib Backup_HeatPanel_v1.1.lua v 1.0 : Backup_HeatPanel_v1.0.vfib
  22. Faire une copie de la clef usb RECOVERY sous windows Ceci est un complément a ce tuto : http://www.domotique-fibaro.fr/index.php/topic/2364-hc2-usb-recovery-tweaks/ !!! Attention !!! ce tuto n'est pas sans risque si vous ne le suivez pas a la lettre vous risquez de corrompre votre clef USB RECOVERY Il faut télécharger : Win32 Disk Imager : http://sourceforge.net/projects/win32diskimager/ HashMyFiles v2.11 : http://www.nirsoft.net/utils/hash_my_files.html Il faut éteindre la box Retirer la clef USB Recovery pour cela il faut dévissé les 4 vis pour et retirer le cache afin d'avoir accès a la clef Brancher la clef USB RECOVERY sur votre PC Installer Win32 Disk Imager sur votre PC Voici un aperçu des partitions de la clef Lancer Win32 Disk Imager ATTENTION bien cliquer sur READ sinon on risque de détruire la clef usb Notre clef USB et Cloner dans un fichier IMG. Nous allons récupérer le MD5 On copie cette clef MD5 dans un fichier TXT cela nous servira a vérifié si notre fichier IMG n'est pas corrompu lorsque l'on voudra la restaurer. La clef MD5 controler l'intégrité de notre sauvegarde. Cette clef ne changera pas temps que l'on ne modifie pas notre sauvegarde voici un lien qui explique ce qu'est le MD5 : http://fr.wikipedia.org/wiki/MD5 Verification du fichier IMG avec le MD5 On vérifie que la clef MD5 et bien identique a la clef que l'on a copié dans le fichier TXT On copie les fichiers qui ce trouvent sur la partition Fat32 de notre clef USB recovery dans un répertoire de notre PC Répertoires : Backups (contient toutes nos sauvegardes) logs (ce répertoire est vide chez moi system (Contient l'image qui sera restauré lors d'un recovery) network.conf (le fichier contient seulement l'info permettant au réseau de fonctionner en DHCP lorsqu'on boot en recovery) Ce qui nous donne ceci : Avant de faire quoi que ce soit sur votre HC2 Solutions en cas de probléme : Contacter le support FIBARO (surtout si ils peuvent avoir accès à la box) Brancher un écran sur votre HC2 pour voir ce qui ce passent Je précise que le clonage de la clef ne peut normalement être utilisé sur une autre clef USB il faut absolument la clef USB RECOVERY fourni par fibaro
  23. jojo

    Backup Variables

    Le soucis de bon nombre d'entre nous est le fait qu'on soit lié à un backup sur une clé USB propriété de Fibaro. L'excellent tuto de Lazer explique comment faire un backup de la clé, mais il faut avoir des connaissances Linux, que perso je n'ai pas. Merci à mprinfo pour son tuto sur la création des variables en LUA qui m'a donné l'idée et les premières infos pour le restore. Merci également à Steven pour son script de génération des ID dont je me suis inspiré pour faire le backup. Alors, ici, je vous présente mon premier couple scène / VD de backup / restore, d'une série que j'espère longue … Avec la scène en mode débug, on crée le backup des variables. On colle le résultat du debug de la scène dans le bouton restore du VD (que vous exportez sur votre disque dur), et en cliquant sur le bouton Restore, il recrée les variables si elles n'existaient pas. Si vous lancez le restoreen Debug, vous avez un débug détaillé de ce qu'il a fait. C'est très utile pour faire un restore sur une nouvelle box (ou après un recovery) Les instructions se trouvent dans le code de la main loop. Version 2.0 : Backup_Variables_v2.0.vfib Backup_Variables_v2.0.lua Version 1.0 : Backup_Variables_v1.0.vfib Backup_Variables_v1.0.lua
  24. jojo

    Modifier L'icone D'un Device

    Avec ce VD, vous pourrez modifier l'icône d'un device via script LUA. N.B. : il n'est pas nécessaire d'utiliser ce VD pour modifier l'icône d'un autre VD. Préférez simplement l'instruction fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 153) Un tout grand merci à Lazer et PITP2 pour leur aide pour la V4..x et à Did pour avoir fait germer l'idée. Exemple d'utilisation : vous avez un thermomètre dans votre congélateur, et vous souhaitez que l'icône soit différente si la température est normale ou trop élevée. Ok, ce n'est que de l'esthétique, mais si en plus d'être utile, la domotique peut être belle … Voici les icônes que Did a créées pour la température de son congélateur. http://www.domotique-fibaro.fr/index.php/gallery/image/3703-cong%C3%A9lateur/ http://www.domotique-fibaro.fr/index.php/gallery/image/3704-cong%C3%A9lateur-alarm/ Vous devez d'abord charger les icônes pour le type de device dont vous souhaitez modifier l'icône (cette phrase devient très mystique … ). Ensuite vous devez : Récupérer l'ID du device : vous le voyez dans l'URL lorsque vous modifiez le device Récupérer l'ID des icônes : voir tuto de Did : Récupérer l'id d'une Icône. Finalement Importez le VD ci-joint (il est compatible V3.x et v4.x) Recopiez autant de fois que nécessaire le bouton avec son code, en mentionnant au début l'ID du device et de l'icône DeviceIcone_v1.0.vfib Utilisation : Via GEA : ajouter l'option {“VirtualDeviceâ€, <id,_module>, <no_bouton>} - Press le bouton du module virtuel {“VirtualDeviceâ€, 2, 1} Via LUA : fibaro:call(<ID de ce VD>, "pressButton", "<# du bouton>") Pour connaître le n° du bouton : voir tuto de mprinfo : Module Virtuel - Numérotation Des Boutons Limitation : lorsque l'icône d'un device est modifiée, il faut faire un refresh du browser pour que la modification apparaisse.
  25. Trop de scènes tournent indéfiniment avec des "while true do". j'avais envie de me livrer à un petit exercice et aussi de jouer avec les tables. J'ai donc écrit ce petit scheduler qui permet d'actionner des devices et d'exécuter certaines actions sous certaines conditions. J'en vois déjà qui hurlent "GEA". Oui, je sais mais si on veut apprendre lua, il faut d'abord faire soi même, après on verra. Tout est décrit dans une table qui contient : Pour chaque ligne, une clée, une table d’horaires de déclenchement, une chaine de caractères de 1 à 7 qui sont les jours de la semaine tels que définis par wday dans os.date, une action, une table avec le nom d'une variable globale et une valeur, une table 'dID de devices. Les actions sont : - "turnOn et turnOff". allumer ou éteindre les devices de la table de devices aux heures et jours définis si la variable globale vaut la valeur donnée. Bien respecter les mots clés qui sont utilisés dans la function call. - "setGlobal" met à jour la variable globale. La table d'ID représente le VD et le bouton à actionner. Si pas de VD remplacer la table par nil. - "pressButton" pousse le bouton du VD défini dans la table d'ID si la variable globale vaut la valeur définie. Ce script correspond à mes besoins, mais peut très facilement être adapté pour d'autres mots clés. --[[ %% autostart %% properties %% globals --]] local SalonID = {46,47,48}; local BureauID = {67}; local PaCbuttonON = {113,"2"}; local PaCbuttonOFF = {113,"1"}; local DayON = {70,"1"}; local DayOFF = {70,"2"}; local DoveON = {69,"1"}; local DoveOFF = {69,"2"}; table = -- Simulation présence {["SalonON"] = {{"17:30","01:30","05:20"},"1234567","turnOn",{"AtHome","NO"},SalonID}, ["SalonOFF"] = {{"22:30","01:45","07:20"},"1234567","turnOff",{"AtHome","NO"},SalonID}, ["BureauON"] = {{"18:51","01:35","06:12"},"1234567","turnOn",{"AtHome","NO"},BureauID}, ["BureauOFF"] = {{"20:12","01:52","07:55"},"1234567","turnOff",{"AtHome","NO"},BureauID}, -- Lumière salon présence ["Salon2ON"] = {{"19:30"},"23456","turnOn",{"AtHome","YES"},SalonID}, ["Salon2OFF"] = {{"21:00"},"23456","turnOff",{"AtHome","YES"},SalonID}, ["Salon3ON"] = {{"18:00"},"17","turnOn",{"AtHome","YES"},SalonID}, ["Salon3OFF"] = {{"22:00"},"17","turnOff",{"AtHome","YES"},SalonID}, -- PaC Piscine ["PaCON"] = {{"14:15"},"1234567","setGlobal",{"Start_PaC","STANDBY"},PaCbuttonON}, ["PacOFF"] = {{"19:00"},"1234567","setGlobal",{"Start_PaC","OFF"},PaCbuttonOFF}, -- Day and Night ["DayON"] = {{"06:30"},"1234567","setGlobal",{"Day_Night","DAY"},DayON}, ["DayOFF"] = {{"22:20"},"1234567","setGlobal",{"Day_Night","NIGHT"},DayOFF}, -- Lumière garage pour colombes l'hiver ["DoveON"] = {{"08:00"},"1234567","pressButton",{"Season","WINTER"},DoveON}, ["DoveOFF"] = {{"18:00"},"1234567","pressButton",{"Season","WINTER"},DoveOFF} }; while true do local currentDate = os.date("*t"); local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min); local TriggerDay = currentDate.wday; for key,value in pairs(table) do local time = value[1]; local days = value[2] local action = value[3]; local VGvalue = value[4]; local devID = value[5]; if (string.find(days,TriggerDay) ~= nil) then for i =1,#time do if (TriggerTime == time[i]) then fibaro:debug(key.." "..TriggerTime.." "..action); -- Changement de variable globale et action bouton VD if (action == "setGlobal") then fibaro:setGlobal(VGvalue[1], VGvalue[2]); if (devID ~= nil) then fibaro:call(devID[1], "pressButton", devID[2]); end -- pressButton d'un VD elseif (action == "pressButton") and (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then fibaro:call(devID[1], "pressButton", devID[2]); -- Action sur Device elseif (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then for j = 1,#devID do fibaro:call(devID[j],action); end end end end end end fibaro:sleep(60*1000); end
×