flexje schreef op vrijdag 10 mei 2019 @ 19:28:
Zoals eerder vermeld ben ik bezig met een Telegram bot projectje waarmee ik Domoticz wil aansturen.
Om dit te realiseren heb ik ervoor gekozen om Node-Red als 'bridge' te gebruiken. Ik heb niet veel ervaring met Node-Red maar een uitdaging durf ik altijd wel aan.
Mogelijkheid op dit moment:
- Status van een device opvragen dmv een inline-keyboard
[Afbeelding]
To-Do:
- Dynamisch inladen van devices + idx vanuit Domoticz (Floorplan) naar de inline-keyboard node;
(http://domoticzIP:domoticzPort/json.htm?type=command¶m=getplandevices&idx=<planID>)
- Status aanpassen (switchen/toggle) met terugkoppeling van status naar TGB;
Hoe werkt het op dit moment?:
Allereerst heb je nodig:
- Domoticz
- Node-Red
- node-red-contrib-telegrambot (
https://flows.nodered.org/node/node-red-contrib-telegrambot)
- Een telegram bot (Botfather ->
https://core.telegram.org/bots#6-botfather)
- Je chatId van de nieuw aangemaakte telegram bot (Ga naar:
https://api.telegram.org/bot**JEBOTAPITOKEN**/getUpdates en vind hier je chatid).
Stap 1:
Allereerst maak je met Botfather een nieuwe bot aan. Zie link hierboven. Zodra je deze hebt aangemaakt en je hebt ertegen "gepraat" vraag je de
API token aan. Deze heb je nodig om de telegram bot straks te configureren in Node-Red.
Stap 2:
Ga naar je Node-Red webservice en voeg de
node-red-contrib-telegrambot palette:
[Afbeelding]
Stap 3:
Aan de linkerkant zie je nu de nieuwe telegram nodes en voeg dan de volgende flow toe:
[Afbeelding]
Bij het toevoegen van de eerste
Command node geef je de /status command op en configureer je je telegram node:
[Afbeelding]
Vul de Botnaam, Token en chatId in (zie bovenin voor instructies).
Stap 4 (dit stuk wil ik dus nog dynamisch maken):
Na de command node -> voeg je een
Function node toe (inline-keyboard) met de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| context.global.keyboard = { pending : true };
var opts = {
//reply_to_message_id: msg.payload.messageId,
reply_markup: JSON.stringify({
"inline_keyboard": [[
{
"text": "Voordeur",
"callback_data": "21"
},
{
"text": "Achterdeur",
"callback_data": "66"
},
{
"text": "Keukenraam",
"callback_data": "77"
},
],
[
{
"text": "CV Thermostaat",
"callback_data": "153"
},
{
"text": "Woonkamer temperatuur",
"callback_data": "154"
}
]
]
})
};
msg.payload.content = "Welk apparaat zoek je " + msg.originalMessage.from.first_name +"?";
msg.payload.options = opts;
return msg; |
Stap 5:
Koppel aan de inline-keyboard een
Sender Node (geef wel weer je bot op in de node config)
Stap 6:
Voeg los van de pas gemaakte flow een aparte flow met een
Event node en kies in de node settings voor een Callback Query
Stap 7:
Koppel aan de callback_query node een
Change node en configureer deze als volgt:
[Afbeelding]
Stap 8:
Koppel aan de Change node een
HTTP request node:
[Afbeelding]
Deze node vraagt de JSON data op vanuit Domoticz met de IDX in de {{{query}}} parameter welke opgegeven is uit de inline-keyboard. Hierna gooit ie de data in objecten.
Stap 9:
Koppel aan de HTTP request weer een
Function node en code als volgt:
code:
1
2
3
4
5
6
7
| msg.payload.content = "_'" +msg.payload.result[0].Name+ " is ";
msg.payload.content += "" +msg.payload.result[0].Data+ "'_";
msg.payload.content += "\r\n-- Graag gedaan " + msg.originalMessage.from.first_name;
msg.payload.chatId = JECHATID;
msg.payload.type = 'message';
msg.payload.options = {parse_mode : "Markdown"};
return msg; |
Stap 10:
Als laatst koppel je weer een
Sender node aan de Function node.
Dit werkt nu voorlopig ok. Alleen soms raakt de bot een beetje overstuur lijkt het. Als je dan de command node verandert naar bijv. /status1 en je vraagt weer de devices op doet ie het weer.
Graaaag, als jullie verbeteringen zien of een mogelijkheid om dit efficienter te krijgen hoor ik het zeer graag.
Nogmaals, heb weinig ervaring met Node-Red maar voor een bouwvakker vind ik dit aardig gelukt tot nu toe!
