NEWS
Konversation mit dem BOT via Telegram
-
Hallo in die Runde,
da ich aufgrund der baulichen Begebenheiten kein permanentes Auslesen des Stromzählers automatisieren kann, würde ich dies gerne während des wöchentlichen Waschgangs machen.
Bis jetzt notiere ich mir den Zählerstand und schreibe diesen manuell in einen Datenpunkt welcher von sourceanalytics aufbereitet wird.
Bislang habe ich es nur fertig gebracht, entweder:
- Werte vom iobroker via Telegram zu erhalten (Waschmaschine fertig, Post ist da, usw...)
- Kommandos zusenden (schalte Licht an, usw.)
Jetzt würde ich gerne eine halbe Konversation mit dem iobroker via Telegram starten.
Zum Beispiel:
- Ich sende Strom2048 --> In diesem Fall wäre 2048 der Zählerstand
- lasse im Text nach Strom suchen und lass den Rest in den Datenpunkt schreiben
- iobroker rechnet und schickt mir meinen aktuellen Verbrauch, Kosten, usw.
Leider komme ich im Blockly, mit dem nach Text suchen, nicht weiter.
Ich kann zwar nach Strom filtern, habe aber noch nicht verstanden, wie ich den Zählerstand rausnehmen kann. Das in abspeichern in den Datenpunkt und Übersendung der Verbräuche ist klar.
Hat Jemand eine Idee, wie man dies umsetzen kann?
Gruss
-
anbei ein kleines Script:
var vEingabe = getState("telegram.0.communicate.request").val; // Test Eingabe per telegram auf dem Handy var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); vEingabe = vEingabe.replace("Strom", ''); log (vEingabe);
Unter vUser hast du zusätzlich noch den User der es gesendet hat.
Und vEingabe hast du dann den Wert mit dem du weiterarbeiten kannst.Bei Blocky bin ich raus.
-
@bahnuhr Super Danke Dir, habe es testweise mit meinen 10min JavaScript google Kenntnissen sogar fertig gebracht, es in einem Datenpunkt zu schreiben.
var vEingabe = getState('telegram.0.communicate.request'/*Last received request*/).val; // Test Eingabe per telegram auf dem Handy var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); vEingabe = vEingabe.replace("Strom", ''); setState('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe); log (vEingabe); console.log (vEingabe);
Leider schreibt er in den Datenpunkt alles was bei Telegram rein kommt. Somit müsste ich erst noch eine If Abfrage rein basteln müssen, dass er nur Werte übernimmt, wenn die lastrequest "Stom" war.
Da es funktioniert markiere ich es als gelöst, sollte Jemand jedoch bei der Blockly Weise weiterhelfen können, gerne her damit.
Werde mich dann wohl mal mit Java auseinandersetzen
-
dann so:
var vEingabe = getState('telegram.0.communicate.request'/*Last received request*/).val; // Test Eingabe per telegram auf dem Handy var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); if (vEingabe.indexOf('Strom') > -1) { vEingabe = vEingabe.replace("Strom", ''); setState('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe); log (vEingabe); console.log (vEingabe); }
Jetzt wird der Wert nur eingetragen, wenn "Strom" im Text enthalten ist !
-
auch wichtig;
-
@bahnuhr , Geiler Typ!
Habe noch einen Trigger hinzugefügt, dass er das immer prüft.
Läuft!
on('telegram.0.communicate.request'/*Last received request*/, function (obj) { var vEingabe = getState('telegram.0.communicate.request'/*Last received request*/).val; // Test Eingabe per telegram auf dem Handy var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); if (vEingabe.indexOf('Strom') > -1) { vEingabe = vEingabe.replace("Strom", ''); setState('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe); log (vEingabe); console.log (vEingabe); } });
Darf ich Dich noch belästigen, wie ich diese Warnung zu verstehen habe?
20:58:11.507 warn javascript.0 (20713) at Object.<anonymous> (script.js.common.Telegram.00_PowerMeter:7:8)
-
@fliegema sagte in Konversation mit dem BOT via Telegram:
20:58:11.507 warn javascript.0 (20713) at Object.<anonymous> (script.js.common.Telegram.00_PowerMeter:7:8)
Wie hast du den DP angelegt?
number oder string ?vEingabe ist ja ein string.
Evtl. musst du diesen noch wandeln in eine number ! -
@bahnuhr said in Konversation mit dem BOT via Telegram:
@fliegema sagte in Konversation mit dem BOT via Telegram:
20:58:11.507 warn javascript.0 (20713) at Object.<anonymous> (script.js.common.Telegram.00_PowerMeter:7:8)
Wie hast du den DP angelegt?
number oder string ?vEingabe ist ja ein string.
Evtl. musst du diesen noch wandeln in eine number !Habe es gepackt, es klappt! Geil!.
Jetzt wäre es aber noch super, wenn man den Input prüft, ob dieser größer ist als vorher. Daher dachte ich mir, dass ich eine neue Variable anlegen und gegen diese prüfe, klappt aber scheinbar nicht. Bekomme leider auch keine Fehlermeldung. Denke ich hier zusehr blockly? If AlterWert < vEingabe --> mache weiter. Könntest Du hier bitte nochmal drüber gucken?
on('telegram.0.communicate.request'/*Last received request*/, function (obj) { var vEingabe = getState('telegram.0.communicate.request'/*Last received request*/).val; // Test Eingabe per telegram auf dem Handy var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); var vAlterWert; vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); if (vAlterWert < vEingabe) { if (vEingabe.indexOf('Strom') > -1) { vEingabe = vEingabe.replace("Strom", ''); setObject('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe); vAlterWert = vEingabe; // log (vEingabe); console.log ("Aktueller Wert: "+ vEingabe); console.log ("Alter Wert: "+ vAlterWert); } } });
-
Du hast vAlterWert zugewiesen wenn der neue Wert geschrieben werden soll. Dieser wird aber nicht behalten.
Heißt: Beim nächsten Durchlauf ist valter... = 0du musst den alten Wert am Anfang holen per getState.
Also so:on('telegram.0.communicate.request'/*Last received request*/, function (obj) { var vAlterWert = getState('0_userdata.0.00_Powertest').val; var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); var vEingabe = obj.state.val; //ist einfacher als der alte Text ! vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); vEingabe_wert = vEingabe.replace("Strom", ''); if (vEingabe.indexOf('Strom') > -1 && vEingabe_wert > vAlterWert) { setObject('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe_wert); log ("Aktueller Wert: "+ vEingabe_wert); log ("Alter Wert: "+ vAlterWert); } });
Jetzt wird der neue Wert nur geschrieben wenn er größer ist als der alte gespeicherte!
-
@bahnuhr said in Konversation mit dem BOT via Telegram:
Du hast vAlterWert zugewiesen wenn der neue Wert geschrieben werden soll. Dieser wird aber nicht behalten.
Heißt: Beim nächsten Durchlauf ist valter... = 0du musst den alten Wert am Anfang holen per getState.
Also so:on('telegram.0.communicate.request'/*Last received request*/, function (obj) { var vAlterWert = getState('0_userdata.0.00_Powertest').val; var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); var vEingabe = obj.state.val; //ist einfacher als der alte Text ! vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); vEingabe_wert = vEingabe.replace("Strom", ''); if (vEingabe.indexOf('Strom') > -1 && vEingabe_wert > vAlterWert) { setObject('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe_wert); log ("Aktueller Wert: "+ vEingabe_wert); log ("Alter Wert: "+ vAlterWert); } });
Jetzt wird der neue Wert nur geschrieben wenn er größer ist als der alte gespeicherte!
Guten Morgen,
leider haut das nicht hin.
Kann es sein, dass die Variable vEingabe_wert nicht initialisiert ist?
Selbst wenn ich diese aber in Zeile 6 erstelle, klappt es nicht. Bekomme als Fehler nur den Number/String Fehler:
on('telegram.0.communicate.request'/*Last received request*/, function (obj) { var vAlterWert = getState('0_userdata.0.00_Powertest'/*00 Powertest*/).val; var vUser = vEingabe.substring(1, vEingabe.indexOf("]")); var vEingabe = obj.state.val; //ist einfacher als der alte Text ! vEingabe = vEingabe.substring(vEingabe.indexOf("]") + 1, vEingabe.length); var vEingabe_wert = vEingabe.replace("Strom", ''); if (vEingabe.indexOf('Strom') > -1 && vEingabe_wert > vAlterWert) { setObject('0_userdata.0.00_Powertest'/*00 Powertest*/,vEingabe_wert); log ("Aktueller Wert: "+ vEingabe_wert); log ("Alter Wert: "+ vAlterWert); } });
09:52:22.065 error javascript.0 (5205) at Object.<anonymous> (script.js.common.Telegram.00_PowerMeter:3:26)
Selbst wenn ich in Zeile 2 get State auf getObject ändere klappt es nicht:
var vAlterWert = getObject('0_userdata.0.00_Powertest'/*00 Powertest*/).val;
Im datenpunkt ist gerade der Wert manuell gesetzt: 2580, per Telegram sende ich 3000
Komme leider nicht weiter.
-
Anydesk ?
-
@bahnuhr said in Konversation mit dem BOT via Telegram:
Anydesk ?
Ich versuche erst nochmal mit Google die Java Kenntnisse zu erweitern, und melde mich nochmal. Danke Dir schon mal fürs Angebot.