labomatik Posté(e) le 17 janvier 2015 Signaler Partager Posté(e) le 17 janvier 2015 Bonjour à tous, Voici un petit tutoriel sur comment piloter son nas QNAP avec la HC2. Je ne suis pas dévelopeur LUA sous HC2 donc il y a surement moyen d'optimiser tout ça (notamment les variables login/pass). Les 3 exemples sont basés sur mes besoins actuels, j'arrête mon nas le soir avec l'armement de mon alarme et rallume avec le désarmement de mon alarme grace au WOL (plugin fibaro). Avec les nouvelles génération de nas X51, il est possible de lancer la commande sleep et non shutdown, ce qui permet au NAS d'être réveillé en 5 secondes (RAM sauvegardée) Configuration QNAP Vous devez autoriser la connexion sans SSL (la HC2 ne supporte pas le ssl) HC2 voici un exemple de quelques fonctions que j'ai utilisé pour commander mon NAS - arrêter le nas proprement - démarrer l'enregistrement des caméras de la station de surveillance - arrêter l'enregistrement des caméras de la station de surveillance si vous voulez obtenir l'API complet des fonctions des NAS qnap, envoyez un petit mail à developer@qnap.com (anglais) --> Je ne suis pas dévelopeur et/ou je ne veux pas comprendre Voici alors le virtuel device déjà prêt avec les 3 fonctions vous devez configurer l'IP et le port dans la configuration du virtuel device et adapter le login/pass dans le code des 3 boutons (remplacez LOGIN_NAS et PASSWORD_NAS) QNAP.vfib.zip --> Je suis dévelopeur et/ou je veux comprendre démarrer l'enregistrement: local ip_module = fibaro:get(fibaro:getSelfId(), "IPAddress") local port = fibaro:get(fibaro:getSelfId(), "TCPPort") surveillance_Station = Net.FHttp(ip_module, port) surveillance_Station:setBasicAuthentication("LOGIN_NAS", "PASSWORD_NAS") response = surveillance_Station:GET("/cgi-bin/mrec.cgi?ch=1&act=1") if (string.find(response, "OK")) then fibaro:log("Starting Recording") else fibaro:log("ERROR") end arrêter l'enregistrement local ip_module = fibaro:get(fibaro:getSelfId(), "IPAddress") local port = fibaro:get(fibaro:getSelfId(), "TCPPort") surveillance_Station = Net.FHttp(ip_module, port) surveillance_Station:setBasicAuthentication("LOGIN_NAS", "PASSWORD_NAS") response = surveillance_Station:GET("/cgi-bin/mrec.cgi?ch=1&act=0") if (string.find(response, "OK")) then fibaro:log("Stop Recording") else fibaro:log("ERROR") end la partie plus complexe qui nécessite un parseur XML, l'arret du NAS if (not QNAP) then QNAP = {} QNAP.qnap_ip = fibaro:get(fibaro:getSelfId(), "IPAddress"); QNAP.port = fibaro:get(fibaro:getSelfId(), "TCPPort"); QNAP.globalvariable = "" -- -------------------------------------------------------------------------------------------------------------- -- Obtient le XML et le retourne sous forme de table LUA -- -------------------------------------------------------------------------------------------------------------- QNAP.getTokenFromXml = function() local QNAP2URL = Net.FHttp(QNAP.qnap_ip,QNAP.port); response = QNAP2URL:GET("/cgi-bin/authLogin.cgi?user=LOGIN_NAS&plain_pwd=PASSWORD_NAS&remme=1"); xmlTable = QNAP.iif(response ~= nil, QNAP.newParser().ParseXmlText(response), ""); if (xmlTable.QDocRoot ~= nil) then qsidstr = xmlTable.QDocRoot.authSid:value(); if (string.len(qsidstr)>0) then fibaro:debug("Qtoken founded"); qsidstr = qsidstr:gsub("[".."<![CDATA[".."]", ''); qsidstr = qsidstr:gsub("[".."]".."]", ''); qsidstr = qsidstr:gsub("["..">".."]", ''); fibaro:debug(qsidstr); response = QNAP2URL:GET("/cgi-bin/sys/sysRequest.cgi?subfunc=power_mgmt&count=0.1234&sid="..qsidstr.."&apply=shutdown"); if (string.find(response, "OK")) then fibaro:log("Power Off Server") else fibaro:log("ERROR") end end end end -- ------------------------------------------------------------------------------------------------------------- -- Teste la condition et retourne la valeur true ou false -- ------------------------------------------------------------------------------------------------------------- QNAP.iif = function(condition, iftrue, iffalse) if (condition) then return iftrue end return iffalse end -- ------------------------------------------------------------------------------------------------------------- -- Ceci est une version modifiée par Steven de Corona-XML-Module par Jonathan Beebe qui a son tour -- est basée sur Alexander Makeev's Lua-only XML parser . -- see https://github.com/Cluain/Lua-Simple-XML-Parser -- ------------------------------------------------------------------------------------------------------------- QNAP.newParser = function() parseXml = {} parseXml.FromXmlString = function(value) value = string.gsub(value, "([%x]+)%;", function(h) return string.char(tonumber(h, 16)) end); value = string.gsub(value, "([0-9]+)%;", function(h) return string.char(tonumber(h, 10)) end); value = string.gsub(value, "'", "'"); value = string.gsub(value, ">", ">"); value = string.gsub(value, "<", "<"); value = string.gsub(value, "&", "&"); return value; end parseXml.ParseArgs = function(node, s) string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a) node:addProperty(w, parseXml.FromXmlString(a)) end) end parseXml.ParseXmlText = function(xmlText) local stack = {} local top = parseXml.newNode() table.insert(stack, top) local ni, c, label, xarg, empty local i, j = 1, 1 while true do ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i) if not ni then break end local text = string.sub(xmlText, i, ni - 1); if not string.find(text, "^%s*$") then local lVal = (top:value() or "") .. parseXml.FromXmlString(text) stack[#stack]:setValue(lVal) end if empty == "/" then -- empty element tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) top:addChild(lNode) elseif c == "" then -- start tag local lNode = parseXml.newNode(label) parseXml.ParseArgs(lNode, xarg) table.insert(stack, lNode) top = lNode else -- end tag local toclose = table.remove(stack) -- remove top top = stack[#stack] if #stack < 1 then error("XmlParser: nothing to close with " .. label) end if toclose:name() ~= label then error("XmlParser: trying to close " .. toclose.name .. " with " .. label) end top:addChild(toclose) end i = j + 1 end local text = string.sub(xmlText, i); if #stack > 1 then error("XmlParser: unclosed " .. stack[#stack]:name()) end return top end parseXml.newNode = function(name) local node = {} node.___value = nil node.___name = name node.___children = {} node.___props = {} function node:value() return self.___value end function node:setValue(val) self.___value = val end function node:name() return self.___name end function node:setName(name) self.___name = name end function node:children() return self.___children end function node:numChildren() return #self.___children end function node:addChild(child) if self[child:name()] ~= nil then if type(self[child:name()].name) == "function" then local tempTable = {} table.insert(tempTable, self[child:name()]) self[child:name()] = tempTable end table.insert(self[child:name()], child) else self[child:name()] = child end table.insert(self.___children, child) end function node:properties() return self.___props end function node:numProperties() return #self.___props end function node:addProperty(name, value) local lName = "@" .. name if self[lName] ~= nil then if type(self[lName]) == "string" then local tempTable = {} table.insert(tempTable, self[lName]) self[lName] = tempTable end table.insert(self[lName], value) else self[lName] = value end table.insert(self.___props, { name = name, value = self[name] }) end return node end return parseXml; end end QNAP.getTokenFromXml(); 4 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nico Posté(e) le 18 janvier 2015 Signaler Partager Posté(e) le 18 janvier 2015 On est Syno ici, dehors les Qnap !!! Bon ok, c'est moi qui sort Sinon pas mal du tout, il faudrait que je regarde pour faire la même chose pour le Syno en partant de ton module. Maintenant il faut d'abord que je vois pourquoi je voudrais arrêter mon Syno depuis la HC2... Tu t'en sers pour quoi ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Floflo42 Posté(e) le 18 janvier 2015 Signaler Partager Posté(e) le 18 janvier 2015 Bonjour, Enfin du Qnap ... bon faut que j'étudie tous sa ! Mille merci pour cette marche a suivre. Lien vers le commentaire Partager sur d’autres sites More sharing options...
labomatik Posté(e) le 18 janvier 2015 Auteur Signaler Partager Posté(e) le 18 janvier 2015 On est Syno ici, dehors les Qnap !!! Bon ok, c'est moi qui sort Sinon pas mal du tout, il faudrait que je regarde pour faire la même chose pour le Syno en partant de ton module. Maintenant il faut d'abord que je vois pourquoi je voudrais arrêter mon Syno depuis la HC2... Tu t'en sers pour quoi ? J'ai à la maison un 1270 avec 12 disques, la conso est assez élevée, j'avais prévu au départ d'utiliser le scheduler du nas pour l'arrêter à heure fixe et redémarrer à heure fixe. Mais voilà le nas n'a pas besoin d'etre allumé pendant les congés, jours de boulot,... donc je prefere l'éteindre lorsque mon alarme est activée (ce qui signifie personne à la maison) si vraiment je dois me connecter dessus, le WOL via la HC2 me permet d'avoir la main directement. Sinon Qnap ou syno, a chacun son choix. Christophe Lien vers le commentaire Partager sur d’autres sites More sharing options...
Krikroff Posté(e) le 19 janvier 2015 Signaler Partager Posté(e) le 19 janvier 2015 @labomatik, bravo Lien vers le commentaire Partager sur d’autres sites More sharing options...
labomatik Posté(e) le 20 janvier 2015 Auteur Signaler Partager Posté(e) le 20 janvier 2015 (modifié) @labomatik, bravo Mon code est un peu bourrain mais l'essentiel est là Modifié le 20 janvier 2015 par Moicphil Bonsoir, inutile de citer le message juste avant Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bloug Posté(e) le 21 janvier 2015 Signaler Partager Posté(e) le 21 janvier 2015 Merci , C'est toujours un gros " Plus " pour nos Qnap ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nico Posté(e) le 21 janvier 2015 Signaler Partager Posté(e) le 21 janvier 2015 Oki, merci Labo. Car du coup j'ai beau réfléchir, pas trop d'intérêt pour moi : -Je ne peux couper mon Syno, vu qu'il héberge mon serveur PHP/MySQL, qui stocke par exemple les données de Lazer de suivi de température -Pour gérer les coupures d'électricité, cela est géré par mon onduleur en SNMP pour coupure puis allumage auto Faut que je réfléchisse un peu à tout ça. Lien vers le commentaire Partager sur d’autres sites More sharing options...
fdp2 Posté(e) le 21 janvier 2015 Signaler Partager Posté(e) le 21 janvier 2015 @Nico, La solution de labomatik m'a inspiré les mêmes questions que toi. Je viens de poster une solution pour Synology ici http://www.domotique-fibaro.fr/index.php/topic/3373-pilotez-votre-qnap-avec-la-hc2/#entry48673 Cela dit je ne pense pas m'en servir car j'utilise mon syno régulièrement en journée, et la nuit il fait des sauvegarde distantes, ou en reçoit d'autres machines distante. Lien vers le commentaire Partager sur d’autres sites More sharing options...
cybersquat Posté(e) le 29 janvier 2015 Signaler Partager Posté(e) le 29 janvier 2015 merci pour ce tuto J'ai un Qnap TS-470Pro. J'ai installé ton module, changé l'ip +port et le login/password. Comment peut-on vérifier directement si les cam enregistre ou pas du tout ? Aussi j'ai appuyer sur le bouton arrêter, il n’arrête pas le NAS, est-ce spécifique au tient seulement ? Pareil le mien fonctionne h24 car il héberge également mon sql, faut-il modifier quelque chose sur ton script ? Merci de ton aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
labomatik Posté(e) le 30 janvier 2015 Auteur Signaler Partager Posté(e) le 30 janvier 2015 Quel est la version de ton nas et HC2? Est ce que tu connais le LUA? christophe Lien vers le commentaire Partager sur d’autres sites More sharing options...
cybersquat Posté(e) le 30 janvier 2015 Signaler Partager Posté(e) le 30 janvier 2015 Yop Christophe, LUA, du tout, du tout lol, 'y connais rien mais alors rien ! Le NAS la TS470 Lien vers le commentaire Partager sur d’autres sites More sharing options...
cybersquat Posté(e) le 12 avril 2015 Signaler Partager Posté(e) le 12 avril 2015 (modifié) re labomatik, Le bouton arrêt fonctionne quand j'appui dessus, reste les caméras savoir si ca enregistre bien ou pas PS = il faut que les cam ont le même user/password pour que ca fonctionne ? ---- re, Question, lorsque j'appui sur le bouton enregistrer, ca lance 1 cam sur 8, la HIKVISION, les axis et les foscams ne ce lancent pas, information que je regarde en même temps sur le surveillance station As tu une idée, sachant que les caméras n'ont pas toutes le même mot de passe, login idem par contre Modifié le 14 avril 2015 par cybersquat Lien vers le commentaire Partager sur d’autres sites More sharing options...
jorderic Posté(e) le 7 juillet 2015 Signaler Partager Posté(e) le 7 juillet 2015 Bjr àTous, Suite changement de mon NAS QNAP, j'ai testé l'installation de ce VD uniquement pour contrôler mes cameras. Impossible de stopper l'enregistrement.... J'ai un QNAP HS 251. quelqu'un pourrait-il m'aider? Merci d'avance! Lien vers le commentaire Partager sur d’autres sites More sharing options...
labomatik Posté(e) le 8 juillet 2015 Auteur Signaler Partager Posté(e) le 8 juillet 2015 Quel est la version du QTS? christophe Lien vers le commentaire Partager sur d’autres sites More sharing options...
jorderic Posté(e) le 8 juillet 2015 Signaler Partager Posté(e) le 8 juillet 2015 il est en 4.1.4 merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
labomatik Posté(e) le 9 juillet 2015 Auteur Signaler Partager Posté(e) le 9 juillet 2015 je vais contacter qnap pour voir si l'api a changé. Christophe Lien vers le commentaire Partager sur d’autres sites More sharing options...
jorderic Posté(e) le 9 juillet 2015 Signaler Partager Posté(e) le 9 juillet 2015 Merci Labomatik, ce serait top! Lien vers le commentaire Partager sur d’autres sites More sharing options...
csabe Posté(e) le 22 décembre 2015 Signaler Partager Posté(e) le 22 décembre 2015 Jag har problem intressant att jag inte kan packa upp zip-filen. // redémarré l'ordinateur et comment il fonctionne, désolé! Lien vers le commentaire Partager sur d’autres sites More sharing options...
cybersquat Posté(e) le 14 septembre 2016 Signaler Partager Posté(e) le 14 septembre 2016 Re sur le sujet, Pouvons nous démarrer et ajouter un bouton start sur le VD ? ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lamparo Posté(e) le 28 mars 2017 Signaler Partager Posté(e) le 28 mars 2017 bonsoir à vous. je possède un QNAP et voudrais avoir la possibilité de le démarrer via la HC2. Comme le demande cybersquat, peut on ajouter un bouton "start" sur le VD? Merci à vous Lien vers le commentaire Partager sur d’autres sites More sharing options...
pepite Posté(e) le 29 mars 2017 Signaler Partager Posté(e) le 29 mars 2017 Le 18/1/2015 à 13:58, labomatik a dit : si vraiment je dois me connecter dessus, le WOL via la HC2 me permet d'avoir la main directement. @labomatik utilise le Wake On Lan pour ca. Je n'ai pas de Qnap, mais tu dois pouvoir activer la fonctionnalité sur le Qnap à moins que cela soit le cas par défaut. Puis tu utilises le code de @Krikroff Lien vers le commentaire Partager sur d’autres sites More sharing options...
lamparo Posté(e) le 30 mars 2017 Signaler Partager Posté(e) le 30 mars 2017 Bonsoir Pepite, merci pour tes précieux conseils. Je ne pensais pas pouvoir gérer un NAS comme un PC. Je vais tester le code de Krikrof. Je te tiendrai au courant :-) @+ JP Lien vers le commentaire Partager sur d’autres sites More sharing options...
lamparo Posté(e) le 8 avril 2017 Signaler Partager Posté(e) le 8 avril 2017 if (not QNAP) then QNAP = {} QNAP.qnap_ip = fibaro:get(fibaro:getSelfId(), "IPAddress"); QNAP.port = fibaro:get(fibaro:getSelfId(), "TCPPort"); QNAP.globalvariable = "" -- -------------------------------------------------------------------------------------------------------------- -- Obtient le XML et le retourne sous forme de table LUA -- -------------------------------------------------------------------------------------------------------------- QNAP.getTokenFromXml = function() local QNAP2URL = Net.FHttp(QNAP.qnap_ip,QNAP.port); response = QNAP2URL:GET("/cgi-bin/authLogin.cgi?user=LOGIN_NAS&plain_pwd=PASSWORD_NAS&remme=1"); xmlTable = QNAP.iif(response ~= nil, QNAP.newParser().ParseXmlText(response), ""); if (xmlTable.QDocRoot ~= nil) then qsidstr = xmlTable.QDocRoot.authSid:value(); if (string.len(qsidstr)>0) then fibaro:debug("Qtoken founded"); qsidstr = qsidstr:gsub("[".."<![CDATA[".."]", ''); qsidstr = qsidstr:gsub("[".."]".."]", ''); qsidstr = qsidstr:gsub("["..">".."]", ''); fibaro:debug(qsidstr); response = QNAP2URL:GET("/cgi-bin/sys/sysRequest.cgi?subfunc=power_mgmt&count=0.1234&sid="..qsidstr.."&apply=shutdown"); if (string.find(response, "OK")) then fibaro:log("Power Off Server") else fibaro:log("ERROR") end end end end -- ------------------------------------------------------------------------------------------------------------- -- Teste la condition et retourne la valeur true ou false -- ------------------------------------------------------------------------------------------------------------- QNAP.iif = function(condition, iftrue, iffalse) if (condition) then return iftrue end return iffalse end Bonsoir à vous, j'ai utilisé le code de @Krikroff pour démarrer mon QNAP à distance et cela fonctionne parfaitement. Je cherche maintenant à l'éteindre, pour cela j'ai inséré le code ci-dessus dans mon VD, mais..nada, ça ne fonctionne pas. Quand je le passe dans le débug RAS (enfin si, il manque un "end" à la fin). Si quelqu'un a une piste. Merci à vous. JP Lien vers le commentaire Partager sur d’autres sites More sharing options...
pepite Posté(e) le 9 avril 2017 Signaler Partager Posté(e) le 9 avril 2017 Bonjour super tu le demarres :-) Aucune idée pour l arret :-) Desole. J esaierai de googliser :-)Envoyé de mon Nexus 5X en utilisant Tapatalk Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés