Telegram: Process Answer

logo

IMPORTANT: this rule template builds rules including a Blockly script action involving blocks from the Telegram block library. Make sure you have it installed.

This rule template will build the skeleton of a rule processing answers to a Telegram query.
A query is a message from a bot with buttons similar to this:

Clicking on a button will update items provided they are linked to the proper channels of the Telegram bot Thing.

This rule template, combined with the Telegram block library, can be used to build complex conversations with a Telegram bot.

The rule will build a Blockly action looking like this ({{placeholders}} will be replaced with the actual values you select when creating the rule from the template):

image

You should keep the “reply on Telegram” blocks (change the message as you like) but can add more blocks to the alternative branches of the “if” block to perform actions as desired.
You can even use the “ask on Telegram” block to continue the conversation - just be sure to choose another replyId, and create another rule from this template to respond to this new replyId!

Language: Nashorn JavaScript

Dependencies: see above

Changelog

Version 0.1

  • initial release

Resources

uid: "telegram:answer"
label: "Telegram: Process Answer"
description: React when a query on Telegram was answered.
configDescriptions:
  - context: thing
    description: The Telegram bot Thing
    label: Bot Thing
    name: botThingUid
    required: true
    type: TEXT
    options: []
  - context: item
    description: The item linked to the bot's Reply Id channel
    label: Reply Id Item
    name: replyIdItem
    required: true
    type: TEXT
  - description: The reply Id to react to. Must be the same as the one you specified in the query.
    label: Reply ID
    name: replyId
    required: true
    type: TEXT
  - context: item
    description: The item linked to the bot's lastMessageText
    label: Last Message Item
    name: lastMessageItem
    required: true
    type: TEXT
  - defaultValue: Yes
    description: The answer to look for as the first alternative.
    label: Alternative 1 Answer
    name: alternative1Choice
    required: true
    type: TEXT
  - defaultValue: No
    description: The answer to look for as the second alternative. If you need more alternatives, add a branch to the 'if' block of the action after creating the rule.
    label: Alternative 2 Answer
    name: alternative2Choice
    required: true
    type: TEXT
triggers:
  - id: "1"
    configuration:
      itemName: "{{replyIdItem}}"
      state: "{{replyId}}"
    type: core.ItemStateUpdateTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    label: Process Telegram answer
    description: Blockly script to identify the answer and process it
    configuration:
      blockSource: |
        <xml xmlns="https://developers.google.com/blockly/xml">
          <variables>
            <variable id="]NdHjLpa-(_]Q)uEvvGJ">botThingUid</variable>
            <variable id="3m-I-4g.$.+wA4otUR9p">answer</variable>
            <variable id="@;%RDo@e:+G[MLM#5Qo9">replyId</variable>
          </variables>
          <block type="variables_set" id="$X9%vG|sZkGv61|Ae[;=" x="81" y="40">
            <field name="VAR" id="]NdHjLpa-(_]Q)uEvvGJ">botThingUid</field>
            <value name="VALUE">
              <block type="oh_thing" id="]i8NnRB|=:`Eu4d@oCqG">
                <field name="thingUid">{{botThingUid}}</field>
              </block>
            </value>
            <next>
              <block type="variables_set" id="Y;Nu;v3Y2jXEOu(`2R8B">
                <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                <value name="VALUE">
                  <block type="oh_getitem_state" id="qrq0u086y%tIOdk^qQma">
                    <value name="itemName">
                      <shadow type="oh_item" id="EEKzhXffN~8D-VR0PwZP">
                        <field name="itemName">{{lastMessageItem}}</field>
                      </shadow>
                    </value>
                  </block>
                </value>
                <next>
                  <block type="variables_set" id="?h8mePt?e^tut^a@k$CK">
                    <field name="VAR" id="@;%RDo@e:+G[MLM#5Qo9">replyId</field>
                    <value name="VALUE">
                      <block type="text" id="L]_7`E#5dp_uph@ua9yY">
                        <field name="TEXT">{{replyId}}</field>
                      </block>
                    </value>
                    <next>
                      <block type="controls_if" id="rLB8FB#hiSS%3BS$q*%C">
                        <mutation elseif="1" else="1"></mutation>
                        <value name="IF0">
                          <block type="logic_compare" id="),/|b(LM#+t9M1^CwjsZ">
                            <field name="OP">EQ</field>
                            <value name="A">
                              <block type="variables_get" id="8XG+(h^?dam`kF^FVV(7">
                                <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                              </block>
                            </value>
                            <value name="B">
                              <block type="text" id="eiAd$E0wz2y4y2ve{C+?">
                                <field name="TEXT">{{alternative1Choice}}</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <statement name="DO0">
                          <block type="telegram_answer" id="J*O2%+Q}G7yFmavTUJcB">
                            <value name="MESSAGE">
                              <shadow type="text" id="$=g=]-$1{?B2D!H#sq6O">
                                <field name="TEXT">Ok!</field>
                              </shadow>
                              <block type="text_join" id="5$OP84^l*@mHRFx5]8on" inline="true">
                                <mutation items="2"></mutation>
                                <value name="ADD0">
                                  <block type="text" id="NqDd)E`].@.UV5GlgSka">
                                    <field name="TEXT">You answered: </field>
                                  </block>
                                </value>
                                <value name="ADD1">
                                  <block type="variables_get" id="%JFm4%Edxzz#mop+SoFo">
                                    <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="REPLY_ID">
                              <block type="variables_get" id="{h#8V)-Hx-gf=``n#7-X">
                                <field name="VAR" id="@;%RDo@e:+G[MLM#5Qo9">replyId</field>
                              </block>
                            </value>
                            <value name="BOT">
                              <shadow type="oh_thing" id="MCk,03mgcGk4I]0N(jrK">
                                <field name="thingUid">MyThing</field>
                              </shadow>
                              <block type="variables_get" id="D^?g`s|I^5)-Bh$|$kUt">
                                <field name="VAR" id="]NdHjLpa-(_]Q)uEvvGJ">botThingUid</field>
                              </block>
                            </value>
                          </block>
                        </statement>
                        <value name="IF1">
                          <block type="logic_compare" id=",uI]%B[%A74:/FB=Wy~9">
                            <field name="OP">EQ</field>
                            <value name="A">
                              <block type="variables_get" id="vq|P|@/}?bVxRqo*pn*z">
                                <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                              </block>
                            </value>
                            <value name="B">
                              <block type="text" id="pEDFa2K5SE?pq{}VVqnS">
                                <field name="TEXT">{{alternative2Choice}}</field>
                              </block>
                            </value>
                          </block>
                        </value>
                        <statement name="DO1">
                          <block type="telegram_answer" id="Y%P^M%f#Wi!8pory[|gy">
                            <value name="MESSAGE">
                              <shadow type="text">
                                <field name="TEXT">Ok!</field>
                              </shadow>
                              <block type="text_join" id="lb3ENrWk]RqHL(lM~mwJ" inline="true">
                                <mutation items="2"></mutation>
                                <value name="ADD0">
                                  <block type="text" id="th3?e@FU!.n8z?]P%6w)">
                                    <field name="TEXT">You answered: </field>
                                  </block>
                                </value>
                                <value name="ADD1">
                                  <block type="variables_get" id=")SJX+rNQ~YdVF$NAP;XU">
                                    <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="REPLY_ID">
                              <block type="variables_get" id="n0K?hd@DMWvZIjp?yCm3">
                                <field name="VAR" id="@;%RDo@e:+G[MLM#5Qo9">replyId</field>
                              </block>
                            </value>
                            <value name="BOT">
                              <shadow type="oh_thing">
                                <field name="thingUid">MyThing</field>
                              </shadow>
                              <block type="variables_get" id="S+Wg)%DU+oqch9cXw!?h">
                                <field name="VAR" id="]NdHjLpa-(_]Q)uEvvGJ">botThingUid</field>
                              </block>
                            </value>
                          </block>
                        </statement>
                        <statement name="ELSE">
                          <block type="telegram_answer" id="1RvKVI)8}S?rap$aa}o!">
                            <value name="MESSAGE">
                              <shadow type="text">
                                <field name="TEXT">Ok!</field>
                              </shadow>
                              <block type="text_join" id="HD2X|R93R9B:Bf6knIaq" inline="true">
                                <mutation items="2"></mutation>
                                <value name="ADD0">
                                  <block type="text" id=",7yp2H,};$nKL1jC2_iw">
                                    <field name="TEXT">Invalid answer: </field>
                                  </block>
                                </value>
                                <value name="ADD1">
                                  <block type="variables_get" id="l%uo-zo4c#fl?f=X6nPw">
                                    <field name="VAR" id="3m-I-4g.$.+wA4otUR9p">answer</field>
                                  </block>
                                </value>
                              </block>
                            </value>
                            <value name="REPLY_ID">
                              <block type="variables_get" id="cQrnV*y)Uy!%)Q%q0}`[">
                                <field name="VAR" id="@;%RDo@e:+G[MLM#5Qo9">replyId</field>
                              </block>
                            </value>
                            <value name="BOT">
                              <shadow type="oh_thing">
                                <field name="thingUid">MyThing</field>
                              </shadow>
                              <block type="variables_get" id="lOZ-B!]R}6EpaD!U~H7r">
                                <field name="VAR" id="]NdHjLpa-(_]Q)uEvvGJ">botThingUid</field>
                              </block>
                            </value>
                          </block>
                        </statement>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </xml>      
      type: application/javascript
      script: >
        var botThingUid, answer, replyId;


        var things = Java.type('org.openhab.core.model.script.actions.Things');



        botThingUid = '{{botThingUid}}';

        answer = itemRegistry.getItem('{{lastMessageItem}}').getState();

        replyId = '{{replyId}}';

        if (answer == '{{alternative1Choice}}') {
          things.getActions('telegram', botThingUid).sendTelegramAnswer(replyId, 'You answered: ' + String(answer));
        } else if (answer == '{{alternative2Choice}}') {
          things.getActions('telegram', botThingUid).sendTelegramAnswer(replyId, 'You answered: ' + String(answer));
        } else {
          things.getActions('telegram', botThingUid).sendTelegramAnswer(replyId, 'Invalid answer: ' + String(answer));
        }
    type: script.ScriptAction

(NOTE: The blockSource XML has been indented for clarity but altering the script will minify it in a single line again)

4 Likes

is that kind of answering with normal .rules files possible? Has anyone an example ? ( I ask, because I converted from OH2 to OH3, and still using my .rules file instead of UI Rule Config or blocky for old rules).
thanks a lot.

Yes.

have a look to the last block of examples on the docs page at Telegram - Bindings | openHAB it shows an example of sending a “questionaire” and reacting on the answer of the user.