Aller au contenu

Lazer

Administrateur
  • Compteur de contenus

    25 998
  • Inscription

  • Dernière visite

  • Jours gagnés

    1 281

Tout ce qui a été posté par Lazer

  1. Ou bien sûr, c'est l'ensemble email:password qu'il faut encoder d'un bloc.
  2. 401, c'est bien ce que je pensais, authentification échouée Donc tu as un problème dans l'encodage de ton email:password devant l'adresse IP.
  3. Sur DSM, dans le panneau de configuration, activer le Terminal SSH. Puis avec PuTTY (Windows) ou équivalent, ouvrir une ligne de commande avec le compte admin. (le login root n'est plus possible depuis DSM 6, il faut se loguer admin, puis utiliser sudo pour passer root.... mais normalement vous n'en n'aurez jamais besoin, une session admin est plus que suffisante pour faire un simple curl)
  4. Nico t'as pas lu mon message, tu réponds à coté de la plaque ..... j'ai bien dit que le problème concerne le script du syno
  5. bon bah voilà, c'est juste un problème de syntaxe de l'auth dans le script que vous utilisez
  6. Je ne suis pas spécialiste Apache, mais la ligne de configuration suivante me laisse à penser que cette URL n'est accessible que depuis localhost 127.0.0.1 : ProxyPass /api/service http://127.0.0.1/services/system retry=0 Par conséquent, je ne vois pas bien comment ça pourrait fonctionner chez certains. A la limite, ça fonctionne depuis un VD ou une Scène en local sur la HC2, mais ça on s'en moque, puisque ce que vous voulez, c'est rebooter la box depuis une autre machine, quand la HC2 est plantée. Donc ça ne me semble pas faisable. EDIT : en fait, je pense que cette ligne de configuration permet de faire rebooter la box sans authentification user/password uniquement en local. A distance, il semble que l’authentification soit nécessaire, auquel cas on devrait pouvoir rebooter quand même. Du coup, il faut que vous compreniez pourquoi ça ne fonctionne pas.... récupérez le code retour de votre appel curl, il y a toutes les chances que ça soit juste un problème d'auth (code 401). IPHC="email:pass encodé" curl --write-out %{http_code} http://${IPHC}@192.168.X.XX/services/system/reboot.php A exécuter en ligne de commande pour voir le résultat à l'écran.
  7. il manque un $ devant IPHC dans le curl Là pas contre il ne vaut pas encoder le @IP Tu fais un mix de tes 2 codes et tu vas finir par tomber dessus, un truc du genre : IPHC="email:pass encodé" curl http://${IPHC}@192.168.X.XX/services/system/reboot.php
  8. Lazer

    Json T_end

    Déjà tu as le début de réponse de ton problème dans le message : 401 Utilisateur non authentifié Donc un problème avec ton login/mot de passe. Vu que c'est une adresse email, je te conseille de faire un urlencode() de ton adresse avant de la donner en argument. Tu trouveras le code de la fonction urlencode() sur le forum, par exemple sur le topic de SMS Gateway. Je ne sais pas si ça suffira, mais c'est un début. Une fois que tu auras résolu ton problème d'authentification, il faut passer les data proprement. J'ai bien précisé sur l'autre topic qu'il faut que ça soit une chaine de caractères. Donc ton premier code avec les guillemets devrait être correct. Le second où tu passes un tableau ne peut pas fonctionner, sauf si tu fais un json.encode() de ce tableau. Ce qui devrait te donner la même chaine de caractère qu'au dessus.... à vérifier avec des affichages fibaro:debug()
  9. Lazer

    Panneau d'évènements

    Si il utilise un PC portable, c'est mort . N'importe quelle TV peut servir d'écran, mais pour le clavier, faudra en racheter un.
  10. Le NAS il a déjà son ventillo d'extraction normalement, donc inutile d'en rajouter. Il faut juste s'assurer que l'air qu'il aspire soit frais, c'est à dire qu'il ne doit pas aspirer de l'air qui a déjà été réchauffé par un autre appareil dans l'armoire.
  11. J'utilise Google pour chercher sur le forum ! Je pense que oui pour success et error
  12. Tes photos doivent être en Jpeg ou PNG pour passer sur le forum (Les 2 standard du Web, si on exclu les GIF animés...) Cherche "refroidisseur pc portable" sur Amazon, il y a des tonnes de référence. Je crois que c'est Nico qui avait essayé. Sinon n'importe quel ventilo de PC en 12 ou 14 cm que tu pourra monter comme bon te semble en fonction de ton armoire. C'est du cas par cas. Idem pour le sens de ventilation, je ne peux pas trop répondre à ta place, ça dépend de la configuration.
  13. Merci @frixo pour ton retour détaillé. J'ai fusionné ton message avec le topic unique du module dans cette section, et ajouté un lien vers ton tuto en première page.
  14. Si je ne dis pas de bêtise, ce genre d'appareil ne fait qu’humidifier l'air. Conséquences : - si l'air est sec => la peau du corps humain ressent cette humidité comme un rafraichissement (même principe que les brumisateurs) - si l'air est humide (temps lourd, orageux) => effet très désagréable sur soi, insupportable - pour les appareils électriques => dans tous les cas, une hausse de l'humidité est mauvaise et ne peux que nuire à l'électronique. Il faut bien comprendre que le principe de l'appareil n'est pas de rafraichir l'air, mais uniquement la sensation que les humains en ont. Et encore, ça dépend de l'humidité relative de l'air.... J'ajoute même que puisqu'il consomme quelques Watts, il réchauffera mathématiquement l'air. Bref, oublie, ce produit est un attrape nigaud, et je remplacera jamais une climatisation. Si tes appareils ont chaud, et que tu ne peux pas installer une climatisation, tu peux mettre des ventilateurs pour refroidir localement l'air dégagé par chaque appareil sur sa tablette. Par exemples : - plateau de refroidissement d'ordinateur portable à placer sous chaque box - ventilateur de PC 12 ou 14 cm alimenté en 5 ou 12V, positionné juste sur le boitier de chaque box avec des patins pour ne pas que les pales frottent. => technique que j'utilise pour refroidir mon routeur.
  15. Partage ton code et un maximum de détail, les logs, etc Tu peux faire ça dans ton topic d'origine.
  16. OK Donc il faut que tu imbriques les 2 fonctions l'une dans l'autre (en vertu de ce qui a été dit... le code DOIT continuer dans la fonction success() Quand tu décodes le tableau dans la première fonction success() : local jsonTable = json.decode(response.data) Juste après tu modifies la valeur : jsonTable.zones[1].state = "1" Puis tu donnes l'ensemble (avec json.encode()) dans les options de ton second appel http : options = { method = 'POST', data = json.encode(jsonTable) } })
  17. Euh... mais en fait tu récupère un JSON via une requête GET, tu veux modifier une valeur, et le réinjecter dans une requête POST, c'est ça ?
  18. Lazer

    Panneau d'évènements

    Donc c'est bon alors ? Par contre quand il y a beaucoup d'événements, le panneau devient inutilisable... Perso avec 70 modules, ça génère tellement d'information (surtout les relevés de température, etc) que ça devient ingérable. OK pour l'onduleur Disons qu'un final si la HC2 est coupée violemment, on va dire, une fois pas an, ce n'est pas trop un souci. Si c'est tous les mois, ça devient critique. Ce n'est pas la durée de la coupure qui importe, mais la coupure tout court. C'est un PC, la moindre coupure, tu perds le travail en cours, et pire encore, tu corromps les fichiers qui étaient en cours d'écriture à ce moment là. La HC2 met tout dans une base de données, donc un fichier unique. Une coupure au mauvais moment et tu perds tout. Penses à faire des backups réguliers. Si tu as un écran/clavier, va faire un tour dans le BIOS de la carte mère, normalement le paramètre de reboot automatique devrait être actif. Ce n'est peut être pas le cas chez toi. Autre chose, quand la coupure est trop brève (quelques secondes), la carte mère ne redémarre pas toute seule. Mais l'onduleur doit te protéger contre les coupures courte, donc il ne reste que les coupures longues (batterie à plat), et dans ce cas, la carte mère doit redémarrer seule si le paramètre du BIOS est bien réglé.
  19. Je ne comprends pas bien ta question ?!
  20. Lazer

    Panneau d'évènements

    Hum, alors là je n'ai pas d'idée. Par contre tu sembles parler de coupure de courant... si c'est fréquent, cherche pas plus loin, tu as surement corrompu le système. Essaye de contacter le support Fibaro pour voir si ils peuvent corriger à distance. Et dans tous les cas, installes un petit onduleur.
  21. Lazer

    Panneau d'évènements

    Ouais mal là ça ne doit pas être ça, puisqu'il ne voit pas les champs pour sélectionner les heures (en haut du panneau d'événement)
  22. Lazer

    Panneau d'évènements

    Etrange.... Quelques pistes : - rebooter la box - vider le cache du navigateur - changer de navigateur
  23. Lazer

    Json T_end

    Bloug, désolé, toujours pas de code LUA, mais j'ai rédigé un mini tuto qui, je l'espère, t'aidera un peu à y voir plus clair :
  24. Voilà : Par contre c'est fait à la va-vite, je n'ai pas testé le code LUA, j'espère qu'il n'y a pas d'erreur de syntaxe. N'hésitez par à me corriger. Sinon pour @J3R3M, comme tu peux le voir, cela intrigue beaucoup de monde, exemples : https://www.domotique-fibaro.fr/topic/9055-incomprã©hension-dans-les-nethttpclient/ https://www.domotique-fibaro.fr/topic/10888-nethttpclient-contourner-lasynchrone-cest-possible/ https://www.domotique-fibaro.fr/topic/10900-comportement-du-timeout-dans-les-nethttpclient/ https://www.domotique-fibaro.fr/topic/11558-récupérer-les-données-retournées-par-nethttpclient/
  25. Utilisation de net.HTTPClient() asynchrone - dans une scène en LUA sur HC2/HC3 - - dans un QuickApp sur HC3 - Dans les scènes, Fibaro ne nous laisse pas le choix, dès que l'on veut faire des appels HTTP, on est obligé d'utiliser la fonction asynchronse net.HTTPClient(). La fonction Net.FHTTP() synchrone utilisée dans les VD n'est pas disponible dans les scènes. Toutefois, l'avantage de net.HTTPClient() est d'accepter les connexions sécurisées HTTPS devenues majoritaires sur Internet. Exemple de code simple pour une requête de type GET local http = net.HTTPClient() http:request("http://1.2.3.4/url", { success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } }) L'exemple suivant effectue une requête de type POST permettant d'envoyer des données vers le site distant. De plus, la fonction success() récupère les données de type JSON en vue d'un traitement ultérieur (notez que les données envoyées vers le site Web et les données reçues depuis le site Web sont différentes, cela dépend de l'application qui tourne sur le site) : -- Les données à envoyer au formulaire local myJson = { "couleurs": { [1] = "bleu", [2] = "blanc", [3] = "rouge" }, "fruits": { [1] = "pomme", [2] = "banane" }, } -- Appel HTTPS local http = net.HTTPClient() http:request("https://www.domaine.com/url", { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then print('Retour : '.. response.data) local jsonTable = json.decode(response.data) -- Parcours de la table JSON local k, v for k, v in pairs(jsonTable) do print("key = " .. k .. " - type(v) = " .. type(v)) end -- Ici la suite du code, exécuté en asynchrone, donc après la fin de l'exécution du code appelant http:request() -- ... else print("Error : empty response data") end else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'POST', timeout = 5000, checkCertificate = false, headers = { ["content-type"] = 'application/x-www-form-urlencoded;', ["Authorization"] = "Basic YWRtaW46cGFzc3dvcmQ=" -- username:password encodé en Base64 (admin:password) }, data = json.encode(myJson) } }) -- Ici la suite du code, exécuté en synchrone, donc avant l'exécution du contenu de la fonction success() -- ... On remarque dans les options que l'on peut choisir les paramètres suivants : method : obligatoire : GET ou PUT ou POST ou DELETE timeout : facultatif : délai d'attente en millisecondes avant échec de la requête. Peut être utile avec certains serveurs un peu trop lents à répondre. Dans le doute, inutile d'utiliser ce paramètre. checkCertificate : facultatif : true ou false, permet d'ignorer les alertes de sécurité sur les certificats auto-signés (non reconnus pas une autorité de certification approuvée) headers : facultatif : permet de passer le(s) en-tête(s) HTTP de son choix vers le site Web distant. Si vous ne savez pas ce qu'est un Header, c'est que vous n'avez probablement pas besoin d'envoyer de header, donc ignorez ce paramètre. data : facultatif : ce sont les données à envoyer dans les formulaires POST et PUT sous forme de chaine de caractères. Donc si les données sont de type tableau JSON, il faut les encoder avec json.encode(). Asynchronisme net.HTTPClient() est asynchrone, le code dans les fonctions success() et error() appelées en callback s'exécute toujours après la fin de l'exécution du thread principal. Quand on commence à programmer en asynchrone, il ne faut plus jamais utiliser de fonctions synchrones comme sleep(), sous peine de comportement surprenant. Préférer à la place l'emploi de la fonction settimout() qui est elle-même asynchrone (chercher les exemples sur le forum) La bonne pratique quand on programme en asynchrone est la suivante : Après un appel à net.HTTPClient(), le code devrait se terminer le plus rapidement possible afin de laisser la main à la fonction success() appelée en callback de net.HTTPClient(). La suite du code se déroule donc dans la fonction success(). Celle-ci, à sont tour, peut faire d'autres appels à net.HTTPClient() ou settimeout() pour déclencher de nouveaux appels de fonctions en callback asynchrone. Etc... C'est la technique que j'ai employé dans mes scènes Watchdog et Yamaha MusicCast, partagées sur le forum. C'est une certaine gymnastique qui n'est pas évidente au début, et oblige à revoir toute la structure de son code LUA. En complément je vous invite à lire ce sujet sur la protection des requêtes http avec pcall() :
×
×
  • Créer...