Die letzten sechs Beiträge:

Über mich

Wie viele ....

Random Post
Search
  • Home
  • Category Archives: Edis Blog
Search
  • Heimann Rauchmelder Titelbild

    Heiman HS1SA-E Rauchmelder mit ZigBee2MQTT in Node-Red

    Meine bisheringen Rauchmelder arbeiten alle Standalone, die sind zwar recht laut wenn ein Alarm gemeldet wird, aber nicht vernetzbar, so dass immer nur der Melder in dem Raum einen Alarm ausgibt wo Rauch erkannt wird.

    Da ich ein IoT Smarthome System einsetze lag es nahe vernetzbare Rauchmelder einzusetzen. Nach einer ausfürlichen Suche bin ich auf die “Heimann HS1SA-E Rauchmelder mit ZigBee2MQTT” aufmerksam geworden und habe mir einige davon beschafft. Es gibt da verschiedene Typen, die einen haben ZigBee, andere nicht wichtig: HS1SA-E der kann ZigBee. Nach meiner Recherche ist wohl gerade ein Nachfolgemodell in Entwicklung, das auch einen Testalarm per ZigBee unterstützt, was das Modell HS1SA-E nicht kann!

    Meine Intergartion basiert auf Node-Red mit ZigBee2MQTT (die Voraussetzungen siehe weiter unten), ich habe mir dazu Schritt für Schritt einen Flow erstellt, der den Zustand der Rauchmelder erfasst und Berichte per Mail, ntfy und Pushover verschickt. Falls es einen Alarm gibt habe ich eine ZigBee Kerzenbirne in zentraler Lage eingebunden, die dann blinkt. Mit einer aktustische Meldung muss ich mir noch überlegen wie das inntegriert werden könnte.

    Die Rauchmelder sind etwas zickig bei der Integration in ZB2M, wenn man ein Interview startet muss man am Besten alle zwei drei Sekunden den Reset Knopf kurz drücken, damit sie nicht sofort wieder in den Schlafmodus gehen. Musste das mehrmals machen, damit die Daten sauber ausgelesen werden konnten, seit dem ist es ok.

    Das Ganze ist natürlich noch V 0.8, also da gibt es noch Potential für Verbesserungen, wer will kann sich ja mal mit dem Status Quo versuchen und mir Rückmeldung geben für Verbesserungen, Korrekturen oder was auch immer. Schon mal viel Sapß damit.

    Gruß

    Edi

    Eine Beschreibung des Heimann Rauchmelders:
    HEIMAN Zigbee Rauchmelder

    Der HEIMAN Zigbee Rauchmelder besitzt eine genaue Raucherkennung und Sie werden akustisch und visuell alarmiert. In einer ernsten Situation alarmiert der Rauchsensor mit einer roten LED, die schnell und mit einem lauten Alarm blinkt. Darüber hinaus besteht die Möglichkeit, eine Warnung auf Ihrem Smartphone zu erhalten, wenn Sie nicht zu Hause sind. So wird verhindert, dass ein Brand durch Rauch entsteht und teure Folgeschäden verursacht werden.
    Durch den Einsatz der Funktechnologie Zigbee 3.0 kann der Sensor an jedes Zigbee-Gateway angeschlossen werden. Dank des neuesten Zigbee 3.0 Standards gewährleistet der Rauchsensor eine Batterielebensdauer von 3 Jahren.
    Eigenschaften:

    Erkennt Rauch und sichtbare Partikel, welche durch einen Schwelbrand entstehen
    Benachrichtigung über Feueralarm, auch unterwegs
    Lautstärke des Alarms: 85 dB/3m
    Anzeige des Batteriestandes
    Batterie notwendig: Ja (1x Batterie CR123A)
    Lebensdauer der Batterie: 3 Jahre
    Funktechnologie: Zigbee 3.0
    Rauchmelder entspricht DIN EN14604 Norm

    Voraussetzung für den gesamten Ablauf:
    • Raspberrypi
    • MQTT Broker
    • ZigBee2mQTT mit Sonoff Dongle oder Ähnlichem
      • Heimann Rauchmelder
        • ZigBee Kerzenbirne oder was sonst zum Alarmieren verwendet wird
    • Node-Red mit Dashboard 2.0 und diversen anderen Paletten
    • ntfy Account
    • Pushover Account
    •  Mailaccount
      • für die Zustellung der Meldungen werden ntfy, Pushover und Mail verwendet
    Der komplette Node-Red Flow für die Rauchmelder Integration:
    [
    {
    “id”: “f19c1232b5818c2a”,
    “type”: “group”,
    “z”: “a906f7d4665bf705”,
    “style”: {
    “stroke”: “#999999”,
    “stroke-opacity”: “1”,
    “fill”: “none”,
    “fill-opacity”: “1”,
    “label”: true,
    “label-position”: “nw”,
    “color”: “#a4a4a4”
    },
    “nodes”: [
    “a6ea58dab388b29c”,
    “765bf0769705a2ff”,
    “g7h8i9j0k1l2m3n4”,
    “i9j0k1l2m3n4o5p6”,
    “fac5633b6eba8601”,
    “7a1904f924795633”,
    “1fc2a6b8f60b088d”,
    “f8b1b27956f09b3e”,
    “147944ef03bfde4c”,
    “4ab2f6e25855efce”,
    “9d6eebcf795ee86e”,
    “ac1607f8f0db6b5d”,
    “24495c060d2a8756”,
    “2bb5b7ad91154a04”,
    “06fda76032ceaefb”,
    “296a847a7c85c981”,
    “3deb8b862d1238e4”,
    “acbb6ccfa4615f05”,
    “2cf42ba58b153108”,
    “0f916dab840c7276”,
    “fd8f8ffdf77a106c”,
    “0469b6708a6631f2”,
    “e45e871a10a710b2”,
    “95efe3c5faf4ab5b”,
    “6f243fcb4da873d4”,
    “b69dfaa826fb2d91”,
    “685b6cb6ac3300e8”,
    “efd4d502334fbc36”,
    “6247c2a58286fc73”,
    “ab3764d33b337c6f”,
    “0f3d4c079b703181”,
    “cb8dcc5798bb85a4”,
    “551b4d13bc9b505f”,
    “191ef45fc6c07a97”,
    “d4e9451a20607f2f”
    ],
    “x”: 34,
    “y”: 19,
    “w”: 1312,
    “h”: 522
    },
    {
    “id”: “a6ea58dab388b29c”,
    “type”: “zigbee2mqtt-get”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “”,
    “server”: “1bfcccb11dd30d19”,
    “friendly_name”: “KellerWerkstatt (HS1SA-E)”,
    “device_id”: “0xf84477fffe123ed0”,
    “state”: “0”,
    “enableMultiple”: false,
    “x”: 400,
    “y”: 100,
    “wires”: [
    [
    “06fda76032ceaefb”
    ]
    ]
    },
    {
    “id”: “765bf0769705a2ff”,
    “type”: “inject”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “8:00 Tag”,
    “props”: [
    {
    “p”: “topic”,
    “vt”: “str”
    }
    ],
    “repeat”: “”,
    “crontab”: “00 08 * * *”,
    “once”: false,
    “onceDelay”: 0.1,
    “topic”: “”,
    “x”: 140,
    “y”: 140,
    “wires”: [
    [
    “a6ea58dab388b29c”
    ]
    ]
    },
    {
    “id”: “g7h8i9j0k1l2m3n4”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “E-Mail Formatierung”,
    “func”: “let data = msg.payload;\n\n// E-Mail Inhalt erstellen\nlet emailContent = `\n<h2>🏠 🚨 Rauchmelder Statusbericht</h2>\n<p><strong>Gerät:</strong> ${data.friendly_name}</p>\n<p><strong>Datum/Uhrzeit:</strong> ${new Date(data.timestamp).toLocaleString(‘de-DE’)}</p>\n<hr>\n<h3>Status:</h3>\n<table border=\”1\” cellpadding=\”5\” cellspacing=\”0\” style=\”border-collapse: collapse;\”>\n <tr>\n <td><strong>Batteriestatus:</strong></td>\n <td>${data.battery}%</td>\n </tr>\n <tr>\n <td><strong>Batterie OK:</strong></td>\n <td>${data.battery_ok ? ‘✅ Ja’ : ‘❌ Nein – Bitte wechseln!’}</td>\n </tr>\n <tr>\n <td><strong>Test-Modus:</strong></td>\n <td>${data.test_mode ? ‘🔴 Aktiv’ : ‘⚪ Inaktiv’}</td>\n </tr>\n <tr>\n <td><strong>Rauchmelder:</strong></td>\n <td>${data.smoke ? ‘🚨 ALARM’ : ‘✅ Normal’}</td>\n </tr>\n <tr>\n <td><strong>Signalstärke:</strong></td>\n <td>${data.linkquality} LQI</td>\n </tr>\n</table>\n\n<p><em>Automatisierte Statusmeldung ZigBee Rauchmelder ${data.friendly_name}.</em></p>\n`;\n\n// Warnung bei niedrigem Batteriestand\nif (!data.battery_ok) {\n emailContent = emailContent.replace(‘<h2>’, ‘<h2 style=\”color: red;\”>⚠️ WARNUNG – ‘);\n emailContent += ‘<p style=\”color: red; font-weight: bold;\”>⚠️ Der Batteriestand ist niedrig! Bitte tauschen Sie die Batterie aus.</p>’;\n}\n\nmsg.payload = emailContent;\nmsg.topic = `Rauchmelder ${data.friendly_name} Statusbericht`;\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: “”,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 820,
    “y”: 240,
    “wires”: [
    [
    “fac5633b6eba8601”
    ]
    ]
    },
    {
    “id”: “i9j0k1l2m3n4o5p6”,
    “type”: “inject”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Manueller Test”,
    “props”: [
    {
    “p”: “payload”
    },
    {
    “p”: “topic”,
    “vt”: “str”
    }
    ],
    “repeat”: “”,
    “crontab”: “”,
    “once”: false,
    “onceDelay”: 0.1,
    “topic”: “”,
    “payload”: “”,
    “payloadType”: “date”,
    “x”: 160,
    “y”: 100,
    “wires”: [
    [
    “a6ea58dab388b29c”
    ]
    ]
    },
    {
    “id”: “fac5633b6eba8601”,
    “type”: “e-mail”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “server”: “smtp.mail.de”,
    “port”: “465”,
    “secure”: true,
    “tls”: true,
    “name”: “rauchmelder@domain.com”,
    “dname”: “Rauchmelder Mail Bericht”,
    “output”: false,
    “outputs”: 0,
    “x”: 890,
    “y”: 300,
    “wires”: []
    },
    {
    “id”: “7a1904f924795633”,
    “type”: “debug”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Daten aufbereitet”,
    “active”: true,
    “tosidebar”: true,
    “console”: false,
    “tostatus”: false,
    “complete”: “payload”,
    “targetType”: “msg”,
    “statusVal”: “”,
    “statusType”: “auto”,
    “x”: 850,
    “y”: 60,
    “wires”: []
    },
    {
    “id”: “1fc2a6b8f60b088d”,
    “type”: “ui-gauge”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Rauchmelder Batterie”,
    “group”: “5673b51cc6b259c0”,
    “order”: 1,
    “value”: “payload.battery”,
    “valueType”: “msg”,
    “width”: 3,
    “height”: 3,
    “gtype”: “gauge-half”,
    “gstyle”: “needle”,
    “title”: “Batterie”,
    “alwaysShowTitle”: false,
    “units”: “%”,
    “icon”: “”,
    “prefix”: “”,
    “suffix”: “”,
    “segments”: [
    {
    “from”: “0”,
    “color”: “#ff2600”,
    “text”: “”,
    “textType”: “label”
    },
    {
    “from”: “40”,
    “color”: “#ffc800”,
    “text”: “”,
    “textType”: “label”
    },
    {
    “from”: “100”,
    “color”: “#4e8f00”,
    “text”: “”,
    “textType”: “label”
    }
    ],
    “min”: 0,
    “max”: 100,
    “sizeThickness”: 16,
    “sizeGap”: 4,
    “sizeKeyThickness”: 8,
    “styleRounded”: true,
    “styleGlow”: false,
    “className”: “”,
    “x”: 1220,
    “y”: 60,
    “wires”: [
    []
    ]
    },
    {
    “id”: “f8b1b27956f09b3e”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 7,
    “width”: “3”,
    “height”: 1,
    “name”: “Batterie Anzeige”,
    “label”: “Batteriestatus”,
    “format”: “{{msg.payload.battery}}%”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.battery”,
    “valueType”: “msg”,
    “x”: 1200,
    “y”: 100,
    “wires”: []
    },
    {
    “id”: “147944ef03bfde4c”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 6,
    “width”: “3”,
    “height”: 1,
    “name”: “Batterie OK Status”,
    “label”: “Batterie OK”,
    “format”: “{{msg.payload.battery_ok ? ‘✅ Ja’ : ‘❌ Nein’}}”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.battery_ok”,
    “valueType”: “msg”,
    “x”: 1210,
    “y”: 140,
    “wires”: []
    },
    {
    “id”: “4ab2f6e25855efce”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 5,
    “width”: “3”,
    “height”: 1,
    “name”: “Test Modus”,
    “label”: “Test-Modus”,
    “format”: “{{msg.payload.test_mode ? ‘🔴 Aktiv’ : ‘⚪ Inaktiv’}}”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.test_mode”,
    “valueType”: “msg”,
    “x”: 1190,
    “y”: 180,
    “wires”: []
    },
    {
    “id”: “9d6eebcf795ee86e”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 4,
    “width”: “3”,
    “height”: 1,
    “name”: “Rauch Status”,
    “label”: “Rauchmelder”,
    “format”: “{{msg.payload.smoke ? ‘🚨 ALARM’ : ‘✅ Normal’}}”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.smoke”,
    “valueType”: “msg”,
    “x”: 1200,
    “y”: 220,
    “wires”: []
    },
    {
    “id”: “ac1607f8f0db6b5d”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 3,
    “width”: “3”,
    “height”: 1,
    “name”: “Signalstärke”,
    “label”: “Signalstärke”,
    “format”: “{{msg.payload.linkquality}} LQI”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.linkquality”,
    “valueType”: “msg”,
    “x”: 1190,
    “y”: 260,
    “wires”: []
    },
    {
    “id”: “24495c060d2a8756”,
    “type”: “ui-text”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “group”: “5673b51cc6b259c0”,
    “order”: 2,
    “width”: “3”,
    “height”: 1,
    “name”: “Letztes Update”,
    “label”: “Letztes Update”,
    “format”: “{{msg.payload.timestamp | date:’DD.MM.YYYY HH:mm:ss’}}”,
    “layout”: “row-spread”,
    “style”: false,
    “font”: “”,
    “fontSize”: “”,
    “color”: “#000000”,
    “wrapText”: false,
    “className”: “”,
    “value”: “payload.timestamp_formatted”,
    “valueType”: “msg”,
    “x”: 1200,
    “y”: 300,
    “wires”: []
    },
    {
    “id”: “2bb5b7ad91154a04”,
    “type”: “comment”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Rauchmelder Keller Werkstatt – ntfy, Pushover und Mail Meldungen und Statusbericht”,
    “info”: “”,
    “x”: 360,
    “y”: 60,
    “wires”: []
    },
    {
    “id”: “06fda76032ceaefb”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Rauchmelder Daten aufbereiten”,
    “func”: “// ZigBee2MQTT Daten parsen\nlet data = msg.payload;\nlet deviceInfo = {};\n\n// Prüfen ob Daten vorhanden sind\nif (typeof data === ‘object’) {\n // Batteriestatus (in % oder Spannung)\n deviceInfo.battery = data.battery || data.battery_percentage || 0;\n deviceInfo.battery_low = data.battery_low || false;\n \n // Test-Modus (falls vorhanden)\n deviceInfo.test_mode = data.test_mode || false;\n \n // Rauchmelder Status (Alarm, Normal, etc.)\n deviceInfo.smoke = data.smoke || false;\n deviceInfo.smoke_detected = data.smoke_detected || false;\n \n // Zusätzliche Status-Felder für HS1SA-E\n deviceInfo.trouble = data.trouble || false;\n deviceInfo.tamper = data.tamper || false;\n \n // Link Quality\n deviceInfo.linkquality = data.linkquality || 0;\n \n // Last seen aus ZigBee2MQTT\n deviceInfo.last_seen = data.last_seen || new Date().toISOString();\n \n // Batterie OK Status berechnen\n deviceInfo.battery_ok = true;\n if (deviceInfo.battery_low === true || \n (typeof deviceInfo.battery === ‘number’ && deviceInfo.battery < 20)) {\n deviceInfo.battery_ok = false;\n }\n \n // Timestamp für die aktuelle Abfrage\n deviceInfo.timestamp = new Date().toISOString();\n deviceInfo.timestamp_formatted = new Date().toLocaleString(‘de-DE’);\n \n deviceInfo.friendly_name = \”KellerWerkstatt\”;\n \n msg.payload = deviceInfo;\n \n return msg;\n}\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 650,
    “y”: 140,
    “wires”: [
    [
    “3deb8b862d1238e4”,
    “1fc2a6b8f60b088d”,
    “f8b1b27956f09b3e”,
    “147944ef03bfde4c”,
    “4ab2f6e25855efce”,
    “9d6eebcf795ee86e”,
    “ac1607f8f0db6b5d”,
    “24495c060d2a8756”,
    “7a1904f924795633”,
    “g7h8i9j0k1l2m3n4”
    ]
    ]
    },
    {
    “id”: “296a847a7c85c981”,
    “type”: “pushover api”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “keys”: “13d7f9e6fd4a0fe1”,
    “title”: “Rauchmelder Keller Werkstatt”,
    “name”: “Rauchmelder Keller Werkstatt”,
    “x”: 570,
    “y”: 300,
    “wires”: []
    },
    {
    “id”: “3deb8b862d1238e4”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Statusbericht formatieren”,
    “func”: “// Statusbericht formatieren\nconst data = msg.payload;\nconst friendlyName = data.friendly_name || \”Rauchmelder Keller Werkstatt\”;\nconst timestamp = new Date().toLocaleString(‘de-DE’, {\n weekday: ‘long’,\n year: ‘numeric’,\n month: ‘2-digit’,\n day: ‘2-digit’,\n hour: ‘2-digit’,\n minute: ‘2-digit’,\n second: ‘2-digit’\n});\n\n// Batteriestatus\nlet batteryEmoji = \”🔋\”;\nlet batteryStatus = \”\”;\nif (data.battery <= 20) {\n batteryEmoji = \”⚠️🔴\”;\n batteryStatus = \”KRITISCH – SOFORT WECHSELN!\”;\n} else if (data.battery <= 50) {\n batteryEmoji = \”⚠️🟡\”;\n batteryStatus = \”Bald wechseln\”;\n} else if (data.battery <= 80) {\n batteryEmoji = \”🟢\”;\n batteryStatus = \”Gut\”;\n} else {\n batteryEmoji = \”💚\”;\n batteryStatus = \”Sehr gut\”;\n}\n\n// Geräte-Status\nlet deviceStatus = \”✅ OK\”;\nif (data.battery_low) deviceStatus = \”⚠️ Batterie schwach\”;\nif (data.trouble) deviceStatus = \”🔴 Störung\”;\nif (data.tamper) deviceStatus = \”🔧 Manipulation\”;\nif (data.smoke) deviceStatus = \”🚨 RAUCHALARM!\”;\n\n// Linkqualität (LQI: 0-255)\nlet linkQualityText = \”🔴 Schlecht\”;\nif (data.linkquality >= 200) linkQualityText = \”🟢 Sehr gut\”;\nelse if (data.linkquality >= 150) linkQualityText = \”🟢 Gut\”;\nelse if (data.linkquality >= 100) linkQualityText = \”🟡 Mittel\”;\nelse if (data.linkquality >= 50) linkQualityText = \”🟠 Schwach\”;\n\n// Last seen formatieren\nlet lastSeenStr = \”Unbekannt\”;\nif (data.last_seen) {\n try {\n lastSeenStr = new Date(data.last_seen).toLocaleString(‘de-DE’);\n } catch (e) {\n lastSeenStr = data.last_seen;\n }\n}\n\n// Statusbericht\nconst reportTitle = `Statusbericht – Rauchmelder`; // Ohne Emoji für Header\nconst reportMessage = \n `📋 ${reportTitle}\\n` +\n `Gerät: ${friendlyName}\\n` +\n `${batteryEmoji} Batterie: ${data.battery}% – ${batteryStatus}\\n` +\n `📶 Signal: ${linkQualityText} (${data.linkquality} LQI)\\n` +\n `🔄 Gerätestatus: ${deviceStatus}\\n` +\n `🕒 Letzter Kontakt: ${lastSeenStr}\\n` +\n `📊 Bericht erstellt: ${timestamp}\\n\\n` +\n `Letzte Werte:\\n` +\n `• Rauch gemeldet: ${data.smoke ? ‘Ja 🚨’ : ‘Nein ✅’}\\n` +\n `• Batterie schwach: ${data.battery_low ? ‘Ja ⚠️’ : ‘Nein ✅’}\\n` +\n `• Manipulation: ${data.tamper ? ‘Ja 🔧’ : ‘Nein ✅’}\\n` +\n `• Störung: ${data.trouble ? ‘Ja 🔴’ : ‘Nein ✅’}\\n` +\n `• Test-Modus: ${data.test_mode ? ‘Ja 🔧’ : ‘Nein ✅’}\\n\\n`;\n\n// Für Pushover\nmsg.pushover = {\n // url: \”https://ntfy.sh/secret-theme-Rauchmelder\”,\n // method: \”POST\”,\n headers: {\n \”Title\”: reportTitle.replace(/[^a-zA-Z0-9\\s-]/g, ”), // Entfernt alle Sonderzeichen\n \”Tags\”: data.battery <= 20 ? \”warning,rotating_light,battery\” : \”battery,rotating_light\”,\n \”Priority\”: data.battery <= 20 ? \”high\” : \”default\”\n },\n payload: reportMessage\n};\n\n// Für ntfy – Header müssen ASCII-konform sein (keine Umlaute oder Emojis)\nmsg.ntfy = {\n url: \”https://ntfy.sh/secret-theme-Rauchmelder\”,\n method: \”POST\”,\n headers: {\n \”Title\”: reportTitle.replace(/[^a-zA-Z0-9\\s-]/g, ”), // Entfernt alle Sonderzeichen\n \”Tags\”: data.battery <= 20 ? \”warning,rotating_light,battery\” : \”battery,rotating_light\”,\n \”Priority\”: data.battery <= 20 ? \”high\” : \”default\”\n },\n payload: reportMessage\n};\n\n// Kennzeichnung für Debug\nmsg.is_battery_report = true;\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 230,
    “y”: 200,
    “wires”: [
    [
    “acbb6ccfa4615f05”,
    “0f916dab840c7276”
    ]
    ]
    },
    {
    “id”: “acbb6ccfa4615f05”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “ntfy vorbereiten”,
    “func”: “// ntfy Request vorbereiten\nconst ntfyConfig = msg.ntfy;\n\n// HTTP Request für ntfy erstellen\nmsg.url = ntfyConfig.url;\nmsg.method = ntfyConfig.method;\nmsg.headers = ntfyConfig.headers;\nmsg.payload = ntfyConfig.payload;\n\n// Debug-Ausgabe (optional, kann später entfernt werden)\nnode.warn(\”ntfy Header: \” + JSON.stringify(msg.headers));\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 500,
    “y”: 200,
    “wires”: [
    [
    “2cf42ba58b153108”
    ]
    ]
    },
    {
    “id”: “2cf42ba58b153108”,
    “type”: “http request”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Keller Werkstatt ntfy senden”,
    “method”: “use”,
    “ret”: “txt”,
    “paytoqs”: “ignore”,
    “url”: “”,
    “tls”: “”,
    “persist”: false,
    “proxy”: “”,
    “insecureHTTPParser”: false,
    “authType”: “”,
    “senderr”: false,
    “headers”: [],
    “x”: 560,
    “y”: 260,
    “wires”: [
    []
    ]
    },
    {
    “id”: “0f916dab840c7276”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Pushover vorbereiten”,
    “func”: “// Pushover Request vorbereiten\nconst pushoverConfig = msg.pushover;\n\n// HTTP Request für Pushover erstellen\nmsg.headers = pushoverConfig.headers;\nmsg.payload = pushoverConfig.payload;\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 300,
    “y”: 300,
    “wires”: [
    [
    “296a847a7c85c981”
    ]
    ]
    },
    {
    “id”: “fd8f8ffdf77a106c”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Rauchmelder Daten aufbereiten”,
    “func”: “// ZigBee2MQTT Daten parsen\nlet data = msg.payload;\nlet deviceInfo = {};\nlet alarmStatus = false;\n\n// Prüfen ob Daten vorhanden sind\nif (typeof data === ‘object’) {\n // Batteriestatus (in % oder Spannung)\n deviceInfo.battery = data.battery || data.battery_percentage || 0;\n deviceInfo.battery_low = data.battery_low || false;\n \n // Test-Modus (falls vorhanden)\n deviceInfo.test_mode = data.test || false; // Wichtig: heißt ‘test’ im HS1SA-E\n \n // Rauchmelder Status (Alarm!)\n deviceInfo.smoke = data.smoke || false;\n alarmStatus = deviceInfo.smoke; // Für Alarmerkennung\n \n // Link Quality\n deviceInfo.linkquality = data.linkquality || 0;\n \n // Last seen aus ZigBee2MQTT\n deviceInfo.last_seen = data.last_seen || new Date().toISOString();\n \n // Batterie OK Status berechnen\n deviceInfo.battery_ok = true;\n if (deviceInfo.battery_low === true || \n (typeof deviceInfo.battery === ‘number’ && deviceInfo.battery < 20)) {\n deviceInfo.battery_ok = false;\n }\n \n // Timestamp für die aktuelle Abfrage\n deviceInfo.timestamp = new Date().toISOString();\n deviceInfo.timestamp_formatted = new Date().toLocaleString(‘de-DE’);\n deviceInfo.friendly_name = \”Keller Werkstatt\”;\n \n // Alarm-Status für nachfolgende Nodes\n msg.payload = deviceInfo;\n msg.alarm_active = alarmStatus; // Explizites Flag für Alarm\n msg.alarm_triggered = alarmStatus; // Alternative Bezeichnung\n \n return msg;\n}\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 570,
    “y”: 400,
    “wires”: [
    [
    “0469b6708a6631f2”
    ]
    ]
    },
    {
    “id”: “0469b6708a6631f2”,
    “type”: “switch”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Alarm-Status prüfen”,
    “property”: “alarm_active”,
    “propertyType”: “msg”,
    “rules”: [
    {
    “t”: “true”
    }
    ],
    “checkall”: “true”,
    “repair”: false,
    “outputs”: 1,
    “x”: 240,
    “y”: 460,
    “wires”: [
    [
    “e45e871a10a710b2”,
    “685b6cb6ac3300e8”
    ]
    ]
    },
    {
    “id”: “e45e871a10a710b2”,
    “type”: “trigger”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “30s Blinksteuerung”,
    “op1”: “start”,
    “op2”: “stop”,
    “op1type”: “str”,
    “op2type”: “str”,
    “duration”: “30”,
    “extend”: false,
    “overrideDelay”: false,
    “units”: “s”,
    “reset”: “”,
    “bytopic”: “all”,
    “topic”: “topic”,
    “outputs”: 2,
    “x”: 910,
    “y”: 460,
    “wires”: [
    [
    “95efe3c5faf4ab5b”
    ],
    [
    “b69dfaa826fb2d91”
    ]
    ]
    },
    {
    “id”: “95efe3c5faf4ab5b”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Blink-Modus vorbereiten”,
    “func”: “// Blink-Modus für die Kerzenbirne\n// Sekundentakt: 1s an, 1s aus\n\n// Aktuellen Zustand der Birne abfragen und speichern\n// Dazu müssten Sie den aktuellen Status kennen – hier als Platzhalter\nflow.set(\”light_previous_state\”, {\n state: \”ON\”, // Hier müsste der echte Status ermittelt werden\n brightness: 254\n});\n\n// Blinken aktivieren\nflow.set(\”blink_active\”, true);\nflow.set(\”blink_counter\”, 0);\nflow.set(\”blink_state\”, \”OFF\”); // Startet mit OFF, dann wechselt zu ON\n\n// Ersten Befehl senden (Licht an in Rot)\nmsg.topic = \”zigbee2mqtt/KerzenbirneBuero/set\”;\nmsg.payload = {\n \”state\”: \”ON\”,\n \”brightness\”: 254,\n \”color\”: { \”hex\”: \”#FF0000\” }\n};\n\nnode.warn(\”Alarm-Blinken gestartet\”);\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 930,
    “y”: 400,
    “wires”: [
    [
    “6f243fcb4da873d4”
    ]
    ]
    },
    {
    “id”: “6f243fcb4da873d4”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Toggle-Blinken”,
    “func”: “// Diese Funktion erzeugt den Sekundentakt\n// Sie wird von einem Inject-Node im Sekundentakt aufgerufen\n\n// Aktuellen Zustand aus Flow-Kontext holen\nlet currentState = flow.get(\”blink_state\”) || \”OFF\”;\nlet counter = flow.get(\”blink_counter\”) || 0;\nlet blinkActive = flow.get(\”blink_active\”) || false;\n\n// Prüfen ob Blinken aktiv ist (vom Trigger gesetzt)\nif (!blinkActive) {\n // Wenn nicht aktiv, nichts tun\n return null;\n}\n\n// Zustand umschalten\nlet newState = (currentState === \”ON\”) ? \”OFF\” : \”ON\”;\nflow.set(\”blink_state\”, newState);\n\n// Zähler erhöhen\ncounter++;\nflow.set(\”blink_counter\”, counter);\n\n// Nach 30 Sekunden automatisch beenden (30 Toggles = 30 Sekunden bei 1s Intervall)\nif (counter >= 30) {\n // Blinken beenden\n flow.set(\”blink_counter\”, 0);\n flow.set(\”blink_state\”, \”OFF\”);\n flow.set(\”blink_active\”, false);\n\n // Vorherigen Zustand wiederherstellen\n let previousState = flow.get(\”light_previous_state\”) || { state: \”OFF\” };\n\n msg.topic = \”zigbee2mqtt/KerzenbirneBuero/set\”;\n msg.payload = {\n \”state\”: previousState.state || \”OFF\”\n };\n\n node.warn(\”Alarm-Blinken nach 30s beendet\”);\n return msg;\n}\n\n// Befehl für die Kerzenbirne\nmsg.topic = \”zigbee2mqtt/KerzenbirneBuero/set\”;\nif (newState === \”ON\”) {\n msg.payload = {\n \”state\”: \”ON\”,\n \”brightness\”: 254,\n \”color\”: { \”hex\”: \”#FF0000\” } // Rot\n };\n} else {\n msg.payload = {\n \”state\”: \”OFF\”\n };\n}\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 1200,
    “y”: 440,
    “wires”: [
    [
    “191ef45fc6c07a97”
    ]
    ]
    },
    {
    “id”: “b69dfaa826fb2d91”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Blinken beenden”,
    “func”: “// Blinken stoppen\nflow.set(\”blink_active\”, false);\nflow.set(\”blink_counter\”, 0);\nflow.set(\”blink_state\”, \”OFF\”);\n\n// Vorherigen Zustand wiederherstellen\nlet previousState = flow.get(\”light_previous_state\”) || { state: \”OFF\” };\n\nmsg.topic = \”zigbee2mqtt/KerzenbirneBuero/set\”;\nmsg.payload = {\n \”state\”: previousState.state || \”OFF\”\n};\n\nnode.warn(\”Alarm-Blinken gestoppt\”);\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 1210,
    “y”: 400,
    “wires”: [
    [
    “191ef45fc6c07a97”
    ]
    ]
    },
    {
    “id”: “685b6cb6ac3300e8”,
    “type”: “function”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Alarm-Pushover”,
    “func”: “// Alarm-Benachrichtigung für Pushover\nconst data = msg.payload;\nconst timestamp = new Date().toLocaleString(‘de-DE’, {\n weekday: ‘long’,\n year: ‘numeric’,\n month: ‘2-digit’,\n day: ‘2-digit’,\n hour: ‘2-digit’,\n minute: ‘2-digit’,\n second: ‘2-digit’\n});\n\n// Gerätename ermitteln (mit Fallback)\nconst deviceName = data.friendly_name || ‘Rauchmelder Werkstatt’;\n\n// Alarm-Nachricht formatieren\nlet alarmMessage =\n `🚨 RAUCHALARM! 🚨\n\nGerät: ${deviceName}\nZeit: ${timestamp}\n\n📍 Bereich: ${deviceName}\n⚠️ Es wurde RAUCH detektiert!\n\nBitte überprüfen Sie den Bereich SOFORT!`;\n\n// Pushover-spezifische Felder\nmsg.title = `🚨 RAUCHALARM – ${deviceName}`;\nmsg.payload = alarmMessage;\nmsg.priority = 1; // High Priority\nmsg.sound = \”persistent\”; // Alarmton\nmsg.timestamp = Math.floor(Date.now() / 1000);\n\nreturn msg;”,
    “outputs”: 1,
    “timeout”: 0,
    “noerr”: 0,
    “initialize”: “”,
    “finalize”: “”,
    “libs”: [],
    “x”: 460,
    “y”: 500,
    “wires”: [
    [
    “6247c2a58286fc73”
    ]
    ]
    },
    {
    “id”: “efd4d502334fbc36”,
    “type”: “inject”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Sekundentakt für Blinken”,
    “props”: [
    {
    “p”: “payload”
    }
    ],
    “repeat”: “1”,
    “crontab”: “”,
    “once”: false,
    “onceDelay”: 0.1,
    “topic”: “”,
    “payload”: “”,
    “payloadType”: “date”,
    “x”: 930,
    “y”: 500,
    “wires”: [
    [
    “6f243fcb4da873d4”
    ]
    ]
    },
    {
    “id”: “6247c2a58286fc73”,
    “type”: “pushover api”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “keys”: “13d7f9e6fd4a0fe1”,
    “title”: “Rauchmelder Werkstatt Alarm”,
    “name”: “Pushover Werkstatt”,
    “x”: 670,
    “y”: 500,
    “wires”: []
    },
    {
    “id”: “ab3764d33b337c6f”,
    “type”: “comment”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “=== ALARM-BENACHRICHTIGUNG & BLINKEN ===”,
    “info”: “”,
    “x”: 280,
    “y”: 360,
    “wires”: []
    },
    {
    “id”: “0f3d4c079b703181”,
    “type”: “zigbee2mqtt-in”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “”,
    “server”: “1bfcccb11dd30d19”,
    “friendly_name”: “KellerWerkstatt (HS1SA-E)”,
    “device_id”: “0xf84477fffe123ed0”,
    “state”: “0”,
    “outputAtStartup”: true,
    “filterChanges”: true,
    “enableMultiple”: false,
    “x”: 190,
    “y”: 400,
    “wires”: [
    [
    “fd8f8ffdf77a106c”,
    “d4e9451a20607f2f”
    ]
    ]
    },
    {
    “id”: “cb8dcc5798bb85a4”,
    “type”: “inject”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Manueller Test”,
    “props”: [
    {
    “p”: “payload”
    },
    {
    “p”: “topic”,
    “vt”: “str”
    }
    ],
    “repeat”: “”,
    “crontab”: “”,
    “once”: false,
    “onceDelay”: 0.1,
    “topic”: “”,
    “payload”: “”,
    “payloadType”: “date”,
    “x”: 260,
    “y”: 500,
    “wires”: [
    [
    “685b6cb6ac3300e8”,
    “e45e871a10a710b2”
    ]
    ]
    },
    {
    “id”: “551b4d13bc9b505f”,
    “type”: “inject”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “”,
    “props”: [
    {
    “p”: “payload”
    },
    {
    “p”: “topic”,
    “vt”: “str”
    }
    ],
    “repeat”: “”,
    “crontab”: “”,
    “once”: false,
    “onceDelay”: 0.1,
    “topic”: “”,
    “payload”: “”,
    “payloadType”: “date”,
    “x”: 1070,
    “y”: 360,
    “wires”: [
    [
    “b69dfaa826fb2d91”
    ]
    ]
    },
    {
    “id”: “191ef45fc6c07a97”,
    “type”: “zigbee2mqtt-out”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Kerzenbirne”,
    “server”: “1bfcccb11dd30d19”,
    “friendly_name”: “KerzenbirneBuero (HG07834B/HG09155B/HG08131B)”,
    “device_id”: “0x8cf681fffeaf1b37”,
    “command”: “state”,
    “commandType”: “z2m_cmd”,
    “payload”: “payload”,
    “payloadType”: “msg”,
    “optionsValue”: “”,
    “optionsType”: “nothing”,
    “x”: 1210,
    “y”: 500,
    “wires”: []
    },
    {
    “id”: “d4e9451a20607f2f”,
    “type”: “debug”,
    “z”: “a906f7d4665bf705”,
    “g”: “f19c1232b5818c2a”,
    “name”: “Werkstatt”,
    “active”: true,
    “tosidebar”: true,
    “console”: false,
    “tostatus”: true,
    “complete”: “payload”,
    “targetType”: “msg”,
    “statusVal”: “payload”,
    “statusType”: “auto”,
    “x”: 600,
    “y”: 360,
    “wires”: []
    },
    {
    “id”: “1bfcccb11dd30d19”,
    “type”: “zigbee2mqtt-server”,
    “name”: “Sonoff ZigBee Raspi”,
    “host”: “Raspi”,
    “mqtt_port”: “1883”,
    “mqtt_username”: “raspi”,
    “mqtt_password”: “password”,
    “mqtt_qos”: “2”,
    “tls”: “”,
    “usetls”: false,
    “base_topic”: “zigbee2mqtt”
    },
    {
    “id”: “5673b51cc6b259c0”,
    “type”: “ui-group”,
    “name”: “Keller Werkstatt”,
    “page”: “5515adb8b2455e2c”,
    “width”: “3”,
    “height”: 1,
    “order”: 2,
    “showTitle”: true,
    “className”: “”,
    “visible”: “true”,
    “disabled”: “false”,
    “groupType”: “default”
    },
    {
    “id”: “13d7f9e6fd4a0fe1”,
    “type”: “pushover-keys”,
    “name”: “Rauchmelder Berichte, Warnungen”
    },
    {
    “id”: “5515adb8b2455e2c”,
    “type”: “ui-page”,
    “name”: “Rauchmelder”,
    “ui”: “2e2c9c04099535bf”,
    “path”: “/page3”,
    “icon”: “smoke”,
    “layout”: “grid”,
    “theme”: “12f619e2761c4ce7”,
    “breakpoints”: [
    {
    “name”: “Default”,
    “px”: “0”,
    “cols”: “3”
    },
    {
    “name”: “Tablet”,
    “px”: “576”,
    “cols”: “6”
    },
    {
    “name”: “Small Desktop”,
    “px”: “768”,
    “cols”: “9”
    },
    {
    “name”: “Desktop”,
    “px”: “1024”,
    “cols”: “12”
    }
    ],
    “order”: 1,
    “className”: “”,
    “visible”: “true”,
    “disabled”: “false”
    },
    {
    “id”: “2e2c9c04099535bf”,
    “type”: “ui-base”,
    “name”: “Dashboard @flowuse”,
    “path”: “/dashboard”,
    “appIcon”: “”,
    “includeClientData”: true,
    “acceptsClientConfig”: [
    “ui-notification”,
    “ui-control”
    ],
    “showPathInSidebar”: false,
    “headerContent”: “dashboard”,
    “navigationStyle”: “default”,
    “titleBarStyle”: “default”,
    “showReconnectNotification”: true,
    “notificationDisplayTime”: 1,
    “showDisconnectNotification”: true,
    “allowInstall”: false
    },
    {
    “id”: “12f619e2761c4ce7”,
    “type”: “ui-theme”,
    “name”: “Standardthema”,
    “colors”: {
    “surface”: “#5734fc”,
    “primary”: “#e3b450”,
    “bgPage”: “#eeeeee”,
    “groupBg”: “#ffffff”,
    “groupOutline”: “#cccccc”
    },
    “sizes”: {
    “density”: “default”,
    “pagePadding”: “12px”,
    “groupGap”: “12px”,
    “groupBorderRadius”: “4px”,
    “widgetGap”: “12px”
    }
    },
    {
    “id”: “c812ee4757f928dd”,
    “type”: “global-config”,
    “env”: [],
    “modules”: {
    “node-red-contrib-zigbee2mqtt”: “2.7.5”,
    “node-red-node-email-variable”: “1.1.7”,
    “@flowfuse/node-red-dashboard”: “1.30.2”,
    “node-red-contrib-pushover”: “0.2.0”
    }
    }
    ]
  • Fritzing Breadboard Wiring Diagram

    HC-SR501 PIR Motion Sensor Test with Arduino Uno and Breadboard

    To figure out how to configure an HC-SR501 motion detector, I built a breadboard with a test circuit. This requires an Arduino Uno, the HC-SR501 sensor, an LED, a passive piezo buzzer, a 220 ohm resistor, a power supply or USB Cable to power the Arduino, and some jumper cables.

    On the Arduino you have to Upload the cpp Code from the INO-File to switch the Buzzer and the LED on and off when Motion ist detected.

    I put the whole thing together in Fritzing, and it’s available here also as an fzz file for download.

    The HC-SR501 motion detector has two potentiometers for setting values:
    1.) Sensitivity (SENS) → controls the range (~3m to ~7m)
    2.) Time delay (TIME) → controls how long the OUT pin remains HIGH (from approximately 2 seconds to several minutes)
    With the test setup, a suitable value can be determined for what you ultimately want to build by changing the potentiometer setting.

    Have fun trying it out and modify it for your own Requirements!

    Best regards,

    Edi

    CPP-Code for programming the Arduino One
    (INO-File Downlod here):

    const int pirPin = 2; // HC-SR501 Ausgang
    const int ledPin = 5;  // LED Pin
    const int buzzerPin = 4; // Summer Pin
    int pirState = LOW; // Aktueller Zustand des PIR Sensors
    
    void setup() {
      pinMode(pirPin, INPUT);
      pinMode(ledPin, OUTPUT);
      pinMode(buzzerPin, OUTPUT);
      Serial.begin(9600); // Für Debugging
    }
    
    void loop() {
      pirState = digitalRead(pirPin);
    
      if (pirState == HIGH) {
        digitalWrite(ledPin, HIGH);
        digitalWrite(buzzerPin, HIGH);
        Serial.println("Bewegung erkannt!");
        delay(1000); // Kurze Pause
        digitalWrite(ledPin, LOW);
        digitalWrite(buzzerPin, LOW);
        Serial.println("Pause...");
        delay(2000); //  Eine längere Pause
      }
    }

     

    Here you will find the Fritzing File:

    Download FZZ-File

    It was built with Fritzing Version 1.05

    Fritzing Version 1.0.5

    HC-SR501 Sensor in Progress

  • ESP32-Cam and D1 Mini ESP8266 Projects

    In this Part of my Blog i will show you some Projects that use the ESP32 Cam and the D1 Mini NodeMcu with ESP8266 Modules. There are a few things that this Controller are good for.

    I have some D1 Mini NodeMcu with ESP8266 to control Temperature, Humidity and Airpressure inside and outside of my House. They all have a rechargeable Battery to function for a few Weeks or Months. Captured values are stored in an InfluxDB. The resulting Curves can bo viewed with Grafana. With Node-Red i´vs programmed Dashboards to visualise the Temperature, Humidity and Airpressure with Gauges and Charts.

    The ESP32 Cam can be used as a Live Cam, Cam with automatic storing Pictures to a SD Card or send Photos via Email. Also it can ba combined for Examlpe with an HC-SR501 PIR Motion Detector to send Photos via Email when a Movment ist recognized.

    There are many Projects that can be set up with these Controllers

    Have fun and be creative to make your own things

  • Tasmota Plug – Control with Node-Red and MQTT

    Here you will find some Projects to control Tasmota Plugs with the help of Node-Red and MQTT. Requirements are an RaspberryPi ore a Server on which Mosquitto, Node-Red with Dashboard is installed. The Tasmota Plugs should be configured to work in your MQTT Environment, so you have to use Topics, that will fit your naming themes.

    Tasmota is an open source firmware for Espressif ESP8266, ESP32, ESP32-S or ESP32-C3 chipset based devices created and maintained by Theo Arends.

    Tasmota Logo

    You can flash Tasmota Plugs with the Tasmota Firmware: https://tasmota.github.io/docs/

    Here you can see the Blog Posts that i´ve already published

  • Keep your basement dry – WITHOUT electricity costs

    If you have the problem that a room in your basement is damp, this project might help you.

    Keep your basement dry – WITHOUT electricity costs with an “Digital 2-in-1 Dehumidifier” (Sichler electric dehumidifier, dehumidifier & air purifier model: LFT-200 or any other dehumidifier of your choice thas can be switched on / off via the powercord)
    => Control the dehumidifier trough a Tasmota socket and Node-Red, Mosquitto via MQTT on a Raspberry Pi. Switching times are based on adjustable thresholds for battery charge.

    Requirements:

    • Raspberrypi with Node-Red with Dashboard and Mosquitto MQTT Broker installed
    • PV system with batteries: home power station E3/DC
    • RSCP2MQTT installed on the Raspi [(https://github.com/pvtom/rscp2mqtt)] to get Values from the Station
    • Tasmota socket with MQTT switched on and configured for the Mosquitto Broker
    • “Digital 2-in-1 Dehumidifier” or any other Dehumidifier which can be controlled with the Tasmota plug

    The Dehumidifier i´m using:

    Picture of the Dehumidifier

    Picture of the Dehumidifier

    Shop where you can buy the Dehumidifier

    Installation

    Verify that the above Requirements are met.
    Import the flow into Node-RED.
    Make corrections in the Nodes for your System:
    Activate and test the flow.

    Usage

    The flow runs automatically in the background and monitors the incoming values form the PV System.
    If the adjusted Value are reached, the Dehumidifier will start working and drying the Air. If the values are not met it will stop.

    Pictures of the Node-Red Dashboard:

     

    Node-Red Dashboard Control Elements

    Node-Red Dashboard Control Elements

     

    Node-Red Dashboard Zustand

    Node-Red Dashboard Zustand

    License

    This project is licensed under the MIT License.

    Contact

    The Flow of the Project (Downlod here):

    [
        {
            "id": "fad7798580148e6d",
            "type": "group",
            "z": "948162f7d59a232b",
            "style": {
                "stroke": "#999999",
                "stroke-opacity": "1",
                "fill": "none",
                "fill-opacity": "1",
                "label": true,
                "label-position": "nw",
                "color": "#a4a4a4"
            },
            "nodes": [
                "583b3ec8361b0d57",
                "ce37ef6376ea9cbd",
                "9d4c97bac4e78834",
                "9778e2d3b6ddfde3",
                "9e81875bb6f772ae",
                "c8fc51cc976d5145",
                "d6cca2c7d8a638ae",
                "941d64c42315d5e0",
                "0561233652a0c2ec",
                "9014b5d738340d20",
                "259161055f18a4fe",
                "4d48d19951742a23",
                "a8e2f5579f63a2dc",
                "3d43bdd7cc178da7",
                "ea0f64baaf4ee614",
                "f85966c927494ebf",
                "af1dba1b40291188",
                "6dc5cfa56fcfb6ce",
                "2676a2ac0cc7cdb2",
                "071e45791b47638e",
                "aea6342fca8fc732",
                "4b748d6f4a591fcd",
                "34a689110f39bec0",
                "66292c2c9a6fd73f",
                "f513bdd86824f53c",
                "d49ed54c7e4f157a",
                "cf032cb70ba16467",
                "60412301b4b86494",
                "a2b9f3f8051b8b37",
                "fcd22b23513fa73a",
                "3eb12635aed91f82",
                "74ae3c73dbd474cf",
                "eebde64123f8c40b"
            ],
            "x": 28,
            "y": 879,
            "w": 1084,
            "h": 828
        },
        {
            "id": "583b3ec8361b0d57",
            "type": "inject",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "",
            "props": [
                {
                    "p": "payload"
                }
            ],
            "repeat": "",
            "crontab": "",
            "once": false,
            "onceDelay": 0.1,
            "topic": "",
            "payload": "1",
            "payloadType": "num",
            "x": 150,
            "y": 960,
            "wires": [
                [
                    "af1dba1b40291188"
                ]
            ]
        },
        {
            "id": "ce37ef6376ea9cbd",
            "type": "mqtt out",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Plug-UG-01",
            "topic": "Haus/Keller/Tasmota/Plug-UG-01/cmnd/POWER",
            "qos": "2",
            "retain": "",
            "respTopic": "",
            "contentType": "",
            "userProps": "",
            "correl": "",
            "expiry": "",
            "broker": "88539582a8a310de",
            "x": 430,
            "y": 980,
            "wires": []
        },
        {
            "id": "9d4c97bac4e78834",
            "type": "inject",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "",
            "props": [
                {
                    "p": "payload"
                }
            ],
            "repeat": "",
            "crontab": "",
            "once": false,
            "onceDelay": 0.1,
            "topic": "",
            "payload": "0",
            "payloadType": "num",
            "x": 150,
            "y": 1000,
            "wires": [
                [
                    "f85966c927494ebf"
                ]
            ]
        },
        {
            "id": "9778e2d3b6ddfde3",
            "type": "ui_led",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "order": 2,
            "group": "7481342d26c171a1",
            "width": 3,
            "height": 2,
            "label": "",
            "labelPlacement": "left",
            "labelAlignment": "left",
            "colorForValue": [
                {
                    "color": "#ff0000",
                    "value": "AUS",
                    "valueType": "str"
                },
                {
                    "color": "#00f900",
                    "value": "AN",
                    "valueType": "str"
                }
            ],
            "allowColorForValueInMessage": false,
            "shape": "circle",
            "showGlow": true,
            "name": "Steckdose UG 01 an / aus",
            "x": 880,
            "y": 1020,
            "wires": []
        },
        {
            "id": "9e81875bb6f772ae",
            "type": "ui_toast",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "position": "bottom left",
            "displayTime": "3",
            "highlight": "yellow",
            "sendall": true,
            "outputs": 0,
            "ok": "OK",
            "cancel": "",
            "raw": true,
            "className": "",
            "topic": "Steckdose UG 01 AN / AUS",
            "name": "Steckdose UG 01 wurde geschaltet",
            "x": 900,
            "y": 980,
            "wires": []
        },
        {
            "id": "c8fc51cc976d5145",
            "type": "mqtt in",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Plug UG 01 SENSOR",
            "topic": "Haus/Keller/Tasmota/Plug-UG-01/SENSOR",
            "qos": "2",
            "datatype": "auto-detect",
            "broker": "88539582a8a310de",
            "nl": false,
            "rap": true,
            "rh": 0,
            "inputs": 0,
            "x": 180,
            "y": 1100,
            "wires": [
                [
                    "0561233652a0c2ec",
                    "259161055f18a4fe",
                    "9014b5d738340d20",
                    "4d48d19951742a23",
                    "071e45791b47638e",
                    "34a689110f39bec0"
                ]
            ]
        },
        {
            "id": "d6cca2c7d8a638ae",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Spannung",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 910,
            "y": 1080,
            "wires": []
        },
        {
            "id": "941d64c42315d5e0",
            "type": "comment",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Tasmota Steckdose UG-01 steuern / auswerten - Keller Luftentfeuchter",
            "info": "",
            "x": 330,
            "y": 920,
            "wires": []
        },
        {
            "id": "0561233652a0c2ec",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "ENERGY.Voltage",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.ENERGY.Voltage",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 430,
            "y": 1100,
            "wires": [
                [
                    "d6cca2c7d8a638ae",
                    "2676a2ac0cc7cdb2"
                ]
            ]
        },
        {
            "id": "9014b5d738340d20",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "ENERGY.Total",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.ENERGY.Total",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 420,
            "y": 1140,
            "wires": [
                [
                    "3d43bdd7cc178da7",
                    "6dc5cfa56fcfb6ce"
                ]
            ]
        },
        {
            "id": "259161055f18a4fe",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "SENSOR",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 180,
            "y": 1180,
            "wires": []
        },
        {
            "id": "4d48d19951742a23",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "ENERGY.ApparentPower",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.ENERGY.ApparentPower",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 450,
            "y": 1180,
            "wires": [
                [
                    "a8e2f5579f63a2dc",
                    "ea0f64baaf4ee614",
                    "74ae3c73dbd474cf"
                ]
            ]
        },
        {
            "id": "a8e2f5579f63a2dc",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Watt VA",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 900,
            "y": 1160,
            "wires": []
        },
        {
            "id": "3d43bdd7cc178da7",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Gesamt Verbrauch",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 930,
            "y": 1120,
            "wires": []
        },
        {
            "id": "ea0f64baaf4ee614",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Aktueller Verbrauch Watt",
            "group": "7481342d26c171a1",
            "order": 3,
            "width": 4,
            "height": 4,
            "gtype": "gage",
            "title": "Aktueller Verbrauch Watt",
            "label": "Watt",
            "format": "{{value}} Watt",
            "min": 0,
            "max": "150",
            "colors": [
                "#00b500",
                "#e6e600",
                "#ca3838"
            ],
            "seg1": "",
            "seg2": "",
            "diff": false,
            "className": "",
            "x": 690,
            "y": 1180,
            "wires": []
        },
        {
            "id": "f85966c927494ebf",
            "type": "ui_button",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "",
            "group": "7481342d26c171a1",
            "order": 6,
            "width": 1,
            "height": 2,
            "passthru": false,
            "label": "AUS",
            "tooltip": "",
            "color": "",
            "bgcolor": "",
            "className": "",
            "icon": "radio_button_unchecked",
            "payload": "0",
            "payloadType": "num",
            "topic": "topic",
            "topicType": "msg",
            "x": 270,
            "y": 1000,
            "wires": [
                [
                    "ce37ef6376ea9cbd",
                    "60412301b4b86494"
                ]
            ]
        },
        {
            "id": "af1dba1b40291188",
            "type": "ui_button",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "",
            "group": "7481342d26c171a1",
            "order": 1,
            "width": 1,
            "height": 2,
            "passthru": false,
            "label": "AN",
            "tooltip": "",
            "color": "",
            "bgcolor": "",
            "className": "",
            "icon": "radio_button_checked",
            "payload": "1",
            "payloadType": "num",
            "topic": "topic",
            "topicType": "msg",
            "x": 270,
            "y": 960,
            "wires": [
                [
                    "ce37ef6376ea9cbd",
                    "60412301b4b86494"
                ]
            ]
        },
        {
            "id": "6dc5cfa56fcfb6ce",
            "type": "ui_chart",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Gesamt Verbrauch kWh",
            "group": "7481342d26c171a1",
            "order": 5,
            "width": 4,
            "height": 2,
            "label": "",
            "chartType": "line",
            "legend": "false",
            "xformat": "dd HH:mm",
            "interpolate": "linear",
            "nodata": "",
            "dot": false,
            "ymin": "",
            "ymax": "",
            "removeOlder": "1",
            "removeOlderPoints": "",
            "removeOlderUnit": "604800",
            "cutout": 0,
            "useOneColor": false,
            "useUTC": false,
            "colors": [
                "#1f77b4",
                "#aec7e8",
                "#ff7f0e",
                "#2ca02c",
                "#98df8a",
                "#d62728",
                "#ff9896",
                "#9467bd",
                "#c5b0d5"
            ],
            "outputs": 1,
            "useDifferentColor": false,
            "className": "",
            "x": 690,
            "y": 1140,
            "wires": [
                []
            ]
        },
        {
            "id": "2676a2ac0cc7cdb2",
            "type": "ui_text",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "group": "7481342d26c171a1",
            "order": 7,
            "width": 3,
            "height": 2,
            "name": "Spannung",
            "label": "",
            "format": "{{msg.payload}} Volt",
            "layout": "col-center",
            "className": "",
            "style": false,
            "font": "",
            "fontSize": 16,
            "color": "#000000",
            "x": 650,
            "y": 1100,
            "wires": []
        },
        {
            "id": "071e45791b47638e",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "ENERGY.Power",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.ENERGY.Power",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 420,
            "y": 1220,
            "wires": [
                [
                    "aea6342fca8fc732",
                    "4b748d6f4a591fcd"
                ]
            ]
        },
        {
            "id": "aea6342fca8fc732",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "kWh aktuell",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 910,
            "y": 1200,
            "wires": []
        },
        {
            "id": "4b748d6f4a591fcd",
            "type": "ui_chart",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Aktueller Verbrauch kWh",
            "group": "7481342d26c171a1",
            "order": 8,
            "width": 4,
            "height": 2,
            "label": "",
            "chartType": "line",
            "legend": "false",
            "xformat": "HH:mm",
            "interpolate": "linear",
            "nodata": "",
            "dot": false,
            "ymin": "",
            "ymax": "",
            "removeOlder": "2",
            "removeOlderPoints": "",
            "removeOlderUnit": "3600",
            "cutout": 0,
            "useOneColor": false,
            "useUTC": false,
            "colors": [
                "#1f77b4",
                "#aec7e8",
                "#ff7f0e",
                "#2ca02c",
                "#98df8a",
                "#d62728",
                "#ff9896",
                "#9467bd",
                "#c5b0d5"
            ],
            "outputs": 1,
            "useDifferentColor": false,
            "className": "",
            "x": 690,
            "y": 1220,
            "wires": [
                []
            ]
        },
        {
            "id": "34a689110f39bec0",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "ENERGY.Current",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.ENERGY.Current",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 430,
            "y": 1260,
            "wires": [
                [
                    "66292c2c9a6fd73f",
                    "f513bdd86824f53c"
                ]
            ]
        },
        {
            "id": "66292c2c9a6fd73f",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "A aktuell",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 900,
            "y": 1240,
            "wires": []
        },
        {
            "id": "f513bdd86824f53c",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "",
            "group": "7481342d26c171a1",
            "order": 4,
            "width": 4,
            "height": 4,
            "gtype": "gage",
            "title": "Verbrauch Ampere",
            "label": "Ampere",
            "format": "{{value}}",
            "min": 0,
            "max": "16",
            "colors": [
                "#00b500",
                "#e6e600",
                "#ca3838"
            ],
            "seg1": "",
            "seg2": "",
            "diff": false,
            "className": "",
            "x": 670,
            "y": 1260,
            "wires": []
        },
        {
            "id": "d49ed54c7e4f157a",
            "type": "mqtt in",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Plug UG 01 STATE",
            "topic": "Haus/Keller/Tasmota/Plug-UG-01/STATE",
            "qos": "2",
            "datatype": "auto-detect",
            "broker": "88539582a8a310de",
            "nl": false,
            "rap": true,
            "rh": 0,
            "inputs": 0,
            "x": 170,
            "y": 1040,
            "wires": [
                [
                    "cf032cb70ba16467"
                ]
            ]
        },
        {
            "id": "cf032cb70ba16467",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Payload POWER",
            "rules": [
                {
                    "t": "move",
                    "p": "payload.POWER",
                    "pt": "msg",
                    "to": "payload",
                    "tot": "msg"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 430,
            "y": 1040,
            "wires": [
                [
                    "a2b9f3f8051b8b37"
                ]
            ]
        },
        {
            "id": "60412301b4b86494",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Payload ändern",
            "rules": [
                {
                    "t": "change",
                    "p": "payload",
                    "pt": "msg",
                    "from": "1",
                    "fromt": "num",
                    "to": "AN",
                    "tot": "str"
                },
                {
                    "t": "change",
                    "p": "payload",
                    "pt": "msg",
                    "from": "0",
                    "fromt": "num",
                    "to": "AUS",
                    "tot": "str"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 640,
            "y": 980,
            "wires": [
                [
                    "9778e2d3b6ddfde3",
                    "9e81875bb6f772ae",
                    "fcd22b23513fa73a"
                ]
            ]
        },
        {
            "id": "a2b9f3f8051b8b37",
            "type": "change",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "Payload ändern",
            "rules": [
                {
                    "t": "change",
                    "p": "payload",
                    "pt": "msg",
                    "from": "ON",
                    "fromt": "str",
                    "to": "AN",
                    "tot": "str"
                },
                {
                    "t": "change",
                    "p": "payload",
                    "pt": "msg",
                    "from": "OFF",
                    "fromt": "str",
                    "to": "AUS",
                    "tot": "str"
                }
            ],
            "action": "",
            "property": "",
            "from": "",
            "to": "",
            "reg": false,
            "x": 640,
            "y": 1040,
            "wires": [
                [
                    "9778e2d3b6ddfde3",
                    "fcd22b23513fa73a"
                ]
            ]
        },
        {
            "id": "fcd22b23513fa73a",
            "type": "link out",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "zu E3DC Akku Steuerung",
            "mode": "link",
            "links": [
                "27a960d5656fdc97"
            ],
            "x": 925,
            "y": 920,
            "wires": []
        },
        {
            "id": "3eb12635aed91f82",
            "type": "comment",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "zur Steckdosen Akkusteuerung =>",
            "info": "",
            "x": 740,
            "y": 920,
            "wires": []
        },
        {
            "id": "74ae3c73dbd474cf",
            "type": "link out",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "name": "zu E3DC Watt Anzeige",
            "mode": "link",
            "links": [
                "730586258fa47e1c"
            ],
            "x": 765,
            "y": 1060,
            "wires": []
        },
        {
            "id": "eebde64123f8c40b",
            "type": "group",
            "z": "948162f7d59a232b",
            "g": "fad7798580148e6d",
            "style": {
                "stroke": "#999999",
                "stroke-opacity": "1",
                "fill": "none",
                "fill-opacity": "1",
                "label": true,
                "label-position": "nw",
                "color": "#a4a4a4"
            },
            "nodes": [
                "f1b63107694e70e9",
                "77ba48f8cfe712a4",
                "08ef54e5d364a46c",
                "ecbb019e3253a182",
                "27a960d5656fdc97",
                "b722a788018505c6",
                "fc4f0d8db4ecb974",
                "730586258fa47e1c",
                "52c954b17e7bf4d4",
                "d6f5a61f7a31d4a3",
                "bd65f8e29c68a970",
                "7ccad19143598399",
                "f9ef0d42c6c284dd",
                "9aa1fced9b155c67",
                "47b4a712d2b074c1",
                "d975a2dab0f4a195",
                "f3a3149131c8f5e3",
                "9503b2b6e53876bb",
                "0e12e310fd98d98d",
                "13da3af768167c9e",
                "d72f7580840dd0d6",
                "6298d0e1b20bb323",
                "561807b087ad2d02"
            ],
            "x": 54,
            "y": 1299,
            "w": 1032,
            "h": 382
        },
        {
            "id": "f1b63107694e70e9",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Akku Ladung %",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": true,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "payload",
            "statusType": "auto",
            "x": 220,
            "y": 1380,
            "wires": []
        },
        {
            "id": "77ba48f8cfe712a4",
            "type": "comment",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "E3DC Akkufüllmenge auswerten und Steckdose schalten um Akkus für Geräte zu laden (XX% Schwelle) - Keller Luftentfeuchter",
            "info": "",
            "x": 510,
            "y": 1340,
            "wires": []
        },
        {
            "id": "08ef54e5d364a46c",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "E3DC Akku Ladezustand in %",
            "group": "070122725e128cea",
            "order": 4,
            "width": 4,
            "height": 3,
            "gtype": "gage",
            "title": "E3DC Akku Ladezustand in %",
            "label": "%",
            "format": "{{value | number:0}}",
            "min": 0,
            "max": "100",
            "colors": [
                "#ff9200",
                "#e6e600",
                "#00f900"
            ],
            "seg1": "69",
            "seg2": "71",
            "diff": false,
            "className": "",
            "x": 510,
            "y": 1420,
            "wires": []
        },
        {
            "id": "ecbb019e3253a182",
            "type": "ui_led",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "order": 5,
            "group": "070122725e128cea",
            "width": 4,
            "height": 2,
            "label": "Steckdose Luftentfeuchter AN / AUS",
            "labelPlacement": "left",
            "labelAlignment": "center",
            "colorForValue": [
                {
                    "color": "#ff0000",
                    "value": "AUS",
                    "valueType": "str"
                },
                {
                    "color": "#00f900",
                    "value": "AN",
                    "valueType": "str"
                }
            ],
            "allowColorForValueInMessage": true,
            "shape": "circle",
            "showGlow": true,
            "name": "Steckdose UG 01 an / aus",
            "x": 940,
            "y": 1500,
            "wires": []
        },
        {
            "id": "27a960d5656fdc97",
            "type": "link in",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "von Plu-EG-01",
            "links": [
                "fcd22b23513fa73a"
            ],
            "x": 785,
            "y": 1500,
            "wires": [
                [
                    "ecbb019e3253a182"
                ]
            ]
        },
        {
            "id": "b722a788018505c6",
            "type": "comment",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "von Plug-UG-01 =>",
            "info": "",
            "x": 650,
            "y": 1500,
            "wires": []
        },
        {
            "id": "fc4f0d8db4ecb974",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Aktueller Verbrauch Watt",
            "group": "070122725e128cea",
            "order": 1,
            "width": 4,
            "height": 3,
            "gtype": "gage",
            "title": "Luftentfeuchter Verbrauch",
            "label": "Watt",
            "format": "{{value | number:0}}",
            "min": 0,
            "max": "300",
            "colors": [
                "#00b500",
                "#e6e600",
                "#ca3838"
            ],
            "seg1": "",
            "seg2": "",
            "diff": false,
            "className": "Stromverbrauch",
            "x": 950,
            "y": 1540,
            "wires": []
        },
        {
            "id": "730586258fa47e1c",
            "type": "link in",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "von Plug-EG-01 Watt",
            "links": [
                "74ae3c73dbd474cf"
            ],
            "x": 785,
            "y": 1540,
            "wires": [
                [
                    "fc4f0d8db4ecb974"
                ]
            ]
        },
        {
            "id": "52c954b17e7bf4d4",
            "type": "ui_text",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "group": "070122725e128cea",
            "order": 6,
            "width": 4,
            "height": 2,
            "name": "",
            "label": "Abschaltung unter",
            "format": "{{msg.payload}} %",
            "layout": "col-center",
            "className": "",
            "style": true,
            "font": "Arial Black,Arial Black,Gadget,sans-serif",
            "fontSize": "18",
            "color": "#ff9200",
            "x": 650,
            "y": 1540,
            "wires": []
        },
        {
            "id": "d6f5a61f7a31d4a3",
            "type": "ui_slider",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Schwellwert einstellen",
            "label": "Schwellwert %",
            "tooltip": "",
            "group": "070122725e128cea",
            "order": 7,
            "width": 8,
            "height": 2,
            "passthru": true,
            "outs": "end",
            "topic": "threshold",
            "topicType": "str",
            "min": "20",
            "max": 100,
            "step": 1,
            "className": "",
            "x": 400,
            "y": 1520,
            "wires": [
                [
                    "bd65f8e29c68a970",
                    "52c954b17e7bf4d4",
                    "47b4a712d2b074c1"
                ]
            ]
        },
        {
            "id": "bd65f8e29c68a970",
            "type": "function",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Akku% Vergleich Schwellwert",
            "func": "// Save the latest threshold value in context\nif (msg.topic === \"threshold\") {\n    context.set(\"threshold\", msg.payload);\n    return null; // Don't forward this message\n}\n\n// Get the latest threshold value\nlet threshold = context.get(\"threshold\") || 0;\n\n// Get the battery SOC value\nlet battery_soc = msg.payload;\n\n// Compare the battery SOC with the threshold\nif (battery_soc >= threshold) {\n    // Send command to turn on the plug\n    return { topic: \"Haus/Erdgeschoss/Tasmota/Plug-UG-01/cmnd/POWER\", payload: 1 };\n} else {\n    // Send command to turn off the plug\n    return { topic: \"Haus/Erdgeschoss/Tasmota/Plug-UG-01/cmnd/POWER\", payload: 0 };\n}",
            "outputs": 1,
            "timeout": "",
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 510,
            "y": 1460,
            "wires": [
                [
                    "7ccad19143598399",
                    "f9ef0d42c6c284dd"
                ]
            ]
        },
        {
            "id": "7ccad19143598399",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "0 / 1 von Function",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": true,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "payload",
            "statusType": "auto",
            "x": 910,
            "y": 1460,
            "wires": []
        },
        {
            "id": "f9ef0d42c6c284dd",
            "type": "mqtt out",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Plug-UG-01",
            "topic": "Haus/Keller/Tasmota/Plug-UG-01/cmnd/POWER",
            "qos": "2",
            "retain": "true",
            "respTopic": "",
            "contentType": "",
            "userProps": "",
            "correl": "",
            "expiry": "",
            "broker": "88539582a8a310de",
            "x": 750,
            "y": 1420,
            "wires": []
        },
        {
            "id": "9aa1fced9b155c67",
            "type": "mqtt in",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "",
            "topic": "Haus/Keller/e3dc/battery/soc",
            "qos": "2",
            "datatype": "auto-detect",
            "broker": "88539582a8a310de",
            "nl": false,
            "rap": true,
            "rh": 0,
            "inputs": 0,
            "x": 200,
            "y": 1460,
            "wires": [
                [
                    "bd65f8e29c68a970",
                    "f1b63107694e70e9",
                    "08ef54e5d364a46c",
                    "d975a2dab0f4a195"
                ]
            ]
        },
        {
            "id": "47b4a712d2b074c1",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Schwelle",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "payload",
            "targetType": "msg",
            "statusVal": "",
            "statusType": "auto",
            "x": 410,
            "y": 1560,
            "wires": []
        },
        {
            "id": "d975a2dab0f4a195",
            "type": "debug",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Akku gesamte Meldung",
            "active": false,
            "tosidebar": true,
            "console": false,
            "tostatus": false,
            "complete": "true",
            "targetType": "full",
            "statusVal": "",
            "statusType": "auto",
            "x": 470,
            "y": 1380,
            "wires": []
        },
        {
            "id": "f3a3149131c8f5e3",
            "type": "mqtt in",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "",
            "topic": "Haus/Keller/e3dc/battery/power",
            "qos": "2",
            "datatype": "auto-detect",
            "broker": "88539582a8a310de",
            "nl": false,
            "rap": true,
            "rh": 0,
            "inputs": 0,
            "x": 210,
            "y": 1600,
            "wires": [
                [
                    "d72f7580840dd0d6"
                ]
            ]
        },
        {
            "id": "9503b2b6e53876bb",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Batterie Be- Entladung in Watt",
            "group": "070122725e128cea",
            "order": 2,
            "width": 4,
            "height": 3,
            "gtype": "gage",
            "title": "Batterie Be- Entladung in Watt",
            "label": "Watt",
            "format": "{{value | number:0}}",
            "min": "-500",
            "max": "1000",
            "colors": [
                "#ff2600",
                "#e6e600",
                "#60c453"
            ],
            "seg1": "0",
            "seg2": "400",
            "diff": false,
            "className": "",
            "x": 930,
            "y": 1600,
            "wires": []
        },
        {
            "id": "0e12e310fd98d98d",
            "type": "mqtt in",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "",
            "topic": "Haus/Keller/e3dc/home/power",
            "qos": "2",
            "datatype": "auto-detect",
            "broker": "88539582a8a310de",
            "nl": false,
            "rap": true,
            "rh": 0,
            "inputs": 0,
            "x": 210,
            "y": 1640,
            "wires": [
                [
                    "6298d0e1b20bb323"
                ]
            ]
        },
        {
            "id": "13da3af768167c9e",
            "type": "ui_gauge",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Hausverbrauch aktuell in Watt",
            "group": "070122725e128cea",
            "order": 3,
            "width": 4,
            "height": 3,
            "gtype": "gage",
            "title": "Hausverbrauch aktuell in Watt",
            "label": "Watt",
            "format": "{{value | number:0}}",
            "min": "-0",
            "max": "1000",
            "colors": [
                "#00b500",
                "#e6e600",
                "#ca3838"
            ],
            "seg1": "",
            "seg2": "",
            "diff": false,
            "className": "",
            "x": 930,
            "y": 1640,
            "wires": []
        },
        {
            "id": "d72f7580840dd0d6",
            "type": "function",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Dynamische Werte für Gauge",
            "func": "const value = msg.payload;\n\n// Rundung auf ganze Zahlen\nconst roundedValue = Math.round(value);\n\nconst absValue = Math.abs(roundedValue);\n\n// Berechnung des maxWert, 120% vom absoluten Wert, immer im positiven Bereich\nlet maxWert = Math.round(absValue * 1.2 + 200);\n\n// Berechnung des minWert, abhängig davon, ob value positiv oder negativ ist\nlet minWert = roundedValue < 0 ? Math.round(-absValue * 1.5) : Math.round(-absValue * 0.5);\n\nlet minSeg = Math.round(absValue * 0.4);  // 40% vom absoluten Wert\nlet maxSeg = Math.round(absValue * 0.8);  // 80% vom absoluten Wert\n\n// Debug-Ausgabe zur Überprüfung\nnode.warn(\"Akku Ladung - Max Wert: \" + maxWert + \", Min Wert: \" + minWert + \", Min Seg: \" + minSeg + \", Max Seg: \" + maxSeg);\n\nmsg = {\n    ui_control: {\n        gtype: \"gage\",\n        min: minWert,\n        max: maxWert,\n        colors: [\"red\", \"orange\", \"green\"],\n        seg1: minSeg,\n        seg2: maxSeg\n    },\n    // Sende die gerundeten Werte an das ui_gauge\n    payload: roundedValue\n};\n\nreturn msg;\n",
            "outputs": 1,
            "timeout": "",
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 540,
            "y": 1600,
            "wires": [
                [
                    "9503b2b6e53876bb"
                ]
            ]
        },
        {
            "id": "6298d0e1b20bb323",
            "type": "function",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Dynamische Werte für Gauge",
            "func": "const value = msg.payload;\n\n// Rundung auf ganze Zahlen\nconst roundedValue = Math.round(value);\n\nconst absValue = Math.abs(roundedValue);\n\n// Berechnung des maxWert, 120% vom absoluten Wert, immer im positiven Bereich\nlet maxWert = Math.round(absValue * 1.2 + 200);\n\n// Berechnung des minWert, abhängig davon, ob value positiv oder negativ ist\nlet minWert = roundedValue < 0 ? Math.round(-absValue * 1.5) : Math.round(-absValue * 0.5);\n\nlet minSeg = Math.round(absValue * 0.4);  // 40% vom absoluten Wert\nlet maxSeg = Math.round(absValue * 0.8);  // 80% vom absoluten Wert\n\n// Debug-Ausgabe zur Überprüfung\nnode.warn(\"Haus Verbrauch - Max Wert: \" + maxWert + \", Min Wert: \" + minWert + \", Min Seg: \" + minSeg + \", Max Seg: \" + maxSeg);\n\nmsg = {\n    ui_control: {\n        gtype: \"gage\",\n        min: minWert,\n        max: maxWert,\n        colors: [\"red\", \"orange\", \"green\"],\n        seg1: minSeg,\n        seg2: maxSeg\n    },\n    // Sende die gerundeten Werte an das ui_gauge\n    payload: roundedValue\n};\n\nreturn msg;\n",
            "outputs": 1,
            "timeout": "",
            "noerr": 0,
            "initialize": "",
            "finalize": "",
            "libs": [],
            "x": 540,
            "y": 1640,
            "wires": [
                [
                    "13da3af768167c9e"
                ]
            ]
        },
        {
            "id": "561807b087ad2d02",
            "type": "inject",
            "z": "948162f7d59a232b",
            "g": "eebde64123f8c40b",
            "name": "Schwelle Akku (Init)",
            "props": [
                {
                    "p": "payload"
                }
            ],
            "repeat": "",
            "crontab": "",
            "once": true,
            "onceDelay": 0.1,
            "topic": "",
            "payload": "80",
            "payloadType": "num",
            "x": 190,
            "y": 1520,
            "wires": [
                [
                    "d6f5a61f7a31d4a3"
                ]
            ]
        },
        {
            "id": "070122725e128cea",
            "type": "ui_group",
            "name": "E3DC Akku % Ladung (LED = Steckdose AN / AUS)",
            "tab": "39cbe7e60fb96760",
            "order": 2,
            "disp": true,
            "width": "8",
            "collapse": false,
            "className": ""
        },
        {
            "id": "39cbe7e60fb96760",
            "type": "ui_tab",
            "name": "E3DC Steuerung - Steckdosenleiste, Luftentfeuchter",
            "icon": "check",
            "order": 14,
            "disabled": false,
            "hidden": false
        },
        {
            "id": "88539582a8a310de",
            "type": "mqtt-broker",
            "name": "Edi´s Raspi (1) Mosquitto",
            "broker": "raspberrypi",
            "port": "1883",
            "clientid": "",
            "autoConnect": true,
            "usetls": false,
            "protocolVersion": "4",
            "keepalive": "60",
            "cleansession": true,
            "autoUnsubscribe": true,
            "birthTopic": "",
            "birthQos": "0",
            "birthRetain": "false",
            "birthPayload": "",
            "birthMsg": {},
            "closeTopic": "",
            "closeQos": "0",
            "closeRetain": "false",
            "closePayload": "",
            "closeMsg": {},
            "willTopic": "",
            "willQos": "0",
            "willRetain": "false",
            "willPayload": "",
            "willMsg": {},
            "userProps": "",
            "sessionExpiry": ""
        },
        {
            "id": "7481342d26c171a1",
            "type": "ui_group",
            "name": "Steckdosen Schalter UG 01 - Keller Luftentfeuchter",
            "tab": "29ec6908.552b36",
            "order": 3,
            "disp": true,
            "width": 16,
            "collapse": false,
            "className": ""
        },
        {
            "id": "29ec6908.552b36",
            "type": "ui_tab",
            "name": "Tasmota Steckdose",
            "icon": "power",
            "order": 12,
            "disabled": false,
            "hidden": false
        }
    ]