Met deze tutorial leer je hoe je camerabeelden verwerkt via Node-RED door een snapshot van een camera te sturen naar Google AI. De AI genereert vervolgens een korte beschrijving van wat er op de beelden te zien is. Deze beschrijving kun je opslaan in Home Assistant om later te gebruiken voor meldingen of overzicht. We bekijken twee methodes: een afbeelding via Homey (via MQTT) en een snapshot direct vanuit een Home Assistant-camera.
Wat heb je nodig?
- Een werkende Node-RED installatie. Deze kun je via Instellingen > Add-ons toevoegen aan Home Assistant.
- Een MQTT-broker (bijvoorbeeld Mosquitto)
- Google AI-configuratie voor het genereren van beschrijvingen (zoek bij integraties naar: Google Generative AI)
- Home Assistant met een
input_text
-entiteit voor de omschrijving (een Home Assistant helper).
Methode 1: Snapshot versturen via Homey (via MQTT)
Stap 1: Maak een MQTT-Invoer
- Voeg een MQTT-invoernode toe in Node-RED en stel het in met:
- Topic:
homey/snapshots/achtertuin
- Topic:
- Deze node ontvangt het beeld in base64-formaat via MQTT vanuit Homey.
Stap 2: Decodeer het Base64-formaat en Sla de Afbeelding op
- Voeg een Base64-node toe om de afbeelding te decoderen en koppel deze aan de MQTT-invoer.
- Voeg daarna een Bestandsnode (File node) toe om de afbeelding op te slaan:
- Bestandslocatie:
/homeassistant/www/img/snapshot_image.jpg
- Overschrijf bestand: true
- Bestandslocatie:
- Hiermee wordt de afbeelding opgeslagen, zodat deze beschikbaar is voor Google AI.
Stap 3: Stuur de Afbeelding naar Google AI voor Analyse
- Voeg een API-aanroep-node toe en configureer deze om de afbeelding naar Google AI te sturen:
- Service:
google_generative_ai_conversation.generate_content
- Prompt:
"Beschrijf heel kort wat je ziet gebeuren in deze beelden van mijn camera. Je bericht moet kort genoeg zijn om in een telefoonmelding te passen. Beschrijf geen stilstaande objecten of gebouwen."
- Afbeeldingsbestand:
./www/img/snapshot_image.jpg
- Service:
- Dit zal een korte beschrijving genereren van wat er op de afbeelding te zien is.
Stap 4: Verwerk en Sla de Beschrijving op
- Gebruik een Function-node om de tekst te verwerken:
- Code:
msg.payload = msg.payload.text.replace(/\n/g, " ").replace(/"/g, '\\"'); return msg;
- Code:
- Voeg een MQTT-uitvoernode toe in Node-RED en stel het in met Topic:
homey/ai/camera
- Dit zorgt ervoor dat de gegenereerde beschrijving weer teruggestuurd wordt via mqtt.
Hieronder kun je de node kopiëren en importeren in je node-red. Je zult nog wat aanpassingen moeten maken om het voor jou werkend te maken, maar deze aanpassingen staan in de uitleg hierboven.
[{"id":"92bb63b0375acbd2","type":"mqtt in","z":"c584d4a2bceaa8a7","name":"","topic":"homey/snapshots/achtertuin","qos":"2","datatype":"auto-detect","broker":"ce2f1b0f2e5cc568","nl":false,"rap":true,"rh":0,"inputs":0,"x":180,"y":140,"wires":[["e5a906af99c72dfe"]]},{"id":"d150b0d9bf801e6f","type":"file","z":"c584d4a2bceaa8a7","name":"Save Image","filename":"/homeassistant/www/img/snapshot_image.jpg","filenameType":"str","appendNewline":false,"createDir":true,"overwriteFile":"true","encoding":"none","x":570,"y":140,"wires":[["7d7f461fc6d14033"]]},{"id":"e5a906af99c72dfe","type":"base64","z":"c584d4a2bceaa8a7","name":"","action":"","property":"payload","x":400,"y":140,"wires":[["d150b0d9bf801e6f"]]},{"id":"7d7f461fc6d14033","type":"api-call-service","z":"c584d4a2bceaa8a7","name":"Send to GoogleAI","server":"c37cf6c9.93b9b8","version":7,"debugenabled":false,"action":"google_generative_ai_conversation.generate_content","floorId":[],"areaId":[],"deviceId":[],"entityId":[],"labelId":[],"data":"{\t \"prompt\":\"Beschrijf heel kort wat je ziet gebeuren in deze beelden van mijn camera. Je bericht moet kort genoeg zijn om in een telefoonmelding te passen. Beschrijf geen stilstaande objecten of gebouwen.\",\t \"image_filename\": \"./www/img/snapshot_image.jpg\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"results"},{"property":"topic","propertyType":"msg","value":"","valueType":"results"}],"queue":"none","blockInputOverrides":false,"domain":"google_generative_ai_conversation","service":"generate_content","x":170,"y":240,"wires":[["cbff6395a1e68bb3","acd47e632f0c7ab4"]]},{"id":"cbff6395a1e68bb3","type":"mqtt out","z":"c584d4a2bceaa8a7","name":"","topic":"homey/ai/camera","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"ce2f1b0f2e5cc568","x":430,"y":320,"wires":[]},{"id":"b80822314aad9f4d","type":"api-call-service","z":"c584d4a2bceaa8a7","name":"","server":"cb8c98b9.ebd0f8","version":7,"debugenabled":false,"action":"input_text.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_text.camera_omschrijving"],"labelId":[],"data":"{\"value\":\"{{payload}}\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_text","service":"set_value","x":580,"y":240,"wires":[[]]},{"id":"acd47e632f0c7ab4","type":"function","z":"c584d4a2bceaa8a7","name":"function 7","func":"msg.payload = msg.payload.text.replace(/\\n/g, \" \").replace(/\"/g, '\\\\\"');\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":240,"wires":[["b80822314aad9f4d"]]},{"id":"ce2f1b0f2e5cc568","type":"mqtt-broker","name":"","broker":"core-mosquitto","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":"c37cf6c9.93b9b8","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"cb8c98b9.ebd0f8","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false}]
Methode 2: Snapshot vanuit een Home Assistant-camera
Stap 1: Maak een Snapshot vanuit Home Assistant
- Voeg een API-aanroep-node toe in Node-RED om een snapshot te maken:
- Service:
camera.snapshot
- Entiteit: Selecteer je camera-entiteit, bijvoorbeeld
camera.octoprint_rechts_camera
- Bestandspad:
/config/www/img/octoprint_snapshot.jpg
- Service:
Stap 2: Stuur de Snapshot naar Google AI
- Voeg een API-aanroep-node toe die de snapshot naar Google AI stuurt:
- Service:
google_generative_ai_conversation.generate_content
- Prompt:
"Beschrijf kort wat je ziet gebeuren in deze beelden van mijn camera. Geef een samenvatting die geschikt is voor een telefoonmelding."
- Afbeeldingsbestand:
./www/img/octoprint_snapshot.jpg
- Service:
Stap 3: Verwerk en Sla de Beschrijving op
- Gebruik dezelfde Function-node als in Methode 1 om de tekst te verwerken.
- Voeg een API-aanroep-node toe om de beschrijving op te slaan in een
input_text
-entiteit in Home Assistant:- Service:
input_text.set_value
- Entiteit:
input_text.octoprint_camera_omschrijving
- Waarde:
{{payload}}
- Service:
Hieronder kun je de node kopiëren en importeren in je node-red. Je zult nog wat aanpassingen moeten maken om het voor jou werkend te maken, maar deze aanpassingen staan in de uitleg hierboven.
[{"id":"797990ec803e4f55","type":"api-call-service","z":"c584d4a2bceaa8a7","name":"Maak Snapshot","server":"c37cf6c9.93b9b8","version":7,"debugenabled":false,"action":"camera.snapshot","floorId":[],"areaId":[],"deviceId":[],"entityId":["camera.octoprint_rechts_camera"],"labelId":[],"data":"{\"filename\":\"/config/www/img/octoprint_snapshot.jpg\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"camera","service":"snapshot","service_domain":"camera","x":160,"y":500,"wires":[["8ff0a28d6d37871a"]]},{"id":"8ff0a28d6d37871a","type":"api-call-service","z":"c584d4a2bceaa8a7","name":"Stuur naar GoogleAI","server":"c37cf6c9.93b9b8","version":7,"debugenabled":false,"action":"google_generative_ai_conversation.generate_content","floorId":[],"areaId":[],"deviceId":[],"entityId":[],"labelId":[],"data":"{\t \"prompt\":\"Beschrijf kort wat je ziet gebeuren in deze beelden van mijn camera. Geef een samenvatting die geschikt is voor een telefoonmelding.\",\t \"image_filename\": \"./www/img/octoprint_snapshot.jpg\"\t}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"results"}],"queue":"none","blockInputOverrides":false,"domain":"google_generative_ai_conversation","service":"generate_content","x":380,"y":500,"wires":[["71d1f1a655b7f66f"]]},{"id":"71d1f1a655b7f66f","type":"function","z":"c584d4a2bceaa8a7","name":"Verwerk Tekst","func":"msg.payload = msg.payload.text.replace(/\\n/g, \" \").replace(/\"/g, '\\\\\"');\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":500,"wires":[["6371334e398ec663"]]},{"id":"6371334e398ec663","type":"api-call-service","z":"c584d4a2bceaa8a7","name":"Sla Tekst Op in Entiteit","server":"c37cf6c9.93b9b8","version":7,"debugenabled":false,"action":"input_text.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_text.octoprint_camera_omschrijving"],"labelId":[],"data":"{\"value\":\"{{payload}}\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_text","service":"set_value","service_domain":"input_text","x":840,"y":500,"wires":[[]]},{"id":"e82cd1580d78850d","type":"inject","z":"c584d4a2bceaa8a7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":400,"wires":[["797990ec803e4f55"]]},{"id":"c37cf6c9.93b9b8","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]
Sommige links op deze pagina zijn affiliatelinks. Dit betekent dat ik een kleine commissie verdien wanneer je via deze links een aankoop doet, zonder dat het jou extra kost. Dit helpt mij om deze website draaiende te houden en nuttige content te blijven aanbieden.
Amazon Affiliate Disclaimer
Als Amazon Affiliate verdien ik aan kwalificerende aankopen. Voor meer informatie, bekijk de volledige Affiliate Disclaimer.