Aller au contenu

Nikko

Membres confirmés
  • Compteur de contenus

    278
  • Inscription

  • Dernière visite

Réputation sur la communauté

92 Excellent

À propos de Nikko

  • Rang
    Membre passionné
  • Date de naissance 31/05/1980

Profile Information

  • Sexe :
    Homme
  • Ville :
    Tours
  • Box
    Home Center 2
  • Version
    4.101b

Visiteurs récents du profil

523 visualisations du profil
  1. Nikko

    Support Gea

    I don't have Danfoss LC13... Is this device battery powered ? In this case this device is sleeping most of time. The HC2 send order only at the the device's wakeup. That's a suggestion, maybe I'm wrong... You have to check in API if the order to adjust temperature is 'setValue': * http://homecenter_ip/api/devices/20 * Find actions and which order are allowed
  2. Nikko

    Support Gea

    Hi @basklj, I think a "s" is missing at the end of the "Day" parameter. :-) GEA.add(Home, 1, "", { {"Days", "Weekday"}, {"Time", "6:01", "8:00"}, {"Value", id["Library_therm"], 20}}) Nicolas
  3. Nikko

    Mon Test Jeedom

    @pepite , ne t'inquiètes pas pour l'ip ou la clé dans mon script ;-) Il n'est peut être pas nécessaire de passer par un virtuel. J'avoue que je débute encore et les solutions sont peut être nombreuses. Je préférais procéder de cette façon car au moins je sais que l'état qui s'affiche est quasi immédiat et correspond au véritable état. Nicolas
  4. Nikko

    Mon Test Jeedom

    Salut @pepite, Je ne sais pas si ça peut servir mais voilà comment je commande mes wallplug géré par mon HC2 via Jeedom: * Sur Jeedom, je crée via le plugin script les commandes On et Off du wallplug pour allumer et eteindre via l'api (ça à priroi c'est OK pour toi) * Ensuite je crée un virtuel pour le wallplug, avec le On, le Off , l'etat et la conso actuelle; Ce qui dans les grandes lignes donne ça: Au niveau propriétés cela donne ça: Le On utilise ma commande script d'allumage et le Off idem pour l'arret. Concernant le retour d'état, j'uilise un scene sur le HC2: --[[ %% properties 915 value 915 power 917 value 917 power 978 value 978 power %% events %% globals %% autostart --]] -- Flag Debug pour afficher dans les logs de la scene fibaro local debug = true local sourceTrigger = fibaro:getSourceTrigger() local JEEDOM = { IP = '192.168.100.200' , KEY = 'MU44RWMCaPasBZxLaYPBonNne9cLe' } -- -- Définitions des modules -- local MODULES = { -- WallPlug Lampe Oeuf [915] = { value = 953, power = 955, } , -- WallPlug Lampe Noire [917] = { value = 936, power = 937, } , -- WallPlug Ampli [978] = { value = 973, power = 977, } , } local idJeedom, property , value if (sourceTrigger['type'] == 'property') then property = sourceTrigger['propertyName'] value = fibaro:get(sourceTrigger['deviceID'], property) idJeedom = MODULES[sourceTrigger['deviceID']][property] if (debug) then fibaro:debug('ID HC2: '..sourceTrigger['deviceID']..' | Property: ' ..sourceTrigger['propertyName']..' | ID JEEDOM: '..idJeedom..' | Value: '..value) end local http = net.HTTPClient() response = http:request("http://"..JEEDOM['IP'].."/core/api/jeeApi.php?apikey="..JEEDOM['KEY'].."&type=virtual&id="..idJeedom.."&value="..value, { options={ method ='POST', ---timeout =5000 }, success = function(response) if debug then print('ACK ID '..sourceTrigger['deviceID']..'/'..idJeedom..' | Status: '..__convertToString(response.status)) end end, error = function(err) fibaro:debug("Error: " ..err) end }) elseif (sourceTrigger['type'] == 'other' or 'autostart') then print("Manual Trigger | Refresh Variable Status in Jeedom") for index in pairs(MODULES) do for k , v in pairs(MODULES[index]) do local value = fibaro:get(index, k) print('Module: '..index..' | Property: '..k..' | ID Jeedom: '..v.. ' | Value: '..value) local http = net.HTTPClient() response = http:request("http://"..JEEDOM['IP'].."/core/api/jeeApi.php?apikey="..JEEDOM['KEY'].."&type=virtual&id="..v.."&value="..value, { options={ method ='POST', ---timeout =5000 }, success = function(response) if debug then print('ACK ID '..index..'/'..v..' | Property: '..k..' | Status: '..__convertToString(response.status)) end end, error = function(err) fibaro:debug("Error: " ..err) end }) end end else print('No Matching Trigger') print(sourceTrigger['type']) end Pour faire simple: Dans l'entete tu met en déclencheur le value et power du wallplug (là j'ai 3 wallplug) Ensuite dans ma table MODULES je déclare quelle propriété du module va sur quelle id de jeedom; Exemple Mon Module Wallplug dont l'id est 978 sur mon HC2 met à jour l'id 973 de jeedom quand son état change (ce qui correpond à "Etat" dans ma première capture) et l'id 977 de jeedom pour la puissance. Au niveau HomeCenter, la scene est en automatique avec 10 instances. Comme ça au démarrage scene ou autre (ou démarrage manuel de la scene) , les variables sont de suite mises à jour. Tu peux meme au niveau Jeedom créee avec script une commandes qui déclenche la scene pour tout mettre à jour (au démarrage jeedom par exemple). A toi d'adapter pour un simple éclairage. Mes 2 cents.... Nicolas
  5. Nikko

    Backup Via Scene Lua

    @pepite: sous Windows (10 en tout cas mais à mon avis depuis bien longtemps), tu peux aussi le faire en ligne de commande avec certutil: Tu écris le couple login:pass sous un fichier infile.txt, mais sans espace ou CR à la fin Depuis un shell, dans le même répertoire que infile.txt: certutil -encode infile.txt outfile.txt Tu as ton ensemble en base 64 dans outfile.txt Et bien sûr le résultat est le même quel que soit l'OS: Bref des méthodes il en existe des tas ;-)
  6. Nikko

    Backup Via Scene Lua

    @pepite: Source: https://gist.github.com/bortels/1436940 local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -- encoding function enc(data) return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end print(enc('pepite@domotique-fibaro.fr:jolipassword'))
  7. Nikko

    Backup Via Scene Lua

    Bonjour Mise à jour: Suite au passage en 4.101 et plus, l'API a changé concernant les backups; voici donc un résumé en fonction des versions API pour Version < 4.101 BACKUP: URL: http://ip/api/settings/backups TYPE: POST DATA: action=create&description=monbackup HEADER: Content-type: application/x-www-form-urlencoded RESTORE: URL: http://ip/api/settings/backups TYPE: POST DATA: action=restore&id=1051 (par exemple) HEADER: Content-type: application/x-www-form-urlencoded DELETE: URL: http://ip/api/settings/backups?id=xxxx (xxx: id du backup) TYPE: DELETE DATA: id=xxxx HEADER: Content-type: application/x-www-form-urlencoded API pour Version >= 4.101 BACKUP: URL: http://ip/api/service/backups/ TYPE: POST DATA: {"action":"create","params":{"name":"Le descriptif de mon backup"}} HEADER: Content-type: application/x-www-form-urlencoded Authorization: Basic xxxxxxxxxxxxxxxx (mot de passe encodé en base64) RESTORE: URL: http://ip/api/service/backups/ TYPE: POST DATA: {"action":"restore","params":{"id":1054}} (1054 est un exemple) HEADER: Content-type: application/x-www-form-urlencoded Authorization: Basic xxxxxxxxxxxxxxxx (mot de passe encodé en base64) DELETE: URL: http://ip/api/service/backups/ TYPE: DELETE DATA: n/a HEADER: Authorization: Basic xxxxxxxxxxxxxxxx (mot de passe encodé en base64) Encodage Base64 Pour le couple login/password, ils doivent être encodés en base64; Pour ce faire: Sous linux: echo -n 'monlogin@fai.com:motdepasse' | base64 Sous windows: une scene en lua sur le HC2 : taper base64.lua sous google Le toolkit de @Krikroff (https://www.domotique-fibaro.fr/topic/239-hc2-toolkit-application-v1203/) Advanced RESTful client: faire une requete sur une url de l'api, le couple login/mdp sera demandé et sera affiché ensuite encodé. Exemple de Scènes Pour des requêtes externes, cela ne change pas vraiment. En revanche pour ceux qui comptent réaliser des scènes de backup/delete, ces requètes ne sont plus gérées pareil (avant en local, nous utilisions 127.0.0.1:11111 qui est géré par le process HCServer; maintenant il faut utiliser 127.0.0.1 et pointer sur un php) Donc pour les scènes lua, pas de api.post ou api.get et authentification nécessaire. Voici 2 scènes exemples; Les scène ne sont pas forcèment optimisées. Elles montrent juste l'utilisation de l'api Scène de Backup: performBackup.lua --[[ %% properties %% events %% globals --]] -- Message Descriptif du Backup local descriptif = 'Backup du '..os.date("%d/%m/%y - %HH%M") -- Password admin encodé en base64 local password = 'aWRpb3RAZ3Z1bGF2aWVyZ2UuY29tOnR1X3lfY3JveWFpc19oZWlu' local url = 'http://127.0.0.1/api/service/backups' local datas = '{"action":"create","params":{"name":"'..descriptif..'"}}' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 or tonumber(response.status) == 202then print("Backup Created at " .. os.date()) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/json', ["Authorization"] = 'Basic '..password }, data = datas } }); Scene d'effacement du backup le plus ancien: deleteBackup.lua --[[ %% properties %% events %% globals --]] -- Flag dryrun; Si true, la requete sur api pour effacer le backup n'est pas effectuée local dryrun = true -- Password admin encodé en base64 local password = 'aWRpb3RAZ3Z1bGF2aWVyZ2UuY29tOnR1X3lfY3JveWFpc19oZWlu' function sortBackup(data) local backups = json.decode(data) -- Vérification de présence Backup if (backups and type(backups == 'table') and #backups > 0) then if #backups > 1 then print(#backups .. ' Backups présents') else print('1 Backup présent') end for i in ipairs(backups) do fibaro:debug('ID: '..backups[i]['id']..' | TIMESTAMP: '..backups[i]['timestamp']..' | DESCRIPTION: '..backups[i]['description']) end else print('Pas de backup ou erreur lors de la récupération de la liste') fibaro:abort() end -- Pour chaque Backup on stock le timestamp de la date de réalisation dans une table -- On classe ensuite les timestamps par ordre croissant local timestamp = {} for i in ipairs(backups) do table.insert(timestamp, backups[i]['timestamp']) end table.sort(timestamp) -- Le 1er timestamp de la table est le plus petit donc le plus ancien en epochtime -- Dans la table de backup on recherche le backup ayant ce timestamp local id = false for i in ipairs(backups) do if (tonumber(backups[i]['timestamp']) == tonumber(timestamp[1])) then id = backups[i]['id'] end end if id then print("ID du backup le plus ancien: "..id) deleteBackup(id) else print("Erreur lors de la récupération de l'ID") fibaro:abort() end end function deleteBackup(id) -- Requete via API pour effacer le backup le plus ancien if (not dryrun) and (id) then print('Effacement du backup '..id..' en cours. Cela peut prendre 30s') local url = 'http://127.0.0.1/api/service/backups/'..id local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 200 then print("Backup deleted at " .. os.date()) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'DELETE', headers = { ["content-type"] = 'application/x-www-form-urlencoded;', ["authorization"] = 'Basic '..password }, data = 'id='..id } }) end end -- Récupération de la list des backups local GETClient = net.HTTPClient() if dryrun then print('Mode DryRun -> La requète pour effacer ne sera pas éxécutée') end GETClient:request('http://127.0.0.1/api/service/backups', { success = function(response) if tonumber(response.status) == 200 then sortBackup(response.data) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, headers = { ["content-type"] = 'application/x-www-form-urlencoded;', ["authorization"] = 'Basic '..password } }); Nicolas
  8. Bonjour, Suite aux soucis de certains avec "les boules bleues" lors de la mise à jour 4.100 vers 4.101 beta, voici une procédure qui permettra de réparer les dégats. Ma version est la 4.101, les commandes API sont donc legèrement différentes pour la version précédente. N'étant plus en 4.100, je ne peux pas les tester J'ai écris cette procédure en partant d'une base vérollée et au final ça marche. La méthode n'est peut être pas universelle et est à vos risques et périls. En cas de doute, s'abstenir MISE A JOUR: La procédure de mise à jour de la base de données est correcte si l'on veut rester en 4.101, mais si on veut rester en 4.100, les champs sont un peu différents. Je mets donc 2 fichiers à disposition, 1 pour la 4.100 et 1 pour la 4.101 Si on remet à jour une 4.100 avec le fichier de la 4.101, visiblement la bdd se corromt à nouveau et disparition du device 13 Quand est on concerné ? Mise à jour 4.100 -> 4.101 La box semble fonctionner mais l'accès à l'interface est impossible L'url http://ip/api/weather ne renvoie rien L'url http://ip/api/devices/3 ne renvoie rien un F12 lors de l'affichage de l'interface met en évidence une erreur javascript sur la propriété Temperature lors de l'appel de la fonction onWeatherDataBuild Quels sont les outils nécessaires ? SQLITEBROWSER, pour éditer/modifer la base de donnée: http://sqlitebrowser.org/ Le fichier texte sql qui est un fichier contenant les données à rajouter dans les tables: property_4100.sql property_4101.sql Un calculateur de checksum MD5, lorsque windows, par exemple winMD5Free http://www.winmd5.com/ ETAPE 1 : Le backup Réaliser un backup à l'aide de l'api. Pour ma part sous CHROME j'utilise Advenced RESTful Client. URL: http://homecenter/api/service/backups TYPE: POST CONTENT-TYPE: application/x-www-form-urlencoded Dans la partie RAW PAYLOAD, entrer: {"action":"create","params":{"name":"SQL HS"}} Attendre une minute puis vérifier l'id du backup en utilisant l'api: http://homecenter/api/service/backups Eteindre proprement le HomeCenter Prendre la clé USB et la brancher sur le PC Dans le répertoire backups\ se trouvent tous les backups réalisés par le HC2 Sélectionner le dernier réalisé et vérifier dans le fichier info que ce backup correspond à celui réalisé Copier maintenant tout ce répertoire sur votre PC (voire même toute la clé), afin d'avoir une sauvegarde en cas de problème ETAPE 2: Modification de la base de données Ouvrir SQLITEBROWSER Fichier / Ouvrir une base de données / Sélectionner dans le répertoire de backup le fichier nommé "sql" Fichier / Importer / Base de données à partir du fichier SQL Sélectionner le fichier de requète SQL: property_4100.sql property_4101.sql Au message "Voulez Vous Créer une base de donnée pour gérer les données importées", répondre NON Si l'import se passe bien on obtient le message Import terminé Fichier / Enregistrer les modifications Fichier / Quitter ETAPE 3: Correction Checksum Ouvrir WinMD5Free, et sélectionner le fichier sql modifié Au bout de quelques secondes le checksum apparait: Ouvrir le fichier checksum dans le répertoire de backup, et remplacer le checksum sur la ligne sql par celui calculé Démonter la clé, la rebrancher sur le HC2 et lancer le boot Attendre quelques minutes que le HomeCenter Démarre ETAPE 4: Restauration Backup Si il s'agit d'un recovery, au moment de sélectionner le backup, prendre le backup modifié Sinon, Il est possible d'utiliser l'api pour restaurer le backup: URL: http://homecenter/api/service/backups TYPE: POST CONTENT-TYPE: application/x-www-form-urlencoded Dans la partie RAW PAYLOAD, entrer: {"action":"restore","params":{"id":1054}} (l'id à entrer est celle du backup donc elle diffère) => Le backup est normallement en cours de restauration; cela peut prendre plusieurs minutes Nicolas
  9. Nikko

    Backup Via Scene Lua

    @971jmd, L'api ou l'utilisation de l'interface fibaro ne permet pas de le faire. Il existe des possibilités en ayant l'accès root sur la box, mais je ne m'étendrai pas sur le sujet
  10. Nikko

    Backup Via Scene Lua

    Salut, Le code fonctionne chez moi, mais comme je n'ai pas pu l'utiliser chez plusieurs personnes, j'ai mis une "sécurite": la variable dryrun. Si sur true le delete n'est pas executé si sur false le delete se fait. C'est justement pour vérifier que l'id retournée correspond bien au backup le plus ancien: ça évite de supprimer si erreur. as tu bein basculé le flag dans le script ?
  11. Nikko

    Backup Via Scene Lua

    Bonjour, Voici un résumé sur la réalisation/suppression de backups via des scènes en Lua. La création/suppression de backup s'effectue en temps normal sur l'interface du HomeCenter à la page Diagnostiques/Sauvegarde et restauration. Le code donné dons les 2 scènes n'est pas des plus optimisé; cela constitue juste une base. EDIT (03/12/2016): Mise à jour avec l'api pour les versions >=4.101; voir plus loin: (https://www.domotique-fibaro.fr/topic/8641-backup-via-scene-lua/?do=findComment&comment=146362) Les Commandes de l'API La récupération au format JSON de la liste des backups se fait à l'addresse http://HC2/api/settings/backups Pour Créer un Backup on utilise l'addresse http://HC2/api/settings/backups avec une requète de type en POST avec les paramètres action et description. Pour Supprimer un Backup, on utilise l'addresse http://HC2/api/settings/backups?id=xx (où xx est le numéro de backup). La requète est de type DELETE avec comme paramètre id=xx => Comme les urls de l'api vont être appelées depuis des scènes lua, l'ip de la box utilisée sera 127.0.0.1 (port 11111) => En cas d'appel sur l'ip LAN de la box (Ex: http://192.168.0.100/api/settings/backups) , il faudra en plus transmettre l'authentification dans la requète. Attention: Lors de la création de Backup, "tout le reste" est suspendu; de même après que le backup soit effectué, le moteur Z-Wave et d'autres services redémarrent. Donc en cas de planification , privilégier la nuit, là ou l'activité ZWave, scénarios, est faible/inexistante. Scène de création d'un backup Exemple de Scène de création d'un Backup, avec notification vers portable: --[[ %% properties %% events %% globals --]] -- ID des mobiles,tablettes pour notification local portable = { 385,378 } -- Message Descriptif du Backup local descriptif = 'Backup du '..os.date("%d/%m/%y - %HH%M") function sendPush(message) if #portable > 0 then for _,v in ipairs(portable) do fibaro:call(v,'sendPush', message) end end end local url = 'http://127.0.0.1:11111/api/settings/backups' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 then print("Backup Created at " .. os.date()) sendPush(descriptif .. ' effectué') else print("Error " .. response.status) sendPush('Erreur lors de la création du Backup') end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'action=create&description='..descriptif } }); Depuis la page des backups, on peut vérifier que la scène fonctionne: Pour les utilisateurs de GEA, on peut déclencher cette sauvegarde le 1er samedi de chaque mois par exemple: -- Fonction déterminant si nous sommes le 1er samedi du mois function isFirstSaturday() local t = os.date('*t') return ( t['day'] < 8 and t['wday'] == 7 ) end -- Backup le 1er samedi du mois GEA.add({"Function",function() return isFirstSaturday() end} , 30 , "Backup Mensuel du HC2" , {{"Time","01:00","01:01"},{"Scenario", 12}}) . Scène de suppression d'un backup Exemple de Scene Lua pour réaliser la suppression du backup le plus ancien: --[[ %% properties %% events %% globals --]] -- Flag dryrun; Si true, la requete sur api pour effacer le backup n'est pas effectuée local dryrun = true -- Récupération de la list des backups local backups = api.get('/settings/backups') -- Vérification de présence Backup if (backups and type(backups == 'table') and #backups > 0) then if #backups > 1 then print(#backups .. ' Backups présents') else print('1 Backup présent') end for i in ipairs(backups) do fibaro:debug('ID: '..backups[i]['id']..' | TIMESTAMP: '..backups[i]['timestamp']..' | DESCRIPTION: '..backups[i]['description']) end else print('Pas de backup ou erreur lors de la récupération de la liste') fibaro:abort() end -- Pour chaque Backup on stock le timestamp de la date de réalisation dans une table -- On classe ensuite les timestamps par ordre croissant local timestamp = {} for i in ipairs(backups) do table.insert(timestamp, backups[i]['timestamp']) end table.sort(timestamp) -- Le 1er timestamp de la table est le plus petit donc le plus ancien en epochtime -- Dans la table de backup on recherche le backup ayant ce timestamp local id = false for i in ipairs(backups) do if (tonumber(backups[i]['timestamp']) == tonumber(timestamp[1])) then id = backups[i]['id'] end end if id then print("ID du backup le plus ancien: "..id) else print("Erreur lors de la récupération de l'ID") fibaro:abort() end -- Requete via API pour effacer le backup le plus ancien if not dryrun then local url = 'http://127.0.0.1:11111/api/settings/backups?id='..id local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 200 then print("Backup deleted at " .. os.date()) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'DELETE', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'id='..id } }); end . Cette Scène produit le debug suivant: Nicolas
  12. Nikko

    Support Gea

    @olinet: Il faut utiliser Inverse: GEA.add(id["Porte_Bu"], -1, "" ,{{"Inverse"},{"turnOff", id["Lum_Bu"]}})
  13. Nikko

    Support Gea

    @jompa68: If you want to send a push when the plug is turning off you should use Inverse in Parameters: -- Send a Push when TurnOff GEA.add(id["kaffebryggare"], -1, "Plug turned off", {{"Inverse"},{"Portable", id["iPhoneJonny"]},{"Portable", id["iPhoneMona"]}})
  14. Nikko

    Support Gea

    @Jompa68: power+ isn't a condition. You have to write: GEA.add({"Sensor+", id["kaffebryggare"], 50}, 40*60, "", {{"turnOff", id["kaffebryggare"]}}) Moreover you have to chek your id and GEA.isVersionFour Nicolas
  15. Nikko

    Support Gea

    Et les espaces avant absent et present tu veux pas les enlever car c'est moyen....(l12 et l17). En lua " Present" est différent de "Present". (Dans ton post précédent) EDIT: --[[ %% autostart %% properties %% globals Maison --]] --- LOCAL Maison local estPresent = {"Global", "Maison", "Present"} local estAbsent = {"Global", "Maison", "Absent"} GEA.add({id["PORTE_ENTREE"], estPresent}, -1, "Porte entrée fermé le #date# à #time#", {{"Inverse"}, {"Portable", MobileId["PHONE_BERNARD"]}}) Non Ici c'est id["PORTE_ENTREE"] le déclencheur pas ta VG donc dans l'entete tu dois avoir xx value où xx est l'id porte entree...
×