Page 1 sur 1

[LUA] Script pour piloter Domoticz à partir de Telegram

Publié : 07 févr. 2023, 22:23
par cuici
Bonjour,

Ce petit script Lua permet de scruter la messagerie Telegram et de déclencher des actions en fonction du message reçu.

Il faut préalablement avoir créé un bot (voir https://www.domoticz.com/wiki/Telegram_Bot) et récupérer sa cléAPI (la même que celle indiquée dans la partie notification de Domoticz).

Code : Tout sélectionner

--Telegram : pilotage de Domoticz à partir de Telegram
-- Fonctionnement en cycle, script à jouer en mode Trigger=Time
-- utilise la variable utilisateur messageIdTelegram de type chaine (à créer)
local cleApi = '123456:ABCDEFGHIJKLMNOP'
local urlMonBotTelegram ='https://api.telegram.org/bot'..cleApi..'/getUpdates?offset=-1'
local cycle=2 --toutes les 2 minutes
local reponse=''
local idxConsigneChaudiere = 108 --id thermostat chaudiere

commandArray = {}
    --scrutation
    local time = os.date("*t")
	if ( time.min%cycle == 0 ) then
        --print('interrogation Bot Telegram ');
        handler = assert(io.popen('/usr/bin/curl -m5 "'..urlMonBotTelegram..'"'))
	    reponse_json = handler:read('*all')
	    handler:close()
	    --print(reponse_json)
	    
	    if (string.find(reponse_json,"message_id") ~= nil) then
	        local message_id = domoticz_applyJsonPath(reponse_json,'.result[0].message.message_id')
	        
	        if (tostring(message_id) ~= uservariables["messageIdTelegram"]) then
	            commandArray['Variable:messageIdTelegram'] = tostring(message_id)
	        
	            local message_text =domoticz_applyJsonPath(reponse_json,'.result[0].message.text') 
	            message_text = message_text:lower()
	            print ('message Telegram = ' .. message_text)
	        
	            -- demander les temperatures de la maison 
	            if (message_text == 't') then
	                local tempSejour = tonumber(otherdevices_svalues['Temperature_Sejour'])
                    local tempCombles = tonumber(otherdevices_svalues['Temperature_Combles'])
                    local tempExterieur = tonumber(otherdevices_svalues['Temperature_Exterieur'])
                    local tempChambre= tonumber(otherdevices_svalues['Temperature_Chambre'])
                    local consigneChaudiere = tonumber(otherdevices_svalues['ConsigneTemperatureChaudiere'])
	                reponse = 'Sejour:'..tempSejour..' Chambre:'..tempChambre..' Exterieur:'..tempExterieur..' Combles:'..tempCombles..' Consigne:'..consigneChaudiere
	            end
	    
	            -- Changer la consigne de la chaudiere, format : c <temperature> , exemple: c 19
	            if (message_text:sub(1,1) == 'c') then
	                local consigne = message_text:sub(-2)
	                --print(consigne)
	                commandArray['UpdateDevice'] = idxConsigneChaudiere .. '|0|' .. consigne
	                reponse='Consigne chaudiere mise à '..consigne
	            end
	    
	            --Activer l'alarme, format : a on   ou a off
	            if (message_text:sub(1,1) == 'a') then
	                local etat = message_text:sub(-2)
	                if (etat=='on') then
	                    commandArray['SecurityPanel'] = 'Arm Away'
                    else
                        commandArray['SecurityPanel'] = 'Disarm'
	                end
	                reponse='Alarme mise à '..etat
	            end
	            
	            --Envoyer un accusé de réception
	            if (reponse ~='') then
	                commandArray['SendNotification']=reponse..'#'..reponse..'#0#0#0#telegram'
	            end
            end
        end
    end
return commandArray


Re: [LUA] Script pour piloter Domoticz à partir de Telegram

Publié : 08 févr. 2023, 09:23
par lost
Hello,

Pourquoi passer/dépendre d'un service tiers, utilisé en pooling (pour désactiver l'alarme, on peut ici devoir attendre 2mn avant de pouvoir entrer), pour déclencher des actions possibles en direct via l'API HTTP(S)/JSON?

Certes, cela n'est simple que si on a déjà ouvert son HTTPS à l'extérieur, ce qui requiert un nom de domaine (no-ip...) et mis en place un certificat via letsencrypt...

Pour quelques actions ou passer par l'interface web mobile n'est pas très adapté, j'avais alors parlé d'une petite appli Android (dispo sur google store ou f-droid) ici:
viewtopic.php?p=107639#p107639

Depuis j'ai d'ailleurs un peu amélioré l'affaire, permettant de mieux gérer les mots de passe en particulier (la fonctionnalité intégrée les présente à chaque fois, avec le risque de le modifier par erreur avec le tactile quand on a des gros doigts comme moi ; J'ai donc géré moi même et on ne le redemande, afin de pouvoir au besoin changer celui enregistré, que si on se prends une erreur 401 à la tentative de connexion).

Initialement il n'y avait qu'un palliatif au fait qu'Androïd gère comme un pied l'aiguillage selon qu'on est connecté à son LAN en wifi ou pas.

Je ferais une MAJ du fil initial si qqun veut s'y mettre.

Re: [LUA] Script pour piloter Domoticz à partir de Telegram

Publié : 08 févr. 2023, 10:24
par cuici
Bonne remarque Lost. L'idée de ce script est bien d'interagir avec Domoticz sans l'exposer à l'extérieur. Il n'a pas d'intérêt si l'accès distant est déjà possible.

Le script n'est pas adapté pour déclencher des actions immédiates comme la désactivation de l'alarme quand on rentre mais il permet d'activer l'alarme à distance si on a oublié, ou régler le chauffage avant de rentrer de vacances, etc.