iobroker-community-adapters / ioBroker.telegram

Use Telegram service to communicate with ioBroker
MIT License
56 stars 45 forks source link

Error ab V1.10.1 #308

Closed Schwapy closed 2 years ago

Schwapy commented 2 years ago

Hi,

Ich bekomme folgende error meldung im Iobroker log:

telegram.0 | 2022-03-04 13:11:13.782 | warn | Terminated (UNCAUGHT_EXCEPTION): Without reason -- | -- | -- | -- telegram.0 | 2022-03-04 13:11:13.775 | info | terminating telegram.0 | 2022-03-04 13:11:13.251 | error | The state contains the forbidden properties chat_id, text! telegram.0 | 2022-03-04 13:11:13.249 | error | Error: The state contains the forbidden properties chat_id, text! at validateSetStateObjectArgument (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/lib/adapter/adapter.js:5662:23) at Adapter.setState (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/build/lib/adapter/adapter.js:5745:21) at /opt/iobroker/node_modules/iobroker.telegram/main.js:280:47 at processTicksAndRejections (internal/process/task_queues.js:95:5) telegram.0 | 2022-03-04 13:11:13.237 | error | unhandled promise rejection: The state contains the forbidden properties chat_id, text! telegram.0 | 2022-03-04 13:11:13.234 | error | Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

Der fehler tritt auf sobald ich eine Nachricht über Node red abschicke(nutze sonst nichts anderes)

msg.payload = { // text is the only mandatory field here "text": "bold italic bold ~italic bold strikethrough~ underline italic bold bold", // optional chatId or user, the recipient of the message "chatId": "16071*****", // optional settings from the telegram bots API "parse_mode": "MarkdownV2" }

vor der version 1.10.1 hatte alles wunderbar funktioniert...

Versions:

flavourflo commented 2 years ago

Hi,

I have exactly the same behavior. I've also created a post in the iobroker forum for this.

Since my last update action about 2 weeks ago my Telegram adapter (version 1.11.1) restarts as soon as I send Telegram messages via Node-RED (version 2.4.2).

For sending I use the ioBroker out node (Type is set to command) and set the state of telegram.0.communicate.response to the following payload:

{ "text": "<b>TANKSTELLEN IM UMKREIS VON 10KM</b>\r\n\r\n<b><a href=\"https://google.de/search?q=XXX%20GmbH%20YYY\">XXX in YYY</a></b>\r\n6.6km entfernt, derzeit geöffnet\r\nDiesel: 2.179€, Benzin: 2.149€ \r\n\r\n<b><a href=\"https://google.de/search?q=XXX%20YYY\">XXX in YYY</a></b>\r\n7.9km entfernt, derzeit geöffnet\r\nDiesel: 2.179€, Benzin: 2.149€...", "disable_web_page_preview": true, "parse_mode": "HTML", "chatId": 123456789, "user": "XXX" }

The message is sent and still arrives, but afterwards the Telegram adapter crashes and restarts:

` telegram.0 2022-03-09 19:17:47.785 info starting. Version 1.11.1 in /opt/iobroker/node_modules/iobroker.telegram, node: v14.17.5, js-controller: 3.3.22

telegram.0 2022-03-09 19:17:45.064 warn Terminated (UNCAUGHT_EXCEPTION): Without reason

telegram.0 2022-03-09 19:17:45.063 info terminating

telegram.0 2022-03-09 19:17:44.559 error The state contains the forbidden properties disable_web_page_preview, parse_mode, chat_id, text!

telegram.0 2022-03-09 19:17:44.559 error Error: The state contains the forbidden properties disable_web_page_preview, parse_mode, chat_id, text! at validateSetStateObjectArgument (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6006:23) at Adapter.setState (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:6093:21) at /opt/iobroker/node_modules/iobroker.telegram/main.js:280:47 at processTicksAndRejections (internal/process/task_queues.js:95:5)

telegram.0 2022-03-09 19:17:44.557 error unhandled promise rejection: The state contains the forbidden properties disable_web_page_preview, parse_mode, chat_id, text!

telegram.0 2022-03-09 19:17:44.555 error Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). ` Looks like the properties end up in the forbiddenProperties for some reason.

Apollon77 commented 2 years ago

But exactly this is the issue, you shpuld not write an object into a state that only accepts a string.In fact also node-red should show an error that you write an object into a state that expects a string!

This state s 100% there to send a string. That the object itself works is "by chance" and could break all the time.

The formal correct way is to send a message with command "send" to the telegram adapter - then exactly your object can be send as payload.

I could imagine that we could end additional states like "communitace.responseObject" or such that allows to send a stringified object ...Would that help? Sending messages to adapters I think would also be a good feature request for node-red adapter

Schwapy commented 2 years ago

Momentmal du möchtest mir also sagen das es ein fehler ist das so zu machen? wen ich auf https://www.iobroker.net/#de/adapters/adapterref/iobroker.telegram/README.md gehe und dort ganz unten den teil für node red sehe .... habe ich nichts anderes gemacht als es in der anleitung steht wie gesagt vor der version 1.10.1 hat ja auch alles funktioniert.

hier noch ein paar screenshots: https://i.imgur.com/xeEUNou.png https://i.imgur.com/WUHiXmy.png https://i.imgur.com/edsRUPt.png

Apollon77 commented 2 years ago

Ja das will ich (leider) sagen. Und zwar gar nicht mal telegram-Spezifisch, sondern generell - und wenn du sowas tust dann sollte im node-red Log einige Fehler auftauchen ala "Falscher Datentyp, objekt nicht erlaubt als wert, muss ein String sein".

Das es funktioniert (hat) war inkonsistente/falsche Nutzung der ioBroker Features, dem wir generell von js-controller Ebene immer mehr begegnen, weil das zb bei einem System auf Redis Basis oder mit komplexeren "payloads" ganz schnell gaaaanz komische Nebeneffekte hat und am Ende zu komischen Fehlern führt.

Ja, ich könnte die Funktion aus der alten Version wiederherstellen, da wäre aber die für alle Seiten schlechteste Variante weil alles andere als Zukunftssicher. Ich würde eher lieber überlegen wie man es sauber machen kann.

Daher wäre mein Vorschlag wie folgt: Neuer State in Telegram einführen responseObject welches den obigen payload, ABER als JSON.stringified String!!!!, enthalten kann und damit dann alles wieder tut.

Das kann ich gern einbauen. Dann wird readme angepasst und die Node-Red User können umstellen.

Schwapy commented 2 years ago

na das hört sich doch mal nach einer Lösung an da ja sonst der Telegram adapter nichtmehr mit Node red nutzbar ist oder gibt es vllt. noch eine andere "saubere" Lösung?

Apollon77 commented 2 years ago

Die andere wäre ne Erweiterung des node-red adapters das er Messages an Adapter senden kann (https://github.com/ioBroker/ioBroker.node-red/issues/291)aber denke für jetzt ist das auch für user interessant.

Aber jetzt habe ich das obige mal auf GitHub implementiert ... und Readme angepasst. Bitte testen!