Classement
Contenu populaire
Affichage du contenu avec la meilleure réputation depuis le 14/05/2025 dans toutes les zones
-
5 points
-
4 points
-
Ca y est, cette fois étage terminée aussi, clim posée ! Les filles sont être heureuses, et moi dans la salle ciné aussi Comme au RDC, full gainable, cette fois de chez Mistu : Intérieur : Inverter PEAD-M100JA2 Extérieur : Mono-split MITSUBISHI PUZ-M100VKA2 Pour contrôler le tout, un kit complet de chez Airzone : Plenum 5 zones, Webserver Rail Din, 5 télécommande Blueface filaire (Plus sympa niveau affichage et pas de pile à gérer), une sonde global supplémentaire pour la qualité de l'air AirQ Sensor. Le tout interfacé avec la HC2 bien sûr avec 5 VDs. Le résultat est top, intégration nickel et discrète, contrôlé précis et température qui se régule en douceur avec ce 1er week-end de très forte température. Après comme vous pouvez le voir, cela prend un peu de place Après le grenier est encore grand, je peux toujours stocker encore. J'en ai profité pour ajouter de la lumière au grenier avec un petit sous tableau et des prises. Dehors le groupe extérieur c'est un petit monstre versus celui du RDC Vais maintenant pouvoir ajouter un cache du côté pour masque un peu le tout. Niveau gaine froide, cela passe sous les tuiles et rentre directement dans le grenier. Évacuation des condensats en gravitaire, cela évitera une panne de pompe du gainable un jour, toujours mieux en naturel. Qques photos du tout :4 points
-
4 points
-
Ah oui, tout à fait, merci de relancer Effectivement il va falloir renouveler l'hébergement et le domaine chez OVH avant le 1er juillet, soit 167,60 € : Et il y aura également la licence du forum à renouveler en janvier 2026, cette année c'était 200 dollars soit 195,71 € Il reste 34,91 € dans la cagnotte, donc à votre bon cœur Comme l'année dernière, en message privé.4 points
-
Faudra que tu fasses un rappel pour janvier...3 points
-
Après quelques tests avec différents modules, je pense avoir trouvé le fin mot de l'histoire : updateProperty fonctionne uniquement avec les QuickApps setProperty fonctionne avec tous les modules, Z-Wave et QuickApps Donc setProperty est plus universel et doit être utilisé. Je prépare une petite mise à jour de GEA avec quelques correctifs, à venir bientôt3 points
-
Ca y est j'y suis arrivé ! Ma première QA fonctionne. La voici pour ceux qui veulent tester... évidemment il faut un compte chez Blueriiot sans quoi vous n'aurez pas accès à l'API. De toute façon ça n'a aucun intérêt en dehors du contexte d'une sonde Blue Connect (Plus/Go). Je joins l'icône. Je l'ai mise à disposition sur le Fibaro Marketplace aussi, pour voir si ça intéresse d'autres personnes que moi sur cette terre Tous vos retours et/ou conseils sont bienvenus. BlueRiiot_Blue_Connect_v1.1.fqa3 points
-
Voici la mise à jour version 2.00 du QuickApp TEMPO : Correction de l'API EDF suite aux changements de septembre 2024 Ajout des variables VG_TIC_Jour et VG_TIC_Demain mises à jour par le QuickApp GCE depuis la téléinformation en local disponible sur le compteur Linky. A noter que la couleur du lendemain n'est disponible qu'à partir de 20h, et uniquement si la couleur du jour annoncé est BLANC ou ROUGE, car le BLEU est considéré comme couleur standard, par défaut, donc non défini. Mise à jour : copier/coller le contenu des fichiers suivants dans le QuickApp existant : Fichier main : Tempo v2.00 - Main.lua Fichier EDF : Library - EDF v1.10.lua Et ajouter manuellement les variables de QuickApp VG_TIC_Jour et VG_TIC_Demain3 points
-
Effectivement je n'avais pas fait attention.... faut dire que c'est la saison du grand bleu, alors je ne me préoccupe pas trop de ça en ce moment. Je viens de jeter un coup d'oeil à mon QuickApp, et même erreur... sauf que depuis 17h ça refonctionne ! Il faut que je vous partage la nouvelle version du QA que j'ai faite, elle corrige le bug avec l'API d'EDF et aussi une autre nouveauté...3 points
-
Thermostat Calcifer Rika Firenet version 1.0 Présentation : Ce QuickApp permet de contrôler la température de consigne d'un poêle Rika avec Firenet. Le mode Domotique OFF permet de passer en lecture seule pour n'avoir que le visuel du Quickapp et garder le contrôle par l'appliweb Firenet. Le Qapp ne supportant pas les requêtes http vers Firenet (retour erroné), j'ai du passer par des scènes. Le Qapp utilise 2 scènes pour envoyer les requêtes http chez firenet : Firenet SetInfo -> est lancée par le quickapp pour pousser les mise à jour chez firenet. Firenet GetInfo -> tourne toutes les 10 secondes pour mettre à jour l'interface du quickapp. Prérequis : Disposer d'un compte firenet avec un poël Rika. Installation du QuickApp : importer le fichier Quickapp créer la scène Firenet SetInfo créer la scène Firenet GetInfo Modifications des variables dans les variables du quickapp : Stove -> numéro du poele user -> nom d'utilisateur firenet password -> mot de passe firenet Modifications des variables dans le code main du quickapp : local IDSC_Firenet_SetInfo = XXX -- ID de la scène Firenet SetInfo Modifications des variables dans le code de la scène Firenet GetInfo : local IDQappCalcifer = XXX -- ID du Quickapp Calcifer Modifications des variables dans le code de la scène Firenet SetInfo : local IDQappCalcifer = XXX -- ID du Quickapp Calcifer Changelog : v1.00 : mai 2025 Version initiale Téléchargement : Nouvelle installation : importer le fichier suivant pour créer un nouveau QuickApp Calcifer_Firenet.fqa créer les 2 scènes en y copiant le code. Firenet GetInfo.lua Firenet SetInfo.lua Mise à jour : copier/coller le contenu des fichiers suivants dans le QuickApp existant et les 2 scènes existantes : Quickapp : Qapp IHM.txtQapp Tools.txtQapp main.txt Scènes : Firenet SetInfo.luaFirenet GetInfo.lua2 points
-
Si l'on veut que ce forum continue, il faut se MOBILISER Pas de soucis j'en informe PAPA NOËL2 points
-
Non utilisateur de ces icônes mais je félicite le travail d'écoute vis à vis du client 👌🏼😁2 points
-
Une petite précision, les agents de l'ex-EdF, dont Enedis, n'ont pas le statut de fonctionnaire, mais d'agent des Industries Électriques et Gazières (IEG), qui par la force des syndicats a fini par être plus avantageux que celui de fonctionnaire : augmentaions régulières, avantages sociaux (la CCAS d'EdF, gérée par la CGT, employait plus de 4000 personnes qui, pour l'anecdote, se mettait en grève pour protester contre leur employeur).2 points
-
Il est peut être temps de parler finance...... Pour le forum ?2 points
-
De mémoire (elle évolue ...), le Reboot a "toujours" fonctionné, mais c'est le shutdown qu'ils ont arrêté (d'ailleurs dans l'interface web, on sait lancer un redémarrage, mais pas un arrêt, de la box)1 point
-
La commande simule ce que tu es sensé avoir avec le backup mais sans faire le backup. Soit tu as introduit une erreur dans le script initial soit ??? Donc on fait pareil sans le script et on voit le résultat. Tu tapes direct au clavier: cat UnFichierExsistant 2>&1 | tee -a X.test la commande cat va lire un fichier désigné par UnFichierExsistant et son contenu sera affiché sur l'écran ainsi que les erreurs éventuelles. la suite | tee -a X.test : copie cette sortie dans le fichier X.test en mode ajout. Donc si dans ton fichier UnFichierExsistant il y a : TEST_JOJO tu va retrouver ce même texte dans X.test . C'est ce que fait la commande de lancement du script de backup et qui donne les informations a tee pour écrire les résultats et les erreurs dans le .out C'est simplement pour voir comment ça se comporte or du script . Ça ne résoudra pas le PB initial. Résumé et essais nota : iMac-M3:~ henri$ ça c'est le Promt de ma console Unix iMac-M3:~ henri$ echo TEST_Jojo > UnFichierExistant Création du fichier UnFichierExistant contenant TEST_Jojo iMac-M3:~ henri$ cat UnFichierExistant 2>&1 | tee -a X.test Lecture du fichier et création de X.test TEST_Jojo Ce qui s'affiche c'est le contenu de UnFichierExistant iMac-M3:~ henri$ cat X.test Lecture de X.test TEST_Jojo Le test à fonctionné puisqu'on retrouve le contenu de l'action cat UnFichierExistant 2>& dans X.test (TEST_Jojo ) De toutes façons la commande indiquée plus haut fourni par @Lazer en début de ce POST pour lancer le backup Fonctionne ...QUi en aurait douté ? En fait je ne sais pas si ces explicationst'aident à comprendre ou ça t'embrouille les idées encore plus.1 point
-
Je viens de trouver de nouvelle tables json qui peuvent etre exploité pour la collecte de données de l'onduleur http://192.168.1.88/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData Toutes les autres tables sont ici https://github.com/victronenergy/dbus-fronius/blob/master/documents/solar_api_samples.txt solar_api/v1/GetInverterInfo.cgi solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CumulationInverterData solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=3PInverterData solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=MinMaxInverterData solar_api/v1/GetInverterRealtimeData.cgi?Scope=System solar_api/v1/GetSensorRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=NowSensorData solar_api/v1/GetActiveDeviceInfo.cgi?DeviceClass=Inverter solar_api/v1/GetSensorRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=NowSensorData solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=3PInverterData1 point
-
1 point
-
Well, it's a bit tricky. If you use setProperty, it will not call the QAs updateProperty method. Some QAs may have written code to override the logic for QuickApp:updateProperty and then it's not called. The other problem is that the Device:updateProperty that QuickApp:updateProperty inherits from, do update the QuickApp's objects self.properties[prop]=value If we only call setProperty, self.properties.value will differ from fibaro.getValue(self.id,"value") which could cause issues for some QAs... One could check if the device is a QA and call updateProperty, and if not call setProperty... local isQACache = {} local function isQA (id) if isQACache [id]~= nil then return isQACache[id] end local d = __fibaro_get_device (id) if d then for _,i in ipairs(d.interfaces) do if i == 'quickApp' then isQACache[id] = true return true end end end isQACache [ id ]= false end takes on average 10ms per QA for my 200 QAs. And the result is cached so checking same id is then fast...1 point
-
Pour ceux que ca interesse, j'ai posté mon Qapp thermostat-calcifer-rika-firenet.1 point
-
Voila, je me lance dans le partage d'un Quickapp. Soyez indulgent, c'est le premier que je pose ici. Merci pour vos retours / améliorations si vous en avez.1 point
-
1 point
-
1 point
-
1 point
-
1 point
-
1 point
-
C'est reparti à 18:36 ....... [01.06.2025] [18:35:39] [ERROR] [QA_TEMPO RTE_591]: Impossible d'obtenir le statut RTE Tempo [01.06.2025] [18:36:39] [DEBUG] [QA_TEMPO RTE_591]: Interrogation RTE [01.06.2025] [18:36:42] [DEBUG] [QA_TEMPO RTE_591]: Nouvelle couleur RTE du jour : BLEU [01.06.2025] [18:36:42] [DEBUG] [QA_TEMPO RTE_591]: Nouvelle couleur RTE de demain : BLEU1 point
-
Je viens d'avoir exactement le même problème avec un client Son disjoncteur abonné est resté bloqué après un déclenchement différentiel J'ai déplombé la partie supérieur du disjoncteur pour pouvoir le remplacer J'ai aussi déplombé le boitier fusible près du compteur linky afin de pouvoir travailler en sécurité sur le disjoncteur Et j'ai demandé a mon client de prévenir ENEDIS avec son numéro de client afin que ces derniers puisse venir re plomber les deux équipements suite a mon intervention Le client est en attente d'une date d'intervention de la part d'enedis, et il y a un dossier ouvert au près d'enedis suite a cette intervention de ma part. Je précise que je suis électricien a mon compte, et que j'ai ma propre société pour pouvoir effectué ce type d'intervention.1 point
-
Bonjour, La chose s'appelle un disjoncteur d'abonné. Et, malgré son nom il n'appartient pas à l'abonné qui ne peut intervenir que sur les plots de sortie après l'avoir désarmé. Une 'exception': lorsque le compteur (linky) est loin (plus de 30m) du point d'utilisation. L'installation a alors 2 disjoncteurs d'abonné, un à coté du compteur l'autre dans la maison. Dans ce cas le second est propriété de l'utilisateur. Je suis dans ce cas et il m'est arrivé de changer moi même ce second disjoncteur arrivé en fin de vie (il ne voulait plus réenclencher). Mais grâce au premier disjoncteur j'ai fait le remplacement en toute sécurité. Sources: c'est clair là: LEGRAND et ici LABRICOELEC. Le but du compteur linky étant aussi (surtout?) de virer du personnel, toute intervention physique sur place doit être devenue un cauchemar de DRH.... D'où le jeu de patate chaude dont vous êtes victime1 point
-
Oui c'est perturbant mais il faut se dire qu'avant d'exécuter onInit() (que ce soit automatique ou parce que tu sauvegardes) la HC3 va relire tout le code et toutes les pages du QA, et donc inclure les fonctions des pages annexes. C'est pourquoi il faut faire attention à ce que tu déclares dans les pages autres que main.lua !1 point
-
@Jojo: tu vois j'y réfléchi ... Sais tu utiliser 'F12' sous ton explorateur internet? si oui, peux tu m'envoyer une copie de la console au retour de la commande: http://192.168.1.xxx/domocharts/trend.php?HourTableOnly1 point
-
Oui tout à fait C"est typiquement le genre de truc sur lequel on peut buter des heures alors qu'un œil extérieur peut le voir Ce qui fonctionne bien aussi, c'est d'arrêter, faire autre chose, et s'y remettre le lendemain avec un œil neuf justement !1 point
-
Tu peux enlever le Content-Length et la Host. Apparemment d'après Postman les datas sont dans un double tableau imbriqué, essaye donc comme ceci : data = json.encode({{ ["cmd"]="Login", ["param"]={ ["User"]={ ["Version"]="0", ["userName"]="admin", ["password"]="xxxxxxxxxxxxxx" } } }})1 point
-
Oui effectivement. Oui et non. Effectivement sur les nouvelles installations, Enedis règle le disjoncteur d'abonné (=AGCP) au plus gros calibre permis par les câbles installés (généralement c'est 60A), et laisse le compteur Linky faire la coupure en cas de dépassement de la puissance souscrite (c'est parfaitement documenté dans le document NOI-CPT_54E au Chapitre 7 : Contrôle de la puissance par l’organe de coupure du compteur. Et donc cela permet à Enedis de ne plus avoir à se préoccuper de ce disjoncteur, car la limitation de la puissance souscrite dans l'abonnement peut être programmé à distance dans Linky. A la clé, des économies (le technicien n'a plus besoin de se déplacer) et gain de temps (j'ai changé d'abonnement quand je suis passé à Tempo, j'ai appelé à 18h, c'était actif à minuit, génial) Mais, sur les anciennes installations (c'est mon cas), si on n'a jamais augmenté la puissance de son abonnement, alors le disjoncteur d'abonné reste à son calibre initial. Chez moi, il est toujours sur 45A, ce qui me pose des problèmes, car l'hiver dernier il a sauté un peu trop rapidement à mon gout, alors que d'autres fois j'ai tiré laaaaaaargement plus que mon abonnement, et il a tenu bon. C'est tout le problème avec ces vieux disjoncteurs, ils ne sont pas précis du tout, donc c'est problématique quand on s'amuse à s'approcher des limites. Le Linky réalise un calcul numérique de la puissance, c'est beaucoup plus précis, et la coupure intervient comme décrit dans le document cité plus haut. Ainsi, pas de mauvaise surprise (contrairement aux théories complotistes qui avaient cours il y a une dizaine d'année...) Bref c'était pas le sujet.... Reste que le disjoncteur d'abonné est toujours indispensable (et surtout obligatoire), même réglé sur un calibre supérieur (60A comme on l'a vu) à l'abonnement souscrit (45, voire 30A) En effet, d'une part il protège contre les court-circuits (courant très très élevé contre lequel l'organe de coupure du Linky ne peut rien faire), et d'autre part contre les fuites de courant puisqu'il intègre un différentiel de 500mA, ce qui ne sert pas à protéger les humains (il faut des différentiel à 30mA pour ça, dans le tableau de la maison), mais à empêcher les petits malins de se brancher entre la phase et la terre, sinon ça permettrait de consommer gratuitement.... Ouais le truc grippé.... perso j'ai jeté à la poubelle par précaution un vieil interrupteur différentiel qui bloquait de la même façon. Mais c'était possible car c'était dans mon tableau, là dans ton cas, l'histoire avec Enedis Pro je n'ai jamais entendu parler de ça perso. Je pense que @Did doit connaitre, mais il n'est plus trop actif... espérons qu'il t'entende1 point
-
Au sujet du compte et des mots de passe : Le compte a bien les droits d'administration ? Le mot de passe ne comporte pas des caractères trop spéciaux (éviter "!&#" et utiliser seulement "-_" pour voir) ? Avez-vous le 2FA d'activer ? Si oui, essayer en l'enlevant pour voir. Après, il faudrait voir où cela bloque exactement !1 point
-
lit par exemple ceci où @Lazer utilise dans le LUA de main des fonction définies dans d'autres fichiers1 point
-
Non mais le simple fait d'ajouter un autre fichier LUA dans un QA, c'est comme si un require ou include était fait implicitement. Oui, justement, c'est bien l'objectif de pouvoir attacher ces fichiers additionnels au QA. Pas sûr de comprendre ta question. Au démarrage du QA, tout le code LUA contenu dans le fichier main et les fichiers additionnels, est exécuté. Littérallement. Si on organise le code dans des fonctions, c'est pour éviter que le contenu des fonctions soit exécuté au démarrage du QA. Dit autrement, le code LUA qui n'est pas dans une fonction est exécuté au démarrage du QA. On s'en sert généralement pour définir des variables, mais aussi les fonctions... car en LUA les fonctions sont des variables ! Une fois que le QA a démarré, et donc exécuté tout son code, la HC3 appelle la function QuickApp:onInit() Et c'est là dedans qu'on commence réellement à faire des trucs, des choses, et des machins. En option, on peut même faire des bidules. Oui mais attention, on n'exécute pas tools.lua ou utils.lua. Comme dit précédemment, ils sont automatiquement exécutés au démarrage du QA. Ce que tu peux faire, c'est exécuter des fonctions qui se trouvent dans les fichiers tools ou utils. Mais tu devrais commencer doucement. Te familiariser avec un QA de base, c'est à dire avec le fameux onOnit(), puis créer une boucle infinie avec setTimeout(), ajouter des fonctions, réagir aux éléments de l'interface (boutons...), et ensuite tu verras pour ajouter des fichiers avec des fonctions dedans.1 point
-
Le QA interroge la téléinfo toutes les minutes, donc c'est à ce moment-là qu'il essaie d'obtenir les couleurs, dans le champ STGE (c'est un registre qu'il faut décoder bit à bit, il y a plein d'autres informations intéressantes) Mais sa couleur du jour est disponible en permanence, de son coté la couleur du lendemain n'est disponible qu'à 20h. C'est comme ça. C'est aussi tout l'intérêt de mon QA Tempo, c'est qu'il va d'abord chercher l'info sur Internet dès le matin, et la téléinfo n'est qu'une ultime confirmation à 20h (bien utile si les 2 clouds EDF et RTE sont en panne, ou bien si c'est simplement la connexion Internet qui est HS) Le tarif en cours est récupéré depuis le champ PTEC en mode historique, et depuis le champ LTARF en mode standard. Initialement c'était uniquement cette VG qui été utilisée par le QA TEMPO, car je ne savais pas encore extraire les couleurs depuis le registre STGE. Mais depuis que j'ai ajouté le décodage de ce registre STGE, c'est carrément redondant. Enfin, redondant uniquement pour la couleur du jour, car pour la couleur du lendemain le seul moyen de l'obtenir via la téléinfo est depuis le registre STGE, cette nouvelle méthode est donc meilleure.1 point
-
Bonsoir Jojo, Merci pour les fleurs, fallait pas... Surtout avant d'avoir essayé! 1 backup vous manque et tout est dépeuplé.... Oui! j'avais mis ce qui me concerne en commentaire. Mais cela ne t'empêche pas: de vérifier que les DLC correspondent bien à tes besoins... de choisir pour quels types de données tu veux créer des tables _hour (et aussi _day &_month) Oui les DLC de config.inc.php sont ignorées (après beaucoup d'hésitations) ET maintenant il faut aussi définir des DLC pour _hour, _day & _month Là je dois avouer que je me suis dit "et mmrrdd.. j'y avais pas pensé". Bon mais ce n'était qu'un coup de fatigue (ou une préalerte Alzheimer)!!! Il suffit de lancer install.php qui s'occupe de tout en fonction de configPlus.inc.php (ie : tu modifies configPlus.inc.php et tu lances install.php) Si si!; Lazer le faisait pour toi, il se relevait toutes les nuits à minuit pour cela . Trend.php était (et est toujours) appelé par le code du home center un peu après minuit et effectue toutes les mises à jour des tables _hour, _day &_month. Pour les tables _hour cela présente l'inconvénient qu'elle ne sont pas à jour avant minuit (mais à minuit il fait nuit: peut-on être à jour alors? Comme aurait dit ton regretté compatriote Devos) Donc il y a une petite modif du code lua qui appelle trend.php toutes les heures (si la variable 'OuiJeSuisImpatient' est armée....) Bonne soirée.1 point
-
Bonjour, Voici mon code qui fonctionne : -- QuickApp Monitoring Nas Synology pour Fibaro HC3 -- Generic device type have no default actions to handle -- HISTORIQUE -- Adapté de https://www.domotique-fibaro.fr/topic/5682-synology-monitoring/ -- v2.4 (29/08/2015 - jojo) : première version -- merci à Krikroff, Lazer, Steven, mprinfo, FDP2 -- v2.41 (02/09/2015 - jojo) : slider pour double click -- V1.0 (14/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- V1.1 (15/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout du push pour avertir que le serveur n'est plus connecté -- V1.2 (27/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Transformation du QA en "com.fibaro.genericDevice" à la place de "Commutateur binaire" -- Ajout des icônes "serveur allumé" et "serveur éteint" -- V1.3 (29/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout des boutons "Eject Disk" -- Changement rafraîchissement automatique (toute les minutes ==> Check tout le NAS et toutes les 10 secondes ==> Check les Disk USB) -- Améliorations du code -- Lien topic: https://www.domotique-fibaro.fr/topic/14308-quick-app-monitoring-serveur-nas-synology/ -- Utilisation: -- La connexion au NAS se fait par HTTP -- Créer deux variables "IPAddress" & "TCPPort" -- Renseigner votre "LOGIN" et votre "PASSWORD" -- Pour la fonction WOL, utiliser le QA WOL de Fibaro et appellé-le avec la commande: -- ==> fibaro.call(ID, "turnOn") -- Vous pouvez le modifier et l'améliorer à votre guise. ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- PARAMÈTREs UTILISATEUR -- ------------------------------------------------------------------------------------------- -- System variables function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."_DS_1521P" self:trace("==========================================") self:debug("onInit") -- User configurable variables self.login = "xxxx" -- votre login DSM self.password = "xxxx" -- votre mot de psse DSM self.ip = self:getVariable('IPAddress'); self.port = self:getVariable('TCPPort'); self.iconON = 1018 self.iconOFF = 1013 self.variableStatus = "Syno_Masha_Status" self.http = net.HTTPClient({ timeout = 10000 }) self.API_AUTH_ERROR_CODE = { [0] = "Sans erreur.", [100] = "Erreur inconnue.", [101] = "Compte non spécifié.", [400] = "Mot de passe invalide.", [401] = "Compte désactivé.", [402] = "Permission refusée.", [403] = "Unique mot de passe non spécifié.", [404] = "Autentification erronée.", } self.API_RECORD_ERROR_CODE = { [400] = "Exécution ratée.", } self.nbmsg = 0 self.timerOn = false self.isCheckin = false self.nbCheck = 0 --self:autoCheck() self:CheckAll(4) self:updateProperty("deviceIcon", self.iconOFF) end -------------------------------------------------------------------------------------- -- WAKE ON LAN -------------------------------------------------------------------------------------- function QuickApp:uiWoLOnR() fibaro.call(22, "turnOn") end -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- == NE RIEN MODIFIER À PARTIR D'ICI == -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- FONCTION GETRequest: Connexion GET -------------------------------------------------------------------------------------- function QuickApp:GETRequest(payload, callBack) --self:trace("Commande GETRequest") local url = "http://" ..self.ip ..":" ..self.port ..payload --self:debug("The URL: "..url); self.http:request(url, { options= { headers= { ["Connection"] = "keep-alive", ["Accept"] = "application/json" }, method = "GET" }, success = function(response) self.nbmsg = self.nbmsg + 1 --self:debug("NB msg ["..self.nbmsg.."]") if callBack then callBack(response.data) end end, error = function(message) self:trace("error:" ..json.encode(message)) self.nbmsg = 0 self.timerOn = false end }) end -------------------------------------------------------------------------------------- -- AUTHORISATION CONNEXION NAS -------------------------------------------------------------------------------------- function QuickApp:DoAction(action, nbmsgtotal) --self:trace("Test avant ok connected") self.timerOn = true -- API & informations disponibles payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth" self:GETRequest(payload, function (data) jsonTable = json.decode(data) self.version = jsonTable.data["SYNO.API.Auth"].maxVersion if self.version >= 2 then self:trace("Version API Synology OK") self.pathAuth = jsonTable.data["SYNO.API.Auth"].path self.cgiUsed_cpu_mem = "/entry.cgi" self.cgiUsed_sys= self.cgiUsed_cpu_mem self.cgiUsed_temp = self.cgiUsed_cpu_mem self.cgiUsed_vols = self.cgiUsed_cpu_mem self.apiUsed_cpu_mem = "SYNO.Core.System.Utilization" self.apiUsed_temp_system = "SYNO.Core.System" self.apiUsed_sys= self.apiUsed_temp_system self.apiUsed_temp_disk = self.apiUsed_temp_system self.apiUsed_vols = self.apiUsed_temp_system self.apiMethod_cpu_mem="get" self.apiMethod_temp = "info" self.apiMethod_vols = self.apiMethod_temp self.apiStorage_usb= "SYNO.Core.ExternalDevice.Storage.USB" if self.version < 6 then self.cgiUsed_cpu_mem = "/dsm/system_loading.cgi" self.cgiUsed_sys="/dsm/system.cgi" self.cgiUsed_temp = "/dsm/info.cgi" self.cgiUsed_vols = "/dsm/volume.cgi" self.apiUsed_cpu_mem = "SYNO.DSM.SystemLoading" self.apiUsed_temp_system = "SYNO.DSM.Info" self.apiUsed_temp_disk = "" self.apiUsed_vols = "SYNO.DSM.Volume" self.apiMethod_cpu_mem = "getinfo" self.apiMethod_temp = self.apiMethod_cpu_mem self.apiMethod_vols = "list" self.apiUsed_sys="SYNO.DSM.System" end end self:GetSid_Send(action) self:timer(nbmsgtotal + 2) end ) end -------------------------------------------------------------------------------------- -- FONCTION GetInfo: RÉCUPÉRATION DES DONNÉES -------------------------------------------------------------------------------------- function QuickApp:GetInfo() -- CPU info du DSM payload = "/webapi"..self.cgiUsed_cpu_mem.."?api="..self.apiUsed_cpu_mem.."&version=1&method="..self.apiMethod_cpu_mem.."&type=current&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then info_cpu = jsonTable.data.cpu load_mem = jsonTable.data.memory.real_usage self:trace("Memory: "..load_mem.."%") info_cpu_memory = "Memory: "..load_mem.."% " load_cpu = 0 if (self.version < 6) then load_cpu = info_cpu.user*100 else load_cpu = info_cpu.other_load+info_cpu.system_load+info_cpu.user_load end self:trace("CPU: "..load_cpu.."%") info_cpu_memory = info_cpu_memory.."CPU: "..load_cpu.."%" self:updateView("lbl3", "text", "Memoire: " ..load_mem .."% " .."CPU: " ..load_cpu .."%") self:trace("==========================================") end end ) -- Info Température Système info du DSM payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_system.."&version=1&method="..self.apiMethod_temp.."&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then if jsonTable.data.sys_temp ~= nil then temp_system = "Température du Système: " ..jsonTable.data.sys_temp.."°C" else temp_system = "Système: N/A" end self:trace(temp_system) self:updateView("lbl4", "text", temp_system) end end ) -- Info Température des disques -- Prépare string temp_disks = ""; payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_disk.."&version=2&method="..self.apiMethod_temp.."&type=storage&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then local disk_tab = jsonTable.data.hdd_info for nb = 1, #disk_tab do temp_disks = temp_disks..disk_tab[nb].diskno..": "..disk_tab[nb].temp.."°C " end self:trace("Température des Disques: "..temp_disks) self:updateView("lbl5", "text", temp_disks) end end ) -- Info taille des disques -- Prépare string vols_load = "" payload = "/webapi"..self.cgiUsed_vols.."?api="..self.apiUsed_vols.."&version=1&method="..self.apiMethod_vols.."&type=storage&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then local vols_tab = jsonTable.data.vol_info for nb = #vols_tab, 1, -1 do used_size_vol = vols_tab[nb].used_size total_size_vol = vols_tab[nb].total_size occupied_size = self:round(used_size_vol / total_size_vol * 100) vols_load = vols_load..vols_tab[nb].name..": "..occupied_size.."% " end self:trace("Taille des Volumes: "..vols_load) self:updateView("lbl6", "text", vols_load) end end ) -- Affichage IP Serveur self:trace("IP Serveur ", "Serveur connecté: " ..self.ip ..":" ..self.port) self:updateView("lbl1", "text", "Serveur connecté: " ..self.ip ..":" ..self.port) end -------------------------------------------------------------------------------------- -- FONCTION POUR ARRONDIR LES POURCENTAGES -------------------------------------------------------------------------------------- function QuickApp:round(num) local a = math.floor(num*100 + 0.5)/ 100 return a,string.format("%.2f",a) end -------------------------------------------------------------------------------------- -- DÉCONNEXION -------------------------------------------------------------------------------------- function QuickApp:Disconnect() payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&method=Logout&version=6&session=DSM&_sid="..self.SID self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self.nbmsg = 0 self:debug("Deconnection NB messages ["..self.nbmsg.."]") else self:trace("Impossible de déconnecter !") end end ) end -------------------------------------------------------------------------------------- -- TIMER -------------------------------------------------------------------------------------- function QuickApp:timer(nbmsgtotal) if self.timerOn then self:debug("Messages ["..self.nbmsg..", "..nbmsgtotal.."]") if self.nbmsg < nbmsgtotal then fibaro.setTimeout(2000, function() self:timer(nbmsgtotal) end) else self:Disconnect() self.nbmsg = 0 self.timerOn = false self.isCheckin = false self:debug("Messages ["..nbmsgtotal.."] Fin") end end end -------------------------------------------------------------------------------------- -- REFRESH -------------------------------------------------------------------------------------- function QuickApp:autoCheck() self.nbCheck = self.nbCheck + 1 self:CheckAll(4) fibaro.setTimeout(1000*3600, function() self:autoCheck() end) -- 3600 secondes end -------------------------------------------------------------------------------------- -- VÉRIFICATION DE TOUS LES ÉLÉMENTS -------------------------------------------------------------------------------------- function QuickApp:CheckAll(nbOperation) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:GetInfo() end, nbOperation) end end ) heure = os.date("%H:%M:%S") date = os.date("%d/%m") dateheure = string.format(" %s à %s", date, heure) self:updateView("lbl7", "text", "Dernière vérification: "..dateheure) end -------------------------------------------------------------------------------------- -- CRÉATION D'UN NOUVEAU SID ET ENVOI DES COMMANDES -------------------------------------------------------------------------------------- function QuickApp:GetSid_Send(callBack) payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&version=6&method=Login&account="..self.login.."&passwd="..self.password.."&session=DSM&format=sid" self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then self.SID = jsonTable.data.sid callBack() end end ) end -------------------------------------------------------------------------------------- -- BOUTON RAFRAÎCHISSEMENT -------------------------------------------------------------------------------------- function QuickApp:uiCheckOnR(event) self:onInit() end -- Check Connect function QuickApp:CheckConnect(callBack) self.tcp = net.TCPSocket({timeout = 5000}) self.tcp:connect(self.ip, tonumber(self.port), { success = function() self:trace("Check Connect OK") self:updateView("lbl2", "text", "Serveur: Allumé") fibaro.setGlobalVariable(self.variableStatus, "1") self:updateProperty("deviceIcon", self.iconON) -- Mettre ici le code pour l'icone allumé self.tcp:close() if callBack then callBack() end end, error = function(message) self:trace("erreur "..message) self:updateProperty("deviceIcon", self.iconOFF) -- mettre ici le code pour l'icone éteint self:updateView("lbl1", "text", "Serveur connecté: N/A") self:updateView("lbl2", "text", "Serveur: Éteint") self:updateView("lbl3", "text", "Mémoire: N/A") self:updateView("lbl4", "text", "Température Système: NA") self:updateView("lbl5", "text", "Température diques: N/A") self:updateView("lbl6", "text", "Volume des disques: N/A") fibaro.setGlobalVariable(self.variableStatus, "0") -------------------------------------------------------------------------------------- -- ENVOI PUSH TOUTES LES DIX MINUTES -------------------------------------------------------------------------------------- if self.nbCheck%60 == 0 then fibaro.alert("push", {26}, "NAS Synology DS 718+ est éteint: " ..os.date("%H:%M:%S")) end end }) end -------------------------------------------------------------------------------------- -- REDÉMARRAGE DU DISK STATION -------------------------------------------------------------------------------------- -- Bouton Reboot function QuickApp:uiRebootOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:Reboot() end, 1) else self:trace("Trop tot...") end end ) end -- Code Reboot function QuickApp:Reboot() self:trace("Le Disk Station Synology va redémarrer") payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=reboot&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self:trace("Le Disk Station Synology a redémarré !") end end ) end -------------------------------------------------------------------------------------- -- ARRÊT DU DISK STATION -------------------------------------------------------------------------------------- -- ShutDown the disk station function QuickApp:uiShutdownOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:ShutDown() end, 1) end end) end function QuickApp:ShutDown() self:trace("Le Disk Station va s'arrêté") payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=shutdown&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self:trace("Le Disk Station s'est arrêté !") end end ) end -------------------------------------------------------------------------------------- -- FIN DU CODE -- -------------------------------------------------------------------------------------- Ce code est simplifié car je crois que j'avais enlevé la partie sur de l'USB. Le port TCP c'est le port 5000 si vous ne l'avez pas changé. C'est celui d'accès à l'interface d'administration du Synology. Le port 80 est le port utilisé pour les sites web que vous créez sur votre Synology.1 point
-
Batterie de stockage A l'automne dernier, en octobre 2024, j'avais fait un rapide tableau comparatif du cout d'utilisation de quelques batteries du marché, afin de dégrossir le sujet. Afin qu'ils soit exploitable par tout le monde, j'exclue complètement du calcul les notions de profil de consommation, c'est à dire charge/décharge, car on est tous différents. Le calcul présenté ci-dessous est donc uniquement un cout du kWh stocké. Pour cela je prend la capacité brute de la batterie, je considère une profondeur de décharge de 90%. Théoriquement on pourrait aller à 95%, mais je me limite à 90% dans mon calcul se qui permet de compenser partiellement la baisse de capacité progressive de la batterie au fur et à mesure des cycles... en effet, au bout du nombre de cycle annoncé par le fabricant, la capacité n'est plus que de 80% (ou plus réalistement 70% à mon avis...). Et j'applique un rendement de 85% pour la double conversion AC/DC/AC, en pratique il s'avère que ce taux est trop optimiste, car on est plus proche des 80 à 85% chez les meilleurs (Victron), et largement de dessous chez les plus mauvais (notamment toutes les batteries mobiles vendues à grand renfort d'influenceurs sur vos plateformes préférées....). Disons que ce taux optimiste compense la baisse des tarifs qui n'a jamais cessée durant ces 6 derniers mois, donc le cout final reste d'actualité. Et surtout, au delà du cout exacte au centime près, ça permet de visualiser l'immense différence d'une marque à l'autre... Pour comparaison, le prix du TRV EDF BASE est de 0.2016 cts/kWh. Et pour information, mon cout moyen sur 1 an avec abonnement TEMPO est de 0.16 cts/kWh seulement. Donc déjà, quand le cout du kWh stocké est supérieur au cout du kWH acheté chez EDF, on sait qu'on est perdant dès le 1er jour, dit autrement, ajouter un modèle de batterie recommandé par les influenceurs nous fait immédiatement payer l'électricité plus cher, cela nous fait perdre de l'argent, à contre courant total du discours marketing, c'est quand même absolument fabuleux. Alors de là à parler de rentabilité, c'est de la science fiction, euh pardon du fantastique, car la science fiction a une infime chance de se réaliser un jour... On voit que Ecoflow se fait défoncer par le faible nombre de cycle annoncé par le fabricant, là où Pylontech cartonne, surtout qu'ils ont annoncé en 2024 le passage de 6000 à 8000 cycles, certainement grâce à l'amélioration du procédé de fabrication et aux retours terrains. On voit aussi bien que pour un même onduleur, plus on rajoute de modules batteries derrière, plus le prix du kWh baisse, ce qui est logique car on compense le cout fixe de l'électronique (onduleur chargeur convertisseur) A noter que dans les systèmes Sofar & Victron avec batteries Pylontech, je n'ai pas intégré le prix du rack 19" fermé avec vitre qui est normalement obligatoire pour la certification Consuel. Sur Internet on voit plus de photos de systèmes sans le rack qu'avec... chacun prend ses responsabilités. Je trouve que la dernière ligne, avec presque 20 kWh de stockage, a un prix du kWh stocké très intéressant. Maintenant, l'exercice à faire, c'est en fonction du profil de consommation de la maison, enfin surtout de la quantité de surplus photovoltaïque disponible chaque jour, et la quantité d'énergie soutirée chaque nuit, quel est le bon dimensionnement du parc batterie à installer. Et en déduire la durée avant amortissement. Mais intuitivement, sans même faire de calcul, vu que le kWh stocké devient financièrement intéressant pour les grosse capacité, on se doute qu'il doit s'accompagner d'une grosse puissance d'installation PV pour charger cette capacité, et d'une grosse consommation électrique domestique pour la décharger quotidiennement. Conséquence : les batteries ne sont pas rentables pour les petites installations PV et/ou faible consommation électrique les batteries commencent à être rentables pour les grosses installations PV et grosse consommation électrique. Conséquence de la conséquence : il faut investir énormément de pognon pour atteindre le seuil de rentabilité. Je vous passe le détail des calculs dans des tableaux Excel, mais je prévois d'arriver entre 12 et 13 ans de rentabilité.... avec cette durée, je considère la batterie comme non rentable, même si théoriquement, avec du Pylontech et sa durée de vie annoncée pour >15ans, je devrais un jour rentabiliser mon investissement ma dépense. Mais bref, je parle de dépense, car contrairement aux panneaux photovoltaïque, la rentabilité n'est pas l'objectif que je cherche avec la batterie de stockage. Comme je l'avais déjà dit, je pars sur du matériel Victron avec batterie Pylontech. Victron car c'est le plus customisable, on a un contrôle très précis sur chaque paramètre, on choisi quand charger, quand décharger, on défini tous les seuils qu'on souhaite, etc. En outre la marque est réputée depuis de nombreuses années pour sa fiabilité et son suivi, et la qualité de sa documentation Pylontech car j'aime bien le coté modulaire, on peut commencer avec 1 batterie et en ajouter à volonté par la suite. Et là aussi, cette marque est présente depuis de nombreuses années sur le marché et a montré sa fiabilité. Précisément, ce sont ces modèles : Victron Multiplus-II 70/5000 Pylontech US5000 Voici en premier le schéma d'architecture globale du Multiplus, de sa batterie, des charges DC, charges AC, et onduleurs PV existants (rappel : Enphase et APSystems) Et le détail du câblage électrique avec les dispositifs de protection : Plus tard, ce bus DC me permettra d'ajouter un MPPT Victron avec des panneaux qui viendront charger la batterie directement en DC, afin de le limiter les doubles conversions AC/DC/AC et améliorer le rendement. Les convertisseurs DC-DC ne sont là que par pure geekerie, afin de me créer des circuits en courant continu 12V ou 24V pour alimenter un certain nombre d'appareils (domotique ou autre à venir) Plus tard aussi (pas forcément dans cet ordre), j'ajouterai 3 x US5000 aux 3 x US5000 de départ... soit un total de 28.8 kWh de stockage brut (= 27 kWh maxi avec un DoD à 95%) Les objectifs de cette installation sont multiples : Évolutivité Fiabilité Sécurité Respect des normes et réglementation, en particulier la norme UTE-C15-712-2 : Installations photovoltaïques autonomes non raccordées au réseau public de distribution avec stockage par batterie Le Cerbo GX est le cœur du système, le chef d'orchestre, qui permet au système de fonctionner en mode ESS, assure la communication entre le BMS des batteries et le Multiplus, agrège les données, et remonte les statistiques. C'est optionnel, mais j'ai ajouté des compteurs ET112 et VM-3P78CT afin de remonter les statistiques dans les interfaces de supervision GX Touch et VRM de chez Victron, ce n'est pas du tout nécessaire au bon fonctionnement de l'ensemble. J'ai déporté la pince de mesure du Multiplus sur l'arrivée générée Enedis afin qu'il puisse réguler la charge/décharge en fonction du surplus disponible ou de la consommation de la maison. La régulation est plus réactive qu'avec un compteur (ET112 ou autre modèle) généralement conseillé par Victron, c'est d'autant plus important chez moi où les brusques variations sont fréquentes (passage de nuages, démarrage d'équipements consommateurs) L'inverseur de source, outre le fait qu'il soit obligatoire selon les normes, permet de basculer la maison soit sur la sortie secourue du Multplus (permettant un fonctionnement au totale autonomie en cas de coupure secteur), soit sur l'arrivée générale Enedis par exemple en cas d'intervention ou de panne sur le Multiplus. Le Multiplus étant un modèle de 5 kVA, je suis limité à 5 kVA pour la puissance des panneaux qu'on peut installer sur la sortie secourue, règle du Facteur 1.0 en AC-Coupling : https://www.victronenergy.com/live/ac_coupling:start C'est parfait pour mes micro-onduleurs Enphase IQ7+ dont la puissance crête est de 4720 Watts, d'autant plus qu'en cas de fonctionnement en autonomie (off-grid), les onduleurs Enphase sont compatible avec le frequency-shifting afin de réduire voire arrêter leur production quand la batterie est pleine (et qu'on ne peut pas envoyer le surplus vers le réseau car on fonctionne en autonomie) En revanche, impossible d'y ajouter également les onduleurs APSystems DS3-L, d'une part car la puissance serait trop importante, et d'autre par car ils ne sont pas compatibles frequency-shifting. Donc je les installe sur l'entrée AC-In du Multiplus (avec un compteur optionnel pour les statistiques comme déjà mentionné). Le fonctionnement est identique, sauf qu'en cas de fonctionnement off-grid (ce qui est ultra rare chez moi, on a certaines années avec 0 coupure secteur) ils seront arrêtés puisque couplés au réseau publique et non au réseau secouru contrairement aux IQ7+. Il reste le chargeur VE, que j'hésite encore à câbler sur l'entrée ou la sortie du Multiplus, pour l'instant je le laisse en entrée, de toute façon ça n'apporterait rien de le mettre sur la sortie, si ce n'est risquer de mettre le Multiplus en sécurité si on lançait par erreur une charge à un courant élevé alors que le système est en fonctionnement off-grid. Plus tard (bientôt normalement, en 2025) j'ajouterai un second chargeur, le modèle de chez Victron, qui lui sera coté réseau secouru pour des contraintes de câblage. J'ai acheté le gros du matériel (en particulier le Multiplus et les Pylontech) chez nkon.nl. Le reste provient de différents sites, parmi lesquels laboutique-solaire.com, batterie-solaire.com, comptoir-du-cable.com, materielelectrique.com, 123elec.com, elec44.fr, je recommande tous ces sites. Pour les batteries Pylontech j'ai pris un rack Socamont Ligne 500 27U 600x600mm référence 52766KSVPPPL en kit, que j'ai assemble directement à la cave, car il est impossible de descendre un rack pré-assemblé : https://www.socamont.com/baie-en-kit-ligne-500-27u-600x600mm-porte-avant-simple-verre-porte-arriere-panneau-plein-avec-panneaux-lateraux-71026.html Et des étagères Socamont référence 71051 : https://www.socamont.com/rail-l-type-l-600-prof-baie-600mm.html Pour information j'ai acheté tout ça chez brico-reseau.com Voici la photo des batteries juste posées dans le rack qui vient d'être assemblé, j'ai simplement retiré les façades temporairement :1 point
-
Grosse mise à jour du QuickApp, désolé pour le temps que j'ai mis à partager tout ça, j'avais beaucoup de retard dans le partage des mises à jour : v1.30 : Mars 2022 Le type FilPilote est maintenant de type "com.fibaro.multiPositionSwitch" Ajout du paramètre optionnel "virtualPower" pour les devices de type energy permettant le calcul de la puissance instantanée Améliorations mineures v1.31 : Mai 2022 Bug fix v1.40 : Septembre 2023 Intervalle de rafraichissement personnalisable pour chaque API Ajout de la tension (voltage) depuis la Téléinfo avec Get=TI Connexion API M2M sur le port TCP 9870 Amélioration de la gestion du QuickApp disabled (https://forum.fibaro.com/topic/49113-hc3-quickapps-coding-tips-and-tricks/page/66/#comment-250596) v1.50 : Janvier 2024 Ajout du courant IRMS1 depuis la Téléinfo avec Get=TI Ajout du décodage du registre STGE de la Téléinfo depuis Get=TI, apportant notamment la récupération des couleurs de l'abonnement TEMPO Ajout du paramètre optionnel color permettant de configurer des couleurs personnalisées d'affichage des messages dans le log Correction de certaines traductions v1.51 : Mai 2025 Le tutoriel a été mis à jour en 1ère page avec les indications pour la configuration. Mise à jour : copier/coller le contenu des fichiers suivants dans le QuickApp existant : Fichier main : GCE v1.51 - Main.lua Fichier GCE : Library - GCE v1.51.lua Fichier tools : Library - tools v2.30.lua1 point
-
Toute petite évolution : [Domadoo] Matter 1.4.1 simplifie la configuration de votre domotique [Abavala] Matter 1.4.1 : une petite MAJ pour une simplicité accrue1 point
-
C est ça. Moi il me faudrait toujours plus, avec les batteries qui arrivent la, encore plus Et derrière mon PowerReducer fait des miracles pour convertir le reste en chaleur. Vais installer un hammam tiens :)1 point
-
Non, toujours pas. Même réponse que la dernière fois1 point
-
Non. Allez, un indice tout de même, mais c'est uniquement parce que je suis très gentil : la section s'intitule : "Nouveau ? Présentez-vous"1 point
-
1 point
-
Ca y est ! A force de relire et faire des exercices cérébraux pour comprendre la dynamique et ton message, je viens d'être éclairé, ou plutôt Laserifié Maintenant que j'ai compris sa lecture, on verra si j'arrive à le réutiliser dans une autre situation ou un autre QA en écriture seul comme un grand1 point
-
En fait le principe de base est relativement simple, puisque ça consiste à appeler une fonction en lui donnant un paramètre, ce paramètre est une variable de type "function" (pour rappel en LUA, les fonctions sont des variables au même titre que les autres type : string, table, number, etc) La fonction appelée s'exécute... puis à un moment elle va exécuter la fonction qui lui a été donnée en paramètre (le paramètre que j'ai appelé "callback" dans mon exemple) Une fois que tu as compris ça, il n'y a plus de limite, tu peux enchainer les rappels de fonctions à volonté.1 point
Ce classement est défini par rapport à Paris/GMT+02:00