Aller au contenu

Steven

Membres confirmés
  • Compteur de contenus

    4 434
  • Inscription

  • Dernière visite

  • Jours gagnés

    201

Tout ce qui a été posté par Steven

  1. Steven

    Pluviomètre Hc2

    0mm aujourd'hui, 57mm cette semaine et 194 ce mois... Tout cela semble àpremière vue correcte. Si tu as supprimer les données, as-tu attendu 10mn avant de lancer la scène ? Le rafraîchissement des donnés àlieu toutes les 5 minutes pour les APIs.
  2. Steven

    Pluviomètre Hc2

    Bonne idée va falloir que je fasse cela en un peu mieux 😃
  3. Steven

    Géolocalisation Gps Hc2

    Perso, cela n'a jamais fonctionné chez moi ... mais j'en suis bien content. Déjà ma femme sait ou je me trouve, manque plus que ma maison le sache aussi
  4. Juste pour info, depuis la v4.x on peut directement intégré ce script au sein de notre HC2 sans passé par PHP. http://www.domotique-fibaro.fr/index.php/topic/839-pluviomètre-hc2/?p=69172
  5. Steven

    Support Gea

    GEA n'a jamais eu comme vocation d'être précis sur les temps de traitement, perso, je m'en fiche de savoir si ma porte est ouverte depuis plus de 5mn 30s (plus ou moins 5 à 6 min me suffisent). A l'époque, il y avait le script "Scheduler" qui lui était 100% dédié à la gestion des heures. Ce que j'ai toujours trouvé étrange vu que notre chère fibaro n'est vraiment pas une montre suisse (et je sais de quoi je parle). Pendant très longtemps la fibaro prennait plus de 5minutes de retard en 3 jours Dans ton cas, au lieu de modifier le code en remplacant >= par >, il te suffit de remplacer tes 30 ... par 31 Ta proposition est viable mais ne fait que de déporter le problème. Car si quelqu'un ouvre sa porte à 8h00'00 et demande d'être averti 30secs plus tard, dans ton cas, cela sera 1mn plus tard, soit le double du temps souhaité. Je l'ai toujours dis et re-dis avec GEA, on est à plus ou moins 30 secondes, on peut réduire la marge en demandant une exécution toutes les 15sec voir 10 sec mais je n'en vois pas l'utilité. Si j'ai besoin d'un script super précis, je l'écrit moi-même, mais cela ne met jamais arrivé. Donc ne cherchons pas la perfection alors qu'elle est inutile. La perfection ne doit pas être dans le code mais dans son auteur ... purrrréééé, j'ai du boulot
  6. Steven

    Pluviomètre Hc2

    Les pluies sont en mm. Tes données sont cohérentes par rapport aux miennes.
  7. Steven

    Pluviomètre Hc2

    Oui, seul le code derrière "Prévision" te sera utile.
  8. Steven

    Support Gea

    GEA n'est pas précis dans les heures car il fonctionne par cycle de X secondes. Pour savoir si la lampe est allumée, il calcule ainsi : si (conditions respectées ET (nombre de cycle * duree d'un cycle >= secondes)) alors on active. Dans ton cas, si tu allume ta lampe à la 29sec, GEA va la considérée comme allumée depuis 30 secondes car dès le prochain cycle on aura Est-ce que la lampe est allumée : OUI Nombre de cycle : 1 Duree d'un cylce : 30sec Secondes souhaitée : 30 sec 1 * 30 >= 30 = OUI GEA ne stocke aucune heure, il stock le nombre de cycle pour lequel les conditions éteints correctes. Dès qu'une condition n'est plus remplie, il repart à 0. Extrait du code : entry[GEA.keys["NBRUN"]] = 0 entry[GEA.keys["TOTALRUNS"]] = 0 entry[GEA.keys["DONE"]] = false entry[GEA.keys["OK"]] = false ... if ( GEA.source["type"] == "autostart" and ((entry[GEA.keys["NBRUN"]] * GEA.checkEvery) >= entry[GEA.keys["SECONDES"]]) ... C'est bien pour cela que GEA est précis mais à plus ou moins 30 secondes, c'est parce que les événements qui intervienne pendant un cycle sont "lue" à la fin d'un cycle. Le seul cas vraiment précis est, normalement, les détecteurs de présence car ils ont une donnée exploitable qui est la lastBreached (date/heure) de la dernière alarme. Sinon pour les autres modules, il n'y a pas de date/heure de la dernière modification viable. Voili voilà
  9. Steven

    Pluviomètre Hc2

    Cela semble un peu compliqué mais ... c'est vrai, c'est compliqué. Grace à la variable globale "Arrosage" que je pilote via ce module virtuel, je regarde son statut tout les vendredis et mardis à 5h00. Si elle est à "PREPARATION", j'active mon électrovanne pendant 30 minutes, si elle est sur "OUI", je l'ouvre pendant 2 heures. -- === Arrosage === -- -- On rafraichi les prévisions de pluie toutes les heures // Checking wheater every hours GEA.add(true, 60*60, "", {{"VirtualDevice", id["VD_PLUIE"], "7"}}) -- On calcul le besoin d'arrosage // Calculation to check if irrogator is needed GEA.add(true, 30, "", {{"VirtualDevice", id["VD_PLUIE"], "9"},{"Days", "Tuesday, Friday"}, {"Time", "04:55", "04:56"}}) -- Allumage de l'arrosage automatique // Switch on irrigator GEA.add({"Global", "Arrosage", "OUI"}, 30, "", {{"turnOn", id["ARROSAGE"]}, {"Days", "Tuesday"}, {"Time","05:00","08:00"}}) GEA.add({"Global", "Arrosage", "PREPARATION"}, 30, "", {{"turnOn", id["ARROSAGE"]}, {"Days", "Tuesday, Friday"}, {"Time","07:30","08:00"}}) -- On éteint // Switch off irrigator GEA.add({id["ARROSAGE"], {"Global", "Arrosage", "OUI"}}, 2*60*60, "", {{"turnOff"}, longarrosage, {"Global", "Arrosage", "NON"}}) GEA.add({id["ARROSAGE"], {"Global", "Arrosage", "PREPARATION"}}, 30*60, "", {{"turnOff"}, courtarrosage, {"Global", "Arrosage", "NON"}})
  10. Steven

    Pluviomètre Hc2

    Après avoir intégré et tester la scène, nous avons donc une mécanique qui nous permet de récupérer les données de pluie "passée". Il nous faut maintenant les prévisions. Pour cela, j'ai créer un compte sur wunderground car cela fonctionne bien, c'est rarement en panne et cela est facile. Créer un compte : http://www.wunderground.com/weather/api/d/login.html Noté la clé API exemple : 51026b9e558edfb1 Une fois que c'est fait, allez chercher la station la plus proche de chez vous et noté son "Station ID" : http://www.wunderground.com/weatherstation/ListStations.asp?selectedCountry=France Vous avez tout ? Si oui, vous pouvez continuer : Importer le module virtuel ci-joint et noté son ID Modifier votre scène précédemment créée local hc2_module_virtuel = 139Remplacer par l'ID de votre module virtuel Et remplacer la méthode afterHttpRequest par celle-ci (j'avais pas tout fini) function afterHttpRequest() if (temperature_interieure > -1000) then end if (temperature_exterieure > -1000) then end if (co2 > -1000) then end if (humidite_interne > -1000) then end if (humidite_externe > -1000) then end if (pression > -1000) then end if (bruit > -1000) then end if (rains["hour"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) end if (rains["day"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"]) end if (rains["week"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"]) end if (rains["month"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"]) end end Modifier le module virtuelDerrière le bouton "Prévision" modifier avec vos informations local scene_netatmo = 294 -- id de la scène local max_day = 3 -- 3 par défaut local cle_api = "49017e9e567edfb1" -- cle api de chez Wunderground local pws = "IAINTHOI2" -- station ID Derrière le bouton "Caclul" modifier avec vos informations .. ATTENTION, c'est ici qu'aurons lieu VOS calculs, je vous laisse donc mon code comme exemple. Dans mon cas, je ne fais que de modifier une variable global "Arrossage" qui peut recevoir 3 valeurs : NON : rien à faire PREPARATION : arrossage de courte durée pour préparer le terrain a des pluies avenir OUI : gros arrosage car pas de pluie prévue local id_phone = 179 local quantie_jour_mm = 4 -- représente la quantité souhaitée local quantite_mm_en_une_heure = 0.3*4 -- représente la puissance de votre arrosage (le mien est de 1.2mm par heure) local nb_jour_prevision = 3 Dans le main loop vous pouvez mettre le code suivant pour appuyer sur les boutons toutes les 10 minutes. Dans mon cas, j'utilise GEA fibaro:call(fibaro:getSelfId(), "pressButton", "7") fibaro:call(fibaro:getSelfId(), "pressButton", "9") -- dodo pendant 10 minutes fibaro:sleep(10*60*1000) Pluie.vfib
  11. Steven

    Pluviomètre Hc2

    Excellent, cela semble fonctionner. Pour info, la connexion chez Netatmo est en Https qui n'est supporté que dans les scènes et non pas dans les Modules virtuels.
  12. Steven

    Pluviomètre Hc2

    Donc pour commencé, il faut comme annoncé un détecteur de pluie Netatmo qui va nous donner les quantités de pluie, ça c'est la partie facile. Ensuite il faut aller chercher chez Netatmo les derniers relevés de votre Station. Pour ceci, j'ai une petite scène qu'il faut importer chez vous puis modifier les 4 premières lignes. Pour pouvoir remplir ces 4 lignes, il vous faut un compte chez Netatmo : https://auth.netatmo.com/fr-FR/access/signup Voici le script. Je viens de le ré-ecrire en LUA pour ne plus avoir besoin de Google Script, soyez donc indulgent. Avant d'aller plus loin, tester ce script et donner moi votre retour car s'il marche chez personne d'autre que chez moi, je dois revenir a l'ancienne méthode qui est plus compliquée. local n_client_id = "11b1111d11111111111b111b" local n_client_secret = "lyZkHXRLMO8xShAAtmQhsCQM4U3djL08Zq1hUStbUJ4" local n_username = "______._____@_____.com" local n_password = "password" local hc2_module_virtuel = 135 -- on s'en fiche pour l'instant local debug = true -- ------------------------------------------------------------------------ -- NE PAS TOUCHER -- ------------------------------------------------------------------------ local token = "" local int_id = "" local ext_id = "" local ext_bat = 0 local rain_id = "" local rain_bat = 0 local temperature_interieure = -1000 local temperature_exterieure = -1000 local co2 = -1000 local humidite_interne = -1000 local humidite_externe = -1000 local pression = -1000 local bruit = -1000 local rains = {hour = -1000, day = -1000, week = -1000, month = -1000} -- ------------------------------------------------------------------------ -- Exécuté après chaque requète HTTP -- ------------------------------------------------------------------------ function afterHttpRequest() if (temperature_interieure > -1000) then end if (temperature_exterieure > -1000) then end if (co2 > -1000) then end if (humidite_interne > -1000) then end if (humidite_externe > -1000) then end if (pression > -1000) then end if (bruit > -1000) then end if (rains["hour"] > -1000) then end if (rains["day"] > -1000) then end if (rains["week"] > -1000) then end if (rains["month"] > -1000) then end end -- ------------------------------------------------------------------------ -- Affichage dans la console -- ------------------------------------------------------------------------ function log(message, force) force = force or false if (debug or force) then print(__convertToString(message)) end end -- ------------------------------------------------------------------------ -- Retourne le niveau de batterie en pourcent -- ------------------------------------------------------------------------ function calcBat(bat, ext) local max = 6000 local min = 4200 if (ext) then max = 6000 min = 3600 end if (bat > max) then bat = max end return math.floor(bat * 100 / max) end -- ------------------------------------------------------------------------ -- Arrondi -- ------------------------------------------------------------------------ local function roundToNthDecimal(num, n) local mult = 10^(n or 0) return math.floor(num * mult + 0.5) / mult end -- ------------------------------------------------------------------------ -- Interrogation de l'API -- ------------------------------------------------------------------------ function getResponseData(url, body, func) local http = net.HTTPClient() http:request(url, { options = { method = 'POST', headers = { ["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8" }, data = body }, success = function(response) func(json.decode(response.data)) afterHttpRequest() end, error = function(response) log(" ERROR !!! " .. url, true) end, }) end -- ------------------------------------------------------------------------ -- Mesures de l'unité interne -- ------------------------------------------------------------------------ function getMesuresInt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last", function(data) log("----------========== Module intérieur ==========----------") temperature_interieure = data.body[1].value[1][1] co2 = data.body[1].value[1][2] humidite_interne = data.body[1].value[1][3] pression = data.body[1].value[1][4] bruit = data.body[1].value[1][5] log("temperature_interieure = " .. temperature_interieure) log("co2 = " .. co2) log("humidite_interne = " .. humidite_interne) log("pression = " .. pression) log("bruit = " .. bruit) end ) end -- ------------------------------------------------------------------------ -- Mesure de l'unité externe -- ------------------------------------------------------------------------ function getMesuresExt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity&date_end=last", function(data) log("----------========== Module extérieur ==========----------") temperature_exterieure = data.body[1].value[1][1] humidite_externe = data.body[1].value[1][2] log("temperature_exterieure = " .. temperature_exterieure) log("humidite_externe = " .. humidite_externe) end ) end -- ------------------------------------------------------------------------ -- Mesure du détecteur de pluie historique -- ------------------------------------------------------------------------ function getMesuresRain(duree, scale, typescale, variable) local now = os.time(); getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale="..scale.."&type="..typescale.."&date_begin="..os.date("!%c", now - (duree)), function(data) log("----------========== Pluie histo ==========----------") local cumul = 0 for k, v in pairs(data.body) do for l, w in pairs(v.value) do cumul = cumul + w[1] end end cumul = roundToNthDecimal(cumul, 2) rains[variable] = cumul log("rain["..variable.."] = " .. rains[variable]) end ) end -- ------------------------------------------------------------------------ -- Obtention des informations sur les devices -- ------------------------------------------------------------------------ function getDevices() getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, function(data) log("----------========== D e v i c e s =========----------") for _, v in pairs(data.body.modules) do if (v.data_type[1] == "Rain") then rain_id = v._id rain_bat = calcBat(v.battery_vp, true) else ext_id = v._id ext_bat = calcBat(v.battery_vp, true) end end int_id = data.body.devices[1]._id getMesuresInt() getMesuresExt() --getMesuresRain1heure() if (rain_id ~= "") then getMesuresRain(1000 * 60 * 60, "max", "Rain", "hour") getMesuresRain(1000 * 60 * 60 * 24, "1hour", "sum_rain", "day") getMesuresRain(1000 * 60 * 60 * 24 * 7, "1day", "sum_rain", "week") getMesuresRain(1000 * 60 * 60 * 24 * 30, "1day", "sum_rain", "month") end end ) end -- ------------------------------------------------------------------------ -- Authentification -- ------------------------------------------------------------------------ function auth(nextFunction) local request_body = "grant_type=password&client_id=" .. n_client_id .. "&client_secret=" .. n_client_secret .. "&username=" .. n_username .. "&password=" .. n_password .. "&scope=read_station" getResponseData("https://api.netatmo.net/oauth2/token", request_body, function(data) token = data.access_token log(token) nextFunction() end ) end auth(getDevices) log("Last request : " .. os.date("%x - %X"), true)
  13. Steven

    Pluviomètre Hc2

    OK, je fourni tout cela demain. Info et module.
  14. Steven

    Support Gea

    CP_SALON doit être la première condition et être dans l'en-tête. Après c'est tout bon 😀
  15. Steven

    Pluviomètre Hc2

    Tu parles du module virtuel que j'utilise ?
  16. C'est impossible, en faisant ce genre d'URL, tu passes par la méthode GET alors que tu as besoin de faire du PUT avec en plus de l'authentification Tu a essayé de faire un curl, tu peux essayer cela curl -H 'Content-Type: application/json' -X PUT -d '{"value": "122Km", "isEnum":false}' http://admin:admin@IPXBOX/api/globalVariables/Test J'ai testé chez moi avec succès.
  17. "Pour faire des triggers" .. pas con du tout .. j'avais pas lu le code avec suffisamment d'attention. C'est une bonne idée . Au fait, j'avais pas fait attention qu'on était sur des VG bien différent .. méa culpa. A mon âge, plus les sleep son long mieux c'est Il y a pas de seek à ma connaissance, les seuls moyens sont soit de parcourir la table (bof), soit de la trier et en prendre les 2 extrémités : Exemple de code avec tri : -- Table simple de numéro --- local t1 = {10,25,30,5} table.sort(t1) for i = 1, #t1 do print(t1[i]) end -- table plus compliquée -- local t2 = { {index=10, nom="Dix"}, {index=2, nom="Deux"}, {index=5, nom="Cinq"}, {index=1, nom="Un"} } table.sort(t2, function(a, return a.index < b.index end) for i = 1, #t2 do print(t2[i].nom) end -- pour finir -- print("Min : " .. t2[1].nom) print("Max : " .. t2[#t2].nom)
  18. pour modifier une variable, tu dois faire un put sur http://admin:admin@I...globalVariables/Test et envoyé {"value": "122Km", "isEnum": false}
  19. Steven

    Support Gea

    @PIPT2 Pour la suppression du IF .. c'est ICI .. dans ton cas le {"Global!", ...} mis dans la partie action sans IF est juste ignoré car GEA ne le connais pas, il connait juste "Global" en tant qu'action. Comme "Global!" est une condition, il doit être dans un IF si tu le met dans les options (vieille méthode) ou sans le IF si tu le met côté conditions (nouvelle méthode). @pepite Tu peux mettre GEA.add( {100, 134, 162} , ..., {{"turnOff"}}) mais attention seul la première condition, soit le 100, sera utilisé pour le turnOff. J'ai encore pas mal de bug sur la réecriture mais j'aimerais pouvoir prendre en compte la demande suivante : GEA.add(.........., {{"turnOff", {100, 134}}} Enfin, j'avance mais à pas de fourmi car j'ai un réel manque de temps à la maison.
  20. @mprinfo Ligne 72 ? (le message me semble pas logique ) Ligne 30 ... remplacer le else par un end (si, si, je ne suis pas fou) J'ai pas bien compris l'utilité des tableaux Lever et Coucher ? Toutes les minutes tu vas parcourir ces 2 tableaux pour comperer l'heure du lever ou coucher avec les décalages du tableau. Donc dans le cas du lever, tu vas mettre 9 fois à jour la variable ? Ou alors, il faut adapter le tableau à nos besoins et dans ce cas, c'est juste pas très clair (ou j'ai pas tout suivis). A heure précises du lever ou coucher, la variable sera mise à jour 2x : une fois par LevelCoucher(...) et une fois par traitement(...) Une idée d'amélioration serait de mettre un fibaro:sleep() plus intelligent, çad si le lever et le coucher sont dans plus de 30mn alors faire un sleep de 30mn au lieu de 1mn. Allez
  21. En effet, le post de JoffAlf est plus ancien que celui de l'ancien.
  22. Steven

    Démarrage Automatique De Scène

    GEA n'est pas la réponse à tout et encore moins à ceux qui veulent apprendre le LUA. C'est uniquement un fois qu'on connait LUA qu'on peut dire : "Quel m.... je vais pas me prendre la tête avec ça, j'installe GEA"
  23. Non, non, c'est juste un moment de faiblesse que j'ai eu avec Did
  24. Steven

    Démarrage Automatique De Scène

    Il y a un bug ouvert chez Fibaro sur le countScene il me semble.
  25. Arg zut alors 😉
×
×
  • Créer...