Moicphil Posté(e) le 17 mars 2014 Signaler Posté(e) le 17 mars 2014 Notifications via Pushover Présentation de ce service de notification et comment l'utiliser avec la HC2 ou la HC Lite. Comme Prowl par exemple pour les devices Apple, Pushover est un service de notification pour les devices Android et ios. Il existe donc une application dédiée payante (env.4€ ) disponible sur : - Le PlayStore, ici : https://play.google.com/store/apps/details?id=net.superblock.pushover&hl=fr - L'apple-Store, ici :https://itunes.apple.com/us/app/pushover-notifications/id506088175?ls=1&mt=8 L’intérêt d'utiliser une application comme celle-ci est d'avant tout de s'affranchir d'un éventuel problème de serveur voir de doubler les notifications Fibaro/Pushover. Le service Pushover autorise l'envoi de 7500 Push par mois...ça laisse de quoi faire...mais pous pouvez augmenter la capacité d'envoi ( payant ) De même, vous pouvez suivre le nombre de push envoyé par mois... Autre avantage, des plugins existent, comme IFTTT, e-mail gateway, github...etc...et permet donc de tout "centraliser" vers un unique service. Pour commencer, il va falloir créer un compte sur https://pushover.net/ Une fois le compte créé et validé, Cliquer sur "Apps et Plugins" puis "Create new application" : ( Vous pouvez créer autant "d'applications" que vous le souhaitez. ) -Donner un nom à votre application ( par exemple "push vers hc2" ) -Sélectionner le Type : "application" -Choisir un icone si vous le souhaitez, il s'affichera sur votre device lors du Push Maintenant que l'application est créée, vous devriez voir la "clef" : Cette clef est importante, elle servira de "lien" entre Pushover et la HC2 Lancer l'application sur votre ou vos devices et saisir les identifiants Pushover. - Paramétrer l'application selon votre besoin... - Vérifier la présence de la clef user ( identique à celle sur "pushover.net" ) Maintenant "revenez" sur la page d’accueil de Pushover...vous devriez voir votre ou vos devices ainsi que votre "Clef User" Cette clef est aussi importante que la précédente... Passons du coté HC2... Créer un nouveau Périphérique Virtuel - Donner un nom, emplacement. - Adresse Ip : saisir : 184.154.74.158 ( correspondant aux serveurs Pushover ) - Port : 80 - Cliquer sur "avancé" et ajouter un ( ou des ) "bouton" -Donner un nom au bouton et cocher "String" puis "coller" le code ci dessous : POST /1/messages.json?token=atyZzxxxxxxxxxxxxxxFJLtHE&user=72ZqHxxxxxxxxxxxxxxDShVwZ&message=ALARME+JOUR+ACTIVEE&priority=0&sound=gamelan HTTP/1.1 Host: api.pushover.net 0x0D0x0A - Remplacer les clefs "Token" et "User" par les vôtres - Modifier le message selon la notification désirée ( bien laisser les "+", remplace les "espaces" ) - Saisir une "priorité" (-1 / 0 / 1 / 2 ) - Choisir un son de notification ( voir Api ) La Fonction de "priorité" est vraiment essentielle pour moi... Elle permet, en fonction du degré d'urgence, de forcer un acquittement via l'application du device, de forcer le son du téléphone même si celui-ci est en silencieux. Utile dans le cas d'une intrusion ou alarme incendie par exemple. Vous pouvez aussi définir des horaires de mise en "silence", utile si vous ne souhaitez pas recevoir un push en pleine nuit...seul les push "emergency" seront actifs. Le service dispose d'une Api ... Elle est disponible ici : https://pushover.net/api Vous y trouverez tous les sons disponibles ainsi que les autres requêtes et fonctions disponibles via des plugins. Si vous avez des questions, n’hésitez pas... 4
Fredric Posté(e) le 19 mars 2014 Signaler Posté(e) le 19 mars 2014 bonjour Phil, ton tuto tombe à point, les notifications Fibaro ne fonctionnent plus. (chez moi en tous cas ) j'ai vraiment suivit ton tuto à la virgule mais cela ne marche pas. logiquement, le fait que fibaro est un problème avec les notification ne joue en rien sur pushhover!! j'ai pas trouvé le moyen de faire un test autrement que par la box, je ne connaissais pas pushover. 2
Moicphil Posté(e) le 19 mars 2014 Auteur Signaler Posté(e) le 19 mars 2014 Je confirme que Pushover fonctionne correctement. Vois tu ton device sur la page d'accueil de pushover ? As tu configuré l'application ? 1
Fredric Posté(e) le 19 mars 2014 Signaler Posté(e) le 19 mars 2014 oui oui, là je suis sur de mon coup, je suis pas fort en Lua mais là , c'est mon domaine en fait, je pensé que le problème de notification venait d'une de mais bêtises, j'ai fait des modif avec l'alarme activé est j'ai pu déjà constater que la HC n'aime pas ça. donc dans la foulé j'ai essayé plein de chose est elle à pas aimé la bête!! mais ce matin, tous va mieux, sauf les notifications, je vais réessayer. je me posé juste la question, l'envoi de requête à pushover est-elle similaire à l'envoi d'une requête notification Fibaro. ce qui pourrait expliquer que cela n'a pas fonctionné hier soir, en même temps, hier soir, il y avait pas grand chose qui fonctionné si non, je vois bien mes Iphones dans mon compte et j'ai paramétré à la lettre ton tuto, donc le problème vient d’ailleurs. je retente ce soir car là , je boss (enfin......tout le monde le pense ) merci Phil 1
Moicphil Posté(e) le 19 mars 2014 Auteur Signaler Posté(e) le 19 mars 2014 Verifie juste la clef user dans l'application... 1
Fredric Posté(e) le 19 mars 2014 Signaler Posté(e) le 19 mars 2014 je te tiens au courant, est tu as vraiment raison, il faut pas mètre ces Å“ufs dans le même panier. la preuve...... 1
Yohan Posté(e) le 19 mars 2014 Signaler Posté(e) le 19 mars 2014 Merci Phil pour le Tuto. Tu l'utilises uniquement pour le HC2 ou pour autre chose ? 1
Fredric Posté(e) le 26 mars 2014 Signaler Posté(e) le 26 mars 2014 voila phil, ça fonctionne. juste un petit soucis, le réglage des priorités, je fais des test pour que cela sonne même en vibreur et cela ne marche pas. avec -1 / 0 / 1 ou 2 , pas de son en vibreur et si j’enlève le vibreur et que je coupe le son, là , j'ai du son, peu importe le réglage que j'ai entré. tu utilise IOS ou Android? 1
Moicphil Posté(e) le 26 mars 2014 Auteur Signaler Posté(e) le 26 mars 2014 Android, bizarre ce que tu me dis..
Fredric Posté(e) le 26 mars 2014 Signaler Posté(e) le 26 mars 2014 lol, je suis en train de jouer avec les sons, c'est cool, par ce que le problème des push, on ne sais jamais ce que c'est à l'oreille, il faut regarder, alors qu'avec ça, on met le son qu'on veux et on arrête de psychoter des que le tel sonne. en fait, si je met 2, je reçois même pas le push, ça marche que avec 0 et 1. et aucune différence entre les deux, j'ai trouvé dans l'API, c'est exactement ce que tu as mis, je verrai demain maintenant. bravo pour la Tuto
Fredric Posté(e) le 26 mars 2014 Signaler Posté(e) le 26 mars 2014 je suis sous ios 7.1 "To send an emergency-priority notification, the priority parameter must be set to 2 and the retry and expire parameters must be supplied." Je pense que c'est pour ça que cela ne marche pas, il faut d'autre paramètre avec la priorité 2: En fait, la priorité 0 fonctionne, mais justement, il envoi pas de sons, juste une notification sur l'icone de Pushover (si l'option est paramétré dans l'application), donc c'est pratique pour les info que l'on veut seulement voir sans être importuné. en tout cas, c'est super pratique
JM13 Posté(e) le 6 avril 2014 Signaler Posté(e) le 6 avril 2014 il y a aussi http://www.livenotifier.net/ que j'utilise et qui marche très bien.(et le tuto pourrait être le même). Il y a juste quelques petites différences : - Pas de gestion des sons - Pas de priorités mais - On peut envoyer un petite image - marche avec le compte Google - Pas de limite en nombre de push Dans notre cas (domotique) la petite image est sympa car on peut mettre avec le texte l'image de l'arrosage, de la boite aux lettres, ...et autres
Fredric Posté(e) le 7 avril 2014 Signaler Posté(e) le 7 avril 2014 Pouvoir mettre un son différent, Pushover, c'est vraiment cool. avec les push normale, je sauté sur mon tel dés qu'il sonné, de peur que ce soit l'arme,ou j'étais obligé d'avoir mon iphone sous les yeux quand j'activais l’alarme pour voir si elle c’était bien activé ou si une fenêtre était resté ouverte, maintenant, quand je mets l'alarme, je sort même plus mon téléphone de la poche, je lui fait emmètre un son bien spécifique pour le mise sous tension, pour la désactivation, si une fenêtre est resté ouverte et si l'alarme se déclenche. 1
Moicphil Posté(e) le 7 avril 2014 Auteur Signaler Posté(e) le 7 avril 2014 Oui, tu as raison Fredric, pareil que toi, je me fie au son sans regarder le téléphone... Et juste pour info, il est aussi possible aussi d'affecter une image dédiée par notif !
Fredric Posté(e) le 7 avril 2014 Signaler Posté(e) le 7 avril 2014 (modifié) Oui, tu as raison Fredric, pareil que toi, je me fie au son sans regarder le téléphone... Et juste pour info, il est aussi possible aussi d'affecter une image dédiée par notif ! oh, j'ai pas vu je regarde ça dés que je rentre Modifié le 7 avril 2014 par moicphil Merci de ne pas citer le message précédent
Steven Posté(e) le 7 avril 2014 Signaler Posté(e) le 7 avril 2014 Sympa ... par contre moi je reste avec PushingBox rien que pour la compatibilité avec les Karotz
Fredric Posté(e) le 7 avril 2014 Signaler Posté(e) le 7 avril 2014 oups, désolé Phil, je ne sais même pas pourquoi j'ai fait ça vu que ton post était juste au dessus
darklite44 Posté(e) le 23 avril 2014 Signaler Posté(e) le 23 avril 2014 Bonsoir, Y'aurait t'il un moyen de créer un bouton générique qui viendrait lire le texte stocké dans une variable plutôt de définir autant de boutons que de messages à envoyer ?
Steven Posté(e) le 23 avril 2014 Signaler Posté(e) le 23 avril 2014 Si tu as la possibilité de faire appel au LUA, oui. Regarde le tuto de Rocketlud http://domotique-info.fr/2014/04/notification-vocal-hc2-vers-nabaztag/ Il effectue exactement ce que tu demandes mais au lieu de faire du pushover, il fait parler son lapin.
Moicphil Posté(e) le 23 avril 2014 Auteur Signaler Posté(e) le 23 avril 2014 Oui, c'est ce que je fais d'ailleurs en utilisant le toolkit de JC -Créer une variable "pushover" -Créer un (ou plusieurs boutons pour des sons différents) avec ces lignes Modifier les dernières lignes du codes avec les identifiants pushover ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- Toolkit Framework, lua library extention for HC2, hope that it will be useful. -- This Framework is an addon for HC2 Toolkit application in a goal to aid the integration. -- Tested on Lua 5.1 with Fibaro HC2 3.572 beta -- -- Version 1.0.2 [12-13-2013] -- -- Use: Toolkit or Tk shortcut to access Toolkit namespace members. -- -- Example: -- Toolkit:trace("value is %d", 35); or Tk:trace("value is %d", 35); -- Toolkit.assertArg("argument", arg, "string"); or Tk.assertArg("argument", arg, "string"); -- -- current release: http://krikroff77.github.io/Fibaro-HC2-Toolkit-Framework/ -- latest release: https://github.com/Krikroff77/Fibaro-HC2-Toolkit-Framework/releases/latest -- -- Memory is preserved: The code is loaded only the first time in a virtual device -- main loop and reloaded only if application pool restarded. -- -- Copyright (C) 2013 Jean-Christophe Vermandé -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- at your option) any later version. ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- if not Toolkit then Toolkit = { __header = "Toolkit", __version = "1.0.2", __luaBase = "5.1.0", __copyright = "Jean-Christophe Vermandé", __licence = [[ Copyright (C) 2013 Jean-Christophe Vermandé This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses></http:>. ]], __frameworkHeader = (function(self) self:traceEx("green", "-------------------------------------------------------------------------"); self:traceEx("green", "-- HC2 Toolkit Framework version %s", self.__version); self:traceEx("green", "-- Current interpreter version is %s", self.getInterpreterVersion()); self:traceEx("green", "-- Total memory in use by Lua: %.2f Kbytes", self.getCurrentMemoryUsed()); self:traceEx("green", "-------------------------------------------------------------------------"); end), -- chars chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", -- hex hex = "0123456789abcdef", -- now(), now("*t", 906000490) -- system date shortcut now = os.date, -- toUnixTimestamp(t) -- t (table) - {year=2013, month=12, day=20, hour=12, min=00, sec=00} -- return Unix timestamp toUnixTimestamp = (function(t) return os.time(t) end), -- fromUnixTimestamp(ts) -- ts (string/integer) - the timestamp -- Example : fromUnixTimestamp(1297694343) -> 02/14/11 15:39:03 fromUnixTimestamp = (function(s) return os.date("%c", ts) end), -- currentTime() -- return current time currentTime = (function() return tonumber(os.date("%H%M%S")) end), -- comparableTime(hour, min, sec) -- hour (string/integer) -- min (string/integer) -- sec (string/integer) comparableTime = (function(hour, min) return tonumber(string.format("%02d%02d%02d", hour, min, sec)) end), -- isTraceEnabled -- (boolean) get or set to enable or disable trace isTraceEnabled = true, -- isAutostartTrigger() isAutostartTrigger = (function() local t = fibaro:getSourceTrigger();return (t["type"]=="autostart") end), -- isOtherTrigger() isOtherTrigger = (function() local t = fibaro:getSourceTrigger();return (t["type"]=="other") end), -- raiseError(message, level) -- message (string) - message -- level (integer) - level raiseError = (function(message, level) error(message, level); end), -- colorSetToRgbwTable(colorSet) -- colorSet (string) - colorSet string -- Example: local r, g, b, w = colorSetToRgbwTable(fibaro:getValue(354, "lastColorSet")); colorSetToRgbw = (function(self, colorSet) self.assertArg("colorSet", colorSet, "string"); local t, i = {}, 1; for v in string.gmatch(colorSet,"(%d+)") do t[i] = v; i = i + 1; end return t[1], t[2], t[3], t[4]; end), -- isValidJson(data, raise) -- data (string) - data -- raise (boolean)- true if must raise error -- check if json data is valid isValidJson = (function(self, data, raise) self.assertArg("data", data, "string"); self.assertArg("raise", raise, "boolean"); if (string.len(data)>0) then if (pcall(function () return json.decode(data) end)) then return true; else if (raise) then self.raiseError("invalid json", 2) end; end end return false; end), -- assert_arg(name, value, typeOf) -- (string) name: name of argument -- (various) value: value to check -- (type) typeOf: type used to check argument assertArg = (function(name, value, typeOf) if type(value) ~= typeOf then Tk.raiseError("argument "..name.." must be "..typeOf, 2); end end), -- trace(value, args...) -- (string) value: value to trace (can be a string template if args) -- (various) args: data used with template (in value parameter) trace = (function(self, value, ...) if (self.isTraceEnabled) then if (value~=nil) then return fibaro:debug(string.format(value, ...)); end end end), -- traceEx(value, args...) -- (string) color: color use to display the message (red, green, yellow) -- (string) value: value to trace (can be a string template if args) -- (various) args: data used with template (in value parameter) traceEx = (function(self, color, value, ...) self:trace(string.format('<%s style="color:%s;">%s</%s>', "span", color, string.format(value, ...), "span")); end), -- getInterpreterVersion() -- return current lua interpreter version getInterpreterVersion = (function() return _VERSION; end), -- getCurrentMemoryUsed() -- return total current memory in use by lua interpreter getCurrentMemoryUsed = (function() return collectgarbage("count"); end), -- trim(value) -- (string) value: the string to trim trim = (function(s) Tk.assertArg("value", s, "string"); return (string.gsub(s, "^%s*(.-)%s*$", "%1")); end), -- filterByPredicate(table, predicate) -- table (table) - table to filter -- predicate (function) - function for predicate -- Description: filter a table using a predicate -- Usage: -- local t = {1,2,3,4,5}; -- local out, n = filterByPredicate(t,function(v) return v.item == true end); -- return out -> {2,4}, n -> 2; filterByPredicate = (function(table, predicate) Tk.assertArg("table", table, "table"); Tk.assertArg("predicate", predicate, "function"); local n, out = 1, {}; for i = 1,#table do local v = table[i]; if (v~=nil) then if predicate(v) then out[n] = v; n = n + 1; end end end return out, #out; end) };Toolkit:__frameworkHeader();Tk=Toolkit; end; ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- Toolkit.Debug library extention -- Provide help to trace and debug lua code on Fibaro HC2 -- Tested on Lua 5.1 with HC2 3.572 beta -- -- Copyright 2013 Jean-christophe Vermandé -- -- Version 1.0.1 [12-12-2013] ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- if not Toolkit.Debug then Toolkit.Debug = { __header = "Toolkit.Debug", __version = "1.0.1", -- The os.clock function returns the number of seconds of CPU time for the program. __clocks = {["fragment"]=os.clock(), ["all"]=os.clock()}, -- benchmarkPoint(name) -- (string) name: name of benchmark point benchmarkPoint = (function(self, name) __clocks[name] = os.clock(); end), -- benchmark(message, template, name, reset) -- (string) message: value to display, used by template -- (string) template: template used to diqplay message -- (string) name: name of benchmark point -- (boolean) reset: true to force reset clock benchmark = (function(self, message, template, name, reset) Toolkit.assertArg("message", message, "string"); Toolkit.assertArg("template", message, "string"); if (reset~=nil) then Toolkit.assertArg("reset", reset, type(true)); end Toolkit:traceEx("yellow", "Benchmark ["..message.."]: ".. string.format(template, os.clock() - self.__clocks[name])); if (reset==true) then self.__clocks[name] = os.clock(); end end) }; Toolkit:traceEx("red", Toolkit.Debug.__header.." loaded in memory..."); -- benchmark code if (Toolkit.Debug) then Toolkit.Debug:benchmark(Toolkit.Debug.__header.." lib", "elapsed time: %.3f cpu secs\n", "fragment", true); end ; end; ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- Toolkit.Net library extention -- Toolkit.Net.HttpRequest provide http request with advanced functions -- Tested on Lua 5.1 with HC2 3.572 beta -- -- Copyright 2013 Jean-christophe Vermandé -- Thanks to rafal.m for the decodeChunks function used when reponse body is "chunked" -- http://en.wikipedia.org/wiki/Chunked_transfer_encoding -- -- Version 1.0.3 [12-13-2013] ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- if not Toolkit then error("You must add Toolkit", 2) end if not Toolkit.Net then Toolkit.Net = { -- private properties __header = "Toolkit.Net", __version = "1.0.3", __cr = string.char(13), __lf = string.char(10), __crLf = string.char(13, 10), __host = nil, __port = nil, -- private methods __trace = (function(v, ...) if (Toolkit.Net.isTraceEnabled) then Toolkit:trace(v, ...) end end), __writeHeader = (function(socket, data) assert(tostring(data) or data==nil or data=="", "Invalid header found: "..data); local head = tostring(data); socket:write(head..Toolkit.Net.__crLf); Toolkit.Net.__trace("%s.%s::request > Add header [%s]", Toolkit.Net.__header, Toolkit.Net.__Http.__header, head); end), __decodeChunks = (function(a) resp = ""; line = "0"; lenline = 0; len = string.len(a); i = 1; while i<=len do c = string.sub(a, i, i); if (lenline==0) then if (c==Toolkit.Net.__lf) then lenline = tonumber(line, 16); if (lenline==null) then lenline = 0; end line = 0; elseif (c==Toolkit.Net.__cr) then lenline = 0; else line = line .. c; end else resp = resp .. c; lenline = lenline - 1; end i = i + 1; end return resp; end), __readHeader = (function(data) if data == nil then error("Couldn't find header"); end local buffer = ""; local headers = {}; local i, len = 1, string.len(data); while i<=len do local a = data:sub(i,i) or ""; local b = data:sub(i+1,i+1) or ""; if (a..b == Toolkit.Net.__crLf) then i = i + 1; table.insert(headers, buffer); buffer = ""; else buffer = buffer..a; end i = i + 1; end return headers; end), __readSocket = (function(socket) local err, len = 0, 1; local buffer, data = "", ""; while (err==0 and len>0) do data, err = socket:read(); len = string.len(data); buffer = buffer..data; end return buffer, err; end), __Http = { __header = "HttpRequest", __version = "1.0.3", __tcpSocket = nil, __timeout = 250, __waitBeforeReadMs = 25, __isConnected = false, __isChunked = false, __url = nil, __method = "GET", __headers = {}, __body = nil, __authorization = nil, -- Toolkit.Net.HttpRequest:setBasicAuthentication(username, password) -- Sets basic credentials for all requests. -- username (string) – credentials username -- password (string) – credentials password setBasicAuthentication = (function(self, username, password) Toolkit.assertArg("username", username, "string"); Toolkit.assertArg("password", password, "string"); --see: http://en.wikipedia.org/wiki/Basic_access_authentication self.__authorization = Toolkit.Crypto.Base64:encode(tostring(username..":"..password)); end), -- Toolkit.Net.HttpRequest:setBasicAuthenticationEncoded(base64String) -- Sets basic credentials already encoded. Avoid direct exposure for information. -- base64String (string) - username and password encoded with base64 setBasicAuthenticationEncoded = (function(self, base64String) Toolkit.assertArg("base64String", base64String, "string"); self.__authorization = base64String; end), -- Toolkit.Net.HttpRequest:setWaitBeforeReadMs(ms) -- Sets ms -- ms (integer) – timeout value in milliseconds setWaitBeforeReadMs = (function(self, ms) Toolkit.assertArg("ms", ms, "integer"); self.__waitBeforeReadMs = ms; Toolkit.Net.__trace("%s.%s::setWaitBeforeReadMs > set to %d ms", Toolkit.Net.__header, Toolkit.Net.__Http.__header, ms); end), -- Toolkit.Net.HttpRequest.getWaitBeforeReadMs() -- Returns the value in milliseconds getWaitBeforeReadMs = (function(self) return self.__waitBeforeReadMs; end), -- Toolkit.Net.HttpRequest.setReadTimeout(ms) -- Sets timeout -- ms (integer) – timeout value in milliseconds setReadTimeout = (function(self, ms) Toolkit.assertArg("ms", ms, "number"); self.__timeout = ms; Toolkit.Net.__trace("%s.%s::setReadTimeout > Timeout set to %d ms", Toolkit.Net.__header, Toolkit.Net.__Http.__header, ms); end), -- Toolkit.Net.HttpRequest.getReadTimeout() -- Returns the timeout value in milliseconds getReadTimeout = (function(self) return self.__timeout; end), -- Toolkit.Net.HttpRequest:disconnect() -- Disconnect the socket used by httpRequest disconnect = (function(self) self.__tcpSocket:disconnect(); self.__isConnected = false; Toolkit.Net.__trace("%s.%s::disconnect > Connected: %s", Toolkit.Net.__header, Toolkit.Net.__Http.__header, tostring(self.__isConnected)); end), -- Toolkit.Net.HttpRequest:request(method, uri, headers, body) -- method (string) - method used for the request -- uri (string) - uri used for the request -- headers (table) - headers used for the request (option) -- body (string) - data sent with the request (option) request = (function(self, method, uri, headers, body) -- validation Toolkit.assertArg("method", method, "string"); assert(method=="GET" or method=="POST" or method=="PUT" or method=="DELETE"); assert(uri~=nil or uri==""); self.__isChunked = false; self.__tcpSocket:setReadTimeout(self.__timeout); self.__url = uri; self.__method = method; self.__headers = headers or {}; self.__body = body or nil; local p = ""; if (Toolkit.Net.__port~=nil) then p = ":"..tostring(Toolkit.Net.__port); end local r = self.__method.." ".. self.__url .." HTTP/1.1"; Toolkit.Net.__trace("%s.%s::request > %s with method %s", Toolkit.Net.__header, Toolkit.Net.__Http.__header, self.__url, self.__method); local h = "Host: "..Toolkit.Net.__host .. p; -- write to socket headers method a host! Toolkit.Net.__writeHeader(self.__tcpSocket, r); Toolkit.Net.__writeHeader(self.__tcpSocket, h); -- add headers if needed for i = 1, #self.__headers do Toolkit.Net.__writeHeader(self.__tcpSocket, self.__headers[i]); end if (self.__authorization~=nil) then Toolkit.Net.__writeHeader(self.__tcpSocket, "Authorization: Basic "..self.__authorization); end -- add data in body if needed if (self.__body~=nil) then Toolkit.Net.__writeHeader(self.__tcpSocket, "Content-Length: "..string.len(self.__body)); Toolkit.Net.__trace("%s.%s::request > Body length is %d", Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(self.__body)); end self.__tcpSocket:write(Toolkit.Net.__crLf..Toolkit.Net.__crLf); -- write body if (self.__body~=nil) then self.__tcpSocket:write(self.__body); end -- sleep to help process fibaro:sleep(self.__waitBeforeReadMs); -- wait socket reponse local result, err = Toolkit.Net.__readSocket(self.__tcpSocket); Toolkit.Net.__trace("%s.%s::receive > Length of result: %d", Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(result)); -- parse data local response, status; if (string.len(result)>0) then local _flag = string.find(result, Toolkit.Net.__crLf..Toolkit.Net.__crLf); local _rawHeader = string.sub(result, 1, _flag + 2); if (string.len(_rawHeader)) then status = string.sub(_rawHeader, 10, 13); Toolkit.Net.__trace("%s.%s::receive > Status %s", Toolkit.Net.__header, Toolkit.Net.__Http.__header, status); Toolkit.Net.__trace("%s.%s::receive > Length of headers reponse %d", Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(_rawHeader)); __headers = Toolkit.Net.__readHeader(_rawHeader); for k, v in pairs(__headers) do --Toolkit.Net.__trace("raw #"..k..":"..v) if (string.find(string.lower( v or ""), "chunked")) then self.__isChunked = true; Toolkit.Net.__trace("%s.%s::receive > Transfer-Encoding: chunked", Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(result)); end end end local _rBody = string.sub(result, _flag + 4); --Toolkit.Net.__trace("Length of body reponse: " .. string.len(_rBody)); if (self.__isChunked) then response = Toolkit.Net.__decodeChunks(_rBody); err = 0; else response = _rBody; err = 0; end end -- return budy response return response, status, err; end), -- Toolkit.Net.HttpRequest.version() -- Return the version version = (function() return Toolkit.Net.__Http.__version; end), -- Toolkit.Net.HttpRequest:dispose() -- Try to free memory and resources dispose = (function(self) if (self.__isConnected) then self.__tcpSocket:disconnect(); end self.__tcpSocket = nil; self.__url = nil; self.__headers = nil; self.__body = nil; self.__method = nil; if pcall(function () assert(self.__tcpSocket~=Net.FTcpSocket) end) then Toolkit.Net.__trace("%s.%s::dispose > Successfully disposed", Toolkit.Net.__header, Toolkit.Net.__Http.__header); end -- make sure all free-able memory is freed collectgarbage("collect"); Toolkit.Net.__trace("%s.%s::dispose > Total memory in use by Lua: %.2f Kbytes", Toolkit.Net.__header, Toolkit.Net.__Http.__header, collectgarbage("count")); end) }, -- Toolkit.Net.isTraceEnabled -- true for activate trace in HC2 debug window isTraceEnabled = false, -- Toolkit.Net.HttpRequest(host, port) -- Give object instance for make http request -- host (string) - host -- port (intager) - port -- Return HttpRequest object HttpRequest = (function(host, port) assert(host~=Toolkit.Net, "Cannot call HttpRequest like that!"); assert(host~=nil, "host invalid input"); assert(port==nil or tonumber(port), "port invalid input"); -- make sure all free-able memory is freed to help process collectgarbage("collect"); Toolkit.Net.__host = host; Toolkit.Net.__port = port; local _c = Toolkit.Net.__Http; _c.__tcpSocket = Net.FTcpSocket(host, port); _c.__isConnected = true; Toolkit.Net.__trace("%s.%s > Total memory in use by Lua: %.2f Kbytes", Toolkit.Net.__header, Toolkit.Net.__Http.__header, collectgarbage("count")); Toolkit.Net.__trace("%s.%s > Create Session on port: %d, host: %s", Toolkit.Net.__header, Toolkit.Net.__Http.__header, port, host); return _c; end), -- Toolkit.Net.version() version = (function() return Toolkit.Net.__version; end) }; Toolkit:traceEx("red", Toolkit.Net.__header.." loaded in memory..."); -- benchmark code if (Toolkit.Debug) then Toolkit.Debug:benchmark(Toolkit.Net.__header.." lib", "elapsed time: %.3f cpu secs\n", "fragment", true); end; end; function urlencode(str) if (str) then str = string.gsub (str, "\n", "\r\n") str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end) str = string.gsub (str, " ", "+") end return str end -------- -------- -------- function SendPushover(message) local uri = "/1/messages.json"; local params = "?token=xxxxxxxxxxxxxxxxxxxxx&user=xxxxxxxxxxxxxxxxxxxxxxxxxxxx&message=" .. urlencode(tostring(message or "empty")) .."&priority=0&sound=bugle"; Tk.Net.isTraceEnabled = true; local HttpClient = Tk.Net.HttpRequest("api.pushover.net", 80); HttpClient:setReadTimeout(500); local response, status, errorCode = HttpClient:request("POST", uri..params, { "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9" }); HttpClient:disconnect(); HttpClient:dispose(); HttpClient = nil; end local message = fibaro:getGlobalValue("pushover"); if (string.len(message) > 0) then SendPushover(message); end
Moicphil Posté(e) le 23 avril 2014 Auteur Signaler Posté(e) le 23 avril 2014 Dans la "pratique, ensuite tu auras juste a renseigner cette variable "pushover" via tes scènes puis appuyer sur le bouton ... A inserer ensuite dans une scene par exemple : message = "ce que tu veux envoyer via pushover" fibaro:setGlobal("pushover", message);--renseignement variable fibaro:call(xx, "pressButton", "1");--lancement du push fibaro:setGlobal("pushover", "" );--raz variable
Steven Posté(e) le 23 avril 2014 Signaler Posté(e) le 23 avril 2014 On peut encore simplifier. Si on créer un scénario qui répond au changement de la variable "pushover" et qui va appuyer sur le bouton et enlever le contenu de la variable. N'importe où dans d'autres scénarios ou modules virtuels, dès que la variable "pushover" sera modifiée, le message sera automatiquement envoyé sans rien faire ... comme par magie.
Moicphil Posté(e) le 23 avril 2014 Auteur Signaler Posté(e) le 23 avril 2014 Effectivement, je vais essayer tien ! c'est quand même dingue les possibilités en Lua...
Messages recommandés