Node Red - Node auf ERROR

Hallo zusammen,

ich habe folgenden Flow in Node-Red.
Haustüre klingelt - Kamera macht ein Foto - sendet Nachricht pre Telegram

Jetzt kommt es aber immer mal wieder vor, dass die Kamera nicht erreichbar ist und der Flow bei der Kamera wegen dem Node ERROR “hängen bleibt”.

Nun meine Frage, kann ich in dem Kamere Node hinterlegen, dass auch wenn der auf error geht, dass der Flow trotzdem weiter läuft?

Hoffe ich konnte mein Problem gut beschreiben…

Freu mich auf eure Ideen.

Schau dir mal den catch-Node an, eventuell hilft der dir ja .

Hi Crypton,

kannst du das ein wenig ausführen?
Habe nur die ganz einfach “GrundSkills” bei Node Red…

Poste deinen Flow. Was genau läuft auf Fehler, welcher Node-typ? Hast du schon mal debug-Node eingefügt und den Error gesehen. Ist der FEhler in Homeassistant oder Node-Red?

Ich glaube mal, das funktioniert nicht.
Aber ich hab die „Fehlerreport“-Node bei mir im Einsatz, die schickt mir eine Benachrichtigung, wenn ein solcher Fehler auftritt.

1 „Gefällt mir“

Hi Mostie,

der eigentliche Flow ist wesentlich länger… habe mal die relevanten Nodes genommen:

[
    {
        "id": "51e0f93a33f1c425",
        "type": "inject",
        "z": "d0d76e7b714383e4",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 280,
        "y": 620,
        "wires": [
            [
                "56dc6176420c6b4f"
            ]
        ]
    },
    {
        "id": "56dc6176420c6b4f",
        "type": "api-call-service",
        "z": "d0d76e7b714383e4",
        "name": "Take Snapshot",
        "server": "%%ID%%",
        "version": 7,
        "debugenabled": false,
        "action": "camera.snapshot",
        "floorId": [],
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "camera.hausture"
        ],
        "labelId": [],
        "data": "{\"filename\":\"/media//Haustuer_1.jpg\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "blockInputOverrides": false,
        "domain": "camera",
        "service": "snapshot",
        "output_location": "",
        "output_location_type": "none",
        "x": 480,
        "y": 620,
        "wires": [
            [
                "3175afc810c18c62"
            ]
        ]
    },
    {
        "id": "3175afc810c18c62",
        "type": "function",
        "z": "d0d76e7b714383e4",
        "name": "prep msg",
        "func": "msg.filename = '/media//Haustuer_2.jpg';\nmsg.payload = { \n data: {\n type: 'photo',\n file: '/media//Haustuer_2.jpg',\n chatId: -694956136,\n caption: 'Haustür hat geklingelt! v2' }\n};\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 680,
        "y": 620,
        "wires": [
            [
                "2cfc613aa575ea32"
            ]
        ]
    },
    {
        "id": "2cfc613aa575ea32",
        "type": "api-call-service",
        "z": "d0d76e7b714383e4",
        "name": "Telegram",
        "server": "%%ID%%",
        "version": 7,
        "debugenabled": false,
        "action": "telegram_bot.send_photo",
        "floorId": [],
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "labelId": [],
        "data": "",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "blockInputOverrides": false,
        "domain": "telegram_bot",
        "service": "send_photo",
        "output_location": "",
        "output_location_type": "none",
        "x": 860,
        "y": 620,
        "wires": [
            []
        ]
    },
    {
        "id": "%%ID%%",
        "type": "server",
        "name": "Home Assistant",
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "",
        "connectionDelay": false,
        "cacheJson": false,
        "heartbeat": false,
        "heartbeatInterval": ""
    }
]

Mein Plan wäre, dass auch wenn kein Foto gemacht werden kann, dass trotzdem eine Nachricht über Telegram geschickt wird…

Hi Harryp,

das klingt auch noch nach einer Alternative.
Welchen Node-Typ verwendest du hierfür genau?

Ich werde später mal in meiner Umgebung importieren. Was du testen könntest:

  1. mach ein kleinen Delay vor und nach dem Schritt. Nur 10 ms oder so. vorher damit nichts blockeirt, nachher damit die Datei fertig geschrieben ist.

  2. du kannst ein catch-node parallel zum camera.snapshot anlegen welches nur auf deine node im Fehlerfall reagiert. Du musst hier beim auslösenden Event sagen dass nur auf das einzelne Node und nicht auf alle vom Flow reagiert werden soll.

Unabhängig davon wäre interessant was der Fehler ist. Besser Fehler abstellen als Workarounds einbauen. Ich vermute dass der Snapshot einfach nocht nicht fertig geschrieben wurde

Bin gerade unterwegs, aber schau mal hier:

Solltest du auch in Node-Red finden.

Wie @mostie es vorschlägt sollte es funktionieren.
Der Catch-Node leitet erzeugt beim Auftreten eines Fehlers eine neue Nachricht, mit der du dann weitere Nodes triggern kannst. Dadurch kannst du dann auch eine Fehlermeldung / Hinweis an Telegram senden.

Habe das mal bei mir angesehen

  1. Du hast im “Snapshot” Node eine Datei “Haustuer_1.jpg”
  2. In Telegram willst du eine Datei “Haustuer_2.jpg” senden. Die gibt es vermutlich nicht
  3. Du hast in deinen Nodes Pfadnamen mit doppeltem Slash “//”. Ich nutze kein HA OS, aber ich zweifle dass das richtig ist. Darum läuft es vermutlich auf Fehler

Unabhängig davon würde ich Dateinamen nicht statisch setzen. Wenn die Datei mal korrupt ist oder auf OS gesperrt wird geht es nie wieder. Ich würde den Dateinamen dynmaisch machen, z. B. mit Timestamp.

Catch ist ein Workaround den ich vermeiden würde wenn möglich. Fehler loggen und ggf. separate Notification. Wenn von Anfang an schon mit dem Scheitern gerechnet wird ist was falsch und du kannst es gleich sein lassen.

Beispiel angehängt mit Catch … würde funktionieren, aber nicht empfohlen. Die Catch-Node fließt in eine Funktion und erzeugt dann auch die Telegram Nachricht.

[
    {
        "id": "5eb6f3c911146727",
        "type": "catch",
        "z": "cb4c2d91f85165e6",
        "name": "",
        "scope": [
            "d65a43a86a118ee0"
        ],
        "uncaught": false,
        "x": 310,
        "y": 140,
        "wires": [
            [
                "e3d5744fac1c3a7e"
            ]
        ]
    },
    {
        "id": "5cea55caae7d9fab",
        "type": "file",
        "z": "cb4c2d91f85165e6",
        "name": "",
        "filename": "/data/errot.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 850,
        "y": 140,
        "wires": [
            []
        ]
    },
    {
        "id": "f91861846306c073",
        "type": "change",
        "z": "cb4c2d91f85165e6",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "error",
                "tot": "msg",
                "dc": true
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 650,
        "y": 140,
        "wires": [
            [
                "5cea55caae7d9fab"
            ]
        ]
    },
    {
        "id": "0c9a17037055b8dc",
        "type": "inject",
        "z": "cb4c2d91f85165e6",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 160,
        "y": 80,
        "wires": [
            [
                "d65a43a86a118ee0"
            ]
        ]
    },
    {
        "id": "d65a43a86a118ee0",
        "type": "api-call-service",
        "z": "cb4c2d91f85165e6",
        "name": "Take Snapshot",
        "server": "b99a7cfd90266689",
        "version": 7,
        "debugenabled": false,
        "action": "camera.snapshot",
        "floorId": [],
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "camera.yi_hack_a2_7139f9_cam"
        ],
        "labelId": [],
        "data": "{\"filename\":\"/media//Haustuer_1.jpg\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "blockInputOverrides": false,
        "domain": "camera",
        "service": "snapshot",
        "output_location": "",
        "output_location_type": "none",
        "x": 340,
        "y": 80,
        "wires": [
            [
                "712033f55077cb28"
            ]
        ]
    },
    {
        "id": "712033f55077cb28",
        "type": "function",
        "z": "cb4c2d91f85165e6",
        "name": "prep msg",
        "func": "msg.filename = '/media//Haustuer_2.jpg';\nmsg.payload = { \n data: {\n type: 'photo',\n file: '/media//Haustuer_2.jpg',\n chatId: -694956136,\n caption: 'Haustür hat geklingelt! v2' }\n};\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 620,
        "y": 80,
        "wires": [
            [
                "76914ade7abf5dee"
            ]
        ]
    },
    {
        "id": "76914ade7abf5dee",
        "type": "debug",
        "z": "cb4c2d91f85165e6",
        "name": "Do whatever needs to be done ... telegram",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 950,
        "y": 80,
        "wires": []
    },
    {
        "id": "c746670d2312b8a1",
        "type": "comment",
        "z": "cb4c2d91f85165e6",
        "name": "Log error for analysis",
        "info": "",
        "x": 880,
        "y": 180,
        "wires": []
    },
    {
        "id": "f3c2bdfafe3b7aee",
        "type": "comment",
        "z": "cb4c2d91f85165e6",
        "name": "Catch only Snapshot Node",
        "info": "",
        "x": 370,
        "y": 180,
        "wires": []
    },
    {
        "id": "e3d5744fac1c3a7e",
        "type": "junction",
        "z": "cb4c2d91f85165e6",
        "x": 480,
        "y": 140,
        "wires": [
            [
                "f91861846306c073",
                "712033f55077cb28"
            ]
        ]
    },
    {
        "id": "b99a7cfd90266689",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": true,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": ": ",
        "statusYear": "numeric",
        "statusMonth": "2-digit",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": false
    }
]

Fehler in der Datei “error.txt” dann kannst auch analysieren

{"message":"ValidationError: \"action\" is not allowed to be empty","source":{"id":"d65a43a86a118ee0","type":"api-call-service","name":"Take Snapshot","count":1},"stack":"ValidationError: \"action\" is not allowed to be empty"}
{"message":"HomeAssistantError: Service camera.snapshot not found.","source":{"id":"d65a43a86a118ee0","type":"api-call-service","name":"Take Snapshot","count":1},"stack":"HomeAssistantError: Service camera.snapshot not found.\n    at getErrorData (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/errors/inputErrorHandler.js:43:13)\n    at inputErrorHandler (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/errors/inputErrorHandler.js:63:38)\n    at ActionController._InputOutputController_preOnInput (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/controllers/InputOutputController.js:69:51)"}
{"message":"HomeAssistantError: Service camera.snapshot not found.","source":{"id":"d65a43a86a118ee0","type":"api-call-service","name":"Take Snapshot","count":1},"stack":"HomeAssistantError: Service camera.snapshot not found.\n    at getErrorData (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/errors/inputErrorHandler.js:43:13)\n    at inputErrorHandler (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/errors/inputErrorHandler.js:63:38)\n    at ActionController._InputOutputController_preOnInput (/data/node_modules/node-red-contrib-home-assistant-websocket/dist/common/controllers/InputOutputController.js:69:51)"}

Das was du schreibst ist bis auf deine Aussage zu dem Catch-Node korrekt.
Die Verwendung des Catch-Nodes wird aber empfohlen, da damit eine korrekte Fehlerbehandlung möglich ist.

Macht Sinn, die Anleitung widerspricht ja schließlich nicht meiner Ausführung

:crayon:by HarryP: Provokation gelöscht

Leute, streitet doch nicht.

Ich habe in meinem Node-Red eine Catch-Node im Einsatz, die die Fehler aus allen 1100 meiner Nodes „abfängt/ausliest“.
Dahinter habe ich eine „function“-Node, welche die Ausgabe der catch-Node aufbereitet und an eine call-Service-Node übergibt, die mich über Telegram mit dem Fehlertext informiert.

Und das ganze nicht um schlampige Programmierung zu korrigieren, was wahrscheinlich gar nicht geht, sondern um Fehler zu erkennen.
So habe ich z.B.: erkannt, das der iCloud-Kalender in letzter Zeit häufig nicht erreichbar war.
Beispiel:


ACHTUNG! Es ist an der Node: # Kalender # ist ein Fehler aufgetreten! Der Fehlertext lautet: HomeAssistantError: ReportError at '503 Service Unavailable

b''', reason no reason.

Dafür ist es auch gemacht und sinnvoll. Es sind Situationen die nicht gewollt und planbar sind. DArum sauber abgefangen, möglicherweise noch in Logfile und mit entsprechend klarer Ausgabe.

Fehler abfangen und dann den Prozess weiterlaufen lassen ohne dass der Anwender das klar sieht ist nicht gewollt und falsch

So Leute, die ganzen Streitereien und Angriffe habe ich gelöscht.
Wenn ihr weiter streiten wollt, macht das Bitte per PN, aber nicht den Thread hier zerschreddern.

Sollten es nichtvaufhören, mache ich hier zu.

Also, back-to-topic!

Hi Mostie,

danke für deine Lösungsansätze.

  1. habe ich im großen Flow auch so eingebaut, weil die Kamera immer paar Sek braucht um das Bild zu speichern.
  2. das habe ich ehrlich gesagt - noch - nicht verstanden / versucht, werde da aber gleich mal genauer nachlesen.

Der Fehler der Kamera ist, dass die ab und zu nicht erreichbar ist, wegen WLAN Problemen. Das lässt sich leider nicht beheben…

Sonst wäre ich absolut deiner Meinung, das Problem zu fixen und nicht zum umgehen.

Hallo harryp,

kannst du mir mal deinen Flow zu deiner Catch-Node posten?
Das klingt genau nachdem ich suche :slight_smile:

:crayon:by HarryP: unnötiges Vollzitat entfernt

Hi Mostie,

danke nochmal, dass du dir meinen Flow angeschaut hast!
1+2 Ich habe es nur “schlamping” zusammenkopiert und bin wohl bei den Nodes verrutscht. Hintergrund, ich mache erst ein Bild und 3 Sek später nochmal eins. Im originalen Flow habe ich die korrekten Dateinnamen.

3 hier kann ich bestätigen, dass das mit den doppelten Slash unter HA OS funktioniert, da der Flow wunderbar funktioniert, wenn die Kamera “wlan bedingt” erreichbar ist (was zu 90% der Fall ist)

Ob du in Linux bei einem Dateipfad /, oder /////////// angibst ist egal, es wird trotzdem / benutzt. Der Übersicht halber würde ich aber nur / benutzen.