Just awesome, nothing else to say.
Just start using it!
Tag Archives: nodered
433mhz sensors and Home Assistant
I’ve got a lot of wifi sensors in my home automation.
But also the ones i’ve started with.
The 433mhz temperature,pir and doorsensors.
These are all connected to Domoticz via a rfxcom gateway.
I’ve previously posted about previous setups.
https://www.henriaanstoot.nl/2022/11/03/home-assistant-and-433-dimmers/
https://www.henriaanstoot.nl/2022/11/17/domoticz-nodered-homeassistant-mqtt/
The setup i’ve ended up with is this:
Under hardware in domoticz install the mqtt broker.
Configure your mqtt server (mine is mosquitto)
Add devices to floorplans to send these to Mosquitto
Now i can see the topics in MQTTExplorer
Install the home assistant websocket palette in NodeRed
Configure the nodes like above
These are some example flows (I’ll put the function code below)
Above are the NAMED entities in Home Assistant
CODE
//Code for NR temperature filtering on domoticz IDX //A door censor uses nvalue instead of svalue1 //Humidity can be svalue2 //Check the Mqtt payload in MQTTExplorer which to use! var varidx = msg.payload.idx; var varnvalue = msg.payload.svalue1; if(varidx == 3108) { msg.payload = {}; msg.payload = varnvalue; return msg; }
Example of the trigger node.
When a temperature sensor battery dies, and no new data arrives- in 1 hour, I get a pushover warning. (use pushbullet/email/TV notification whatever you want)
Shelly Dimmer and NodeRed an update ..
Our bedroom has a shelly dimmer, this one is connected with a wall switch and is being controlled by Domoticz, Home Assistant and NodeRed.
I had to fix some stuff, so this was a perfect time to jot down some notes.
I’ve wired it up like this:
(I’ve got a Line wire in my ceiling socket, so i placed the module there instead of the wall socket)
Configure the Shelly as mentioned in the manual. After that do the following:
Advance > Developer settings :
(Enable CoIot if you want a easy auto detect for Home Assistant)
Enable MQTT (This will DISABLE cloud ! )
Server: the ip number of your Mqtt Broker
Next I did was:
Now the wall switch will change/toggle what the current state is.
(If the light is off, and you switch it on using Mqtt, you probably needed to hit the switch two times to turn it off again. Not so with this setting.)
My Nodered Flow ( Not using the Shelly palette nodes in this example)
The Mqtt IN node sets the state of the switch when you use the wall switch!
Cozy turns light on at a specific level.
The slider send an off command when 0% selected, else an on command and the sliders value.
# Cozy function msg.payload = {}; msg.payload.turn="on"; msg.payload.brightness=30; return msg; # Slider function var varlevel = msg.payload; msg.payload = {}; if(varlevel == 0){ msg.payload.turn="off"; } else { msg.payload.turn="on"; } msg.payload.brightness=varlevel; return msg;
DashBoard
The Flow
[ { "id": "32d1c58277d38408", "type": "ui_switch", "z": "746c372deb597681", "name": "", "label": "Bedroom lights2", "tooltip": "", "group": "c387df0cfc06c60e", "order": 3, "width": 0, "height": 0, "passthru": false, "decouple": "true", "topic": "", "topicType": "str", "style": "", "onvalue": "on", "onvalueType": "str", "onicon": "", "oncolor": "", "offvalue": "off", "offvalueType": "str", "officon": "", "offcolor": "", "animate": true, "className": "", "x": 220, "y": 940, "wires": [ [ "df432d3faea35f38" ] ] }, { "id": "fb12eddd50d3013e", "type": "ui_slider", "z": "746c372deb597681", "name": "", "label": "Bedroom Lights2", "tooltip": "", "group": "c387df0cfc06c60e", "order": 4, "width": 0, "height": 0, "passthru": true, "outs": "end", "topic": "", "topicType": "str", "min": 0, "max": "100", "step": 1, "className": "", "x": 230, "y": 900, "wires": [ [ "d9c299ec7c0c82b0" ] ] }, { "id": "d9c299ec7c0c82b0", "type": "function", "z": "746c372deb597681", "name": "Get level", "func": "var varlevel = msg.payload;\nmsg.payload = {};\n\nif(varlevel == 0){ \nmsg.payload.turn=\"off\";\n} else\n{\n msg.payload.turn=\"on\";\n}\n\nmsg.payload.brightness=varlevel;\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 460, "y": 900, "wires": [ [ "315ffbe441467c10" ] ] }, { "id": "df432d3faea35f38", "type": "mqtt out", "z": "746c372deb597681", "name": "", "topic": "shellies/shellydimmer-CFE204/light/0/command", "qos": "", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "8c74c5f6.9a7a48", "x": 800, "y": 940, "wires": [] }, { "id": "315ffbe441467c10", "type": "mqtt out", "z": "746c372deb597681", "name": "", "topic": "shellies/shellydimmer-CFE204/light/0/set", "qos": "", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "8c74c5f6.9a7a48", "x": 780, "y": 900, "wires": [] }, { "id": "15f1c904607a0adc", "type": "function", "z": "746c372deb597681", "name": "Cozy", "func": "msg.payload = {};\n\nmsg.payload.turn=\"on\";\n\nmsg.payload.brightness=30;\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 450, "y": 860, "wires": [ [ "315ffbe441467c10" ] ] }, { "id": "57fb1210d37e5325", "type": "ui_button", "z": "746c372deb597681", "name": "", "group": "c387df0cfc06c60e", "order": 5, "width": 0, "height": 0, "passthru": false, "label": "Bedroom lights2 Cozy", "tooltip": "", "color": "", "bgcolor": "", "className": "", "icon": "", "payload": "", "payloadType": "str", "topic": "topic", "topicType": "msg", "x": 240, "y": 860, "wires": [ [ "15f1c904607a0adc" ] ] }, { "id": "30cba96b08f3b830", "type": "mqtt in", "z": "746c372deb597681", "name": "", "topic": "shellies/shellydimmer-CFE204/light/0", "qos": "2", "datatype": "auto-detect", "broker": "8c74c5f6.9a7a48", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 240, "y": 1000, "wires": [ [ "32d1c58277d38408" ] ] }, { "id": "c387df0cfc06c60e", "type": "ui_group", "name": "Bedroom", "tab": "f177532a78f3f1d2", "order": 3, "disp": true, "width": "6", "collapse": true, "className": "" }, { "id": "8c74c5f6.9a7a48", "type": "mqtt-broker", "name": "IPBROKER", "broker": "IPBROKER", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "15", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" }, { "id": "f177532a78f3f1d2", "type": "ui_tab", "name": "House", "icon": "dashboard", "order": 1, "disabled": false, "hidden": false } ]
RFID music playlist genre selector.
Just a proof of concept for a friend.
This one works with Logitech Media Server and Spotify playlists, but also works with generic LMS playlists when you change the url)
Selecting music using the RFID reader module in my game.
(i didnĀ“t have a spare reader)
Cardboard box with rfid tags inside.
Maybe a tetrahedron for play,next,previous and stop?
And another with volume settings?
Simple node-red switcher
URL being called:
http://logictechmediaserver:9000/plugins/spotty/index.html?action=play&index=8.12
Wifi monitoring with Mikrotik Mqtt Nodered and Pushover
I’ve made a arpscanner in the past
https://www.henriaanstoot.nl/2019/10/15/arpscanner/
But i’m going to migrate the server this is running on.
So I played with ssh commands using ssh connections with a ssh-key, also using Ansible is possible.
ssh user@mikrotik /interface wireless registration-table print
But I didn’t like the continuous logins with automated logins.
So below solution is what i’ve implemented for now.
I’ve installed the IOT extra package from Mikrotik, now I can send MQTT messages from my Wifi enabled Mikrotiks to my Mosquitto broker.
(Download extra package zip, extract iot-7.x-arm.npk, upload this to your mikrotik files folder, and reboot)
The script I’m running on my Mikrotik, sends the active wifi connections with the comments. ( When a comment is set in the Access List, then it’s a know connection )
[admin@RB40111] /iot/mqtt> export # may/15/2023 21:45:12 by RouterOS 7.9 # software id = xxxx-xxxx # # model = RB4011iGS+5HacQ2HnD # serial number = xxxxxxxxxxxxxxxxx /iot mqtt brokers add address=10.1.x.y client-id=rb4011 name=NR
I made the following script on my MT named mqtt
:local broker "NR" # MQTT topic where the message should be published :local topic "rb4011/mac" :foreach i in=[/interface wireless registration-table print proplist=mac-address as-value] do={ :local message "$i" /iot mqtt publish broker=$broker topic=$topic message=$message }
A schedule is needed to run this script every 15 minutes
[admin@RB40111] /system/scheduler> export # may/15/2023 21:48:14 by RouterOS 7.9 # software id = xxxx-xxx # # model = RB4011iGS+5HacQ2HnD # serial number = xxxxxxxxxxx /system scheduler add interval=15m name=mqtt on-event=mqtt policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-date=may/15/2023 start-time=13:30:54
Now all wifi connections will be send to topic rb4011/mac.
# Example .id=*6a;comment=Mobile Henri wlan2;mac-address=44:46:87:xx:xx:xx
Using NodeRed I can make filters and notifications
Below function: get Mac and Comment from payload, if the comment is empty then it is a unknown connection … so send me a warning using Pushover.
// filter function var output = msg.payload.split(";"); var comment = (output[1].split("=")); var mac = (output[2].split("=")); msg.payload={}; msg.payload = mac[1]; if (comment[1] == "") { return msg; } // is xx:xx:xx:xx:xx:xx online? example var output = msg.payload.split(";"); var comment = (output[1].split("=")); var mac = (output[2].split("=")); msg.payload={}; msg.payload = mac[1]; if (mac[1] == "xx:xx:xx:xx:xx:xx") { return msg; }
Now i’m getting a notification when an unknown wifi connection is made on my Access Point.
( I going to implement the Access List from MT at a later point. No access when not in the Access List)
Guess the code in Node Red
I asked ChatGPT to write code for me, i was not completely correct, and in Python. https://www.henriaanstoot.nl/2023/03/28/i-asked-chatgpt-to-write-code-for-a-crack-the-code-game/
I wrote my on version in JavaScript so it can be used in NodeRed as a function.
The codes are entered using a keypad (Arduino) and send via MQTT
Node Red Dash board
Code
var code = global.get("mysetcode"); var good = 0; var wrong = 0; var wrongplace = 0; var match = false; var wrongchars = 0; var wrongplaced = 0; var goodchars = 0; var payloadcode = msg.payload.toString(); var usr_input = Array.from(payloadcode); var secret_code = Array.from(code); var secret_code1 = secret_code; if (msg.payload === code) { match = true; } var result = ""; for (var i = 0; i < 4; i++) { var found = false; if (usr_input[i] === secret_code[i]) { usr_input[i] = "a"; secret_code[i] = "b"; good = good + 1; } } for (var i = 0; i < 4; i++) { var found = false; for (var j = 0; j < 4; j++) { if (usr_input[i] === secret_code[j]) { found = true; } } if (!found) { wrong = wrong + 1; } } wrongchars = wrong - good; wrongplaced = 4 - good - wrongchars; msg.goodchars = good; msg.wrongchars = wrongchars; msg.wrongplace = wrongplaced; msg.result = result; msg.match = match; return msg;
Shelly alarm button
For a while i’ve been using the wireless shelly button for all kinds of notifications.
Most of the time i like to use it as a kind of alarm/need-help-now button.
The f*ckin’ awesome button i’m talking about (pictured above) is a small (45x45mm 16mm height) button, which can connect to your wifi and send MQTT messages.
It even has a strap thingy to attach it to your keychain,
Four types of messages:
- short press
- 2x short presses
- 3x short presses
- and long press
When using pushover, you can push alarm and messages to your android (even overriding mute/silent if you configure it that way!)
Configuring the button:
https://www.shelly.cloud/documents/user_guide/shelly_button_1.pdf
Configuring pushover:
https://www.npmjs.com/package/node-red-node-pushover
My node red config:
Switch node
[ { "id": "abb6a4fea5021683", "type": "mqtt in", "z": "458ff8a6.218fa8", "name": "", "topic": "shellies/shellybutton1-11CDAC2C21D3/input_event/0", "qos": "2", "datatype": "auto", "broker": "8c74c5f6.9a7a48", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 320, "y": 760, "wires": [ [ "bebce75c2be0b54d" ] ] }, { "id": "8eac36b9c194977b", "type": "comment", "z": "458ff8a6.218fa8", "name": "Shelly Button", "info": "", "x": 200, "y": 720, "wires": [] }, { "id": "699c63fede80052b", "type": "debug", "z": "458ff8a6.218fa8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 890, "y": 700, "wires": [] }, { "id": "604ae0babdcf3929", "type": "switch", "z": "458ff8a6.218fa8", "name": "", "property": "payload.event", "propertyType": "msg", "rules": [ { "t": "eq", "v": "S", "vt": "str" }, { "t": "eq", "v": "SS", "vt": "str" }, { "t": "eq", "v": "SSS", "vt": "str" }, { "t": "eq", "v": "L", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 4, "x": 690, "y": 700, "wires": [ [ "699c63fede80052b", "5f289f050b9eea26" ], [ "e895ce98af0a9c35" ], [ "50c9c06fc3dbdcdd" ], [ "06efa30e61695599" ] ] }, { "id": "e895ce98af0a9c35", "type": "debug", "z": "458ff8a6.218fa8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 890, "y": 760, "wires": [] }, { "id": "50c9c06fc3dbdcdd", "type": "debug", "z": "458ff8a6.218fa8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 890, "y": 820, "wires": [] }, { "id": "06efa30e61695599", "type": "debug", "z": "458ff8a6.218fa8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 890, "y": 880, "wires": [] }, { "id": "bebce75c2be0b54d", "type": "json", "z": "458ff8a6.218fa8", "name": "", "property": "payload", "action": "", "pretty": false, "x": 600, "y": 780, "wires": [ [ "604ae0babdcf3929", "699c63fede80052b" ] ] }, { "id": "5f289f050b9eea26", "type": "pushover", "z": "458ff8a6.218fa8", "name": "", "device": "", "title": "Alarm", "priority": "2", "sound": "persistent", "url": "", "url_title": "", "html": false, "x": 1150, "y": 640, "wires": [] }, { "id": "8c74c5f6.9a7a48", "type": "mqtt-broker", "name": "MQTTBROKER", "broker": "MQTTBROKER", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "15", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" } ]
Domoticz + NodeRed + HomeAssistant MQTT
UPDATE 20240122 : below
I’ve got my RFXCOM connected to my Domoticz, and not connected to my HA.
To have the changes of my IOT devices being known to HomeAssistant I wanted to use mqtt.
Domoticz writes the mqtt topic (payload) like this
(topic: domoticz/out)
{ "Battery" : 100, "LastUpdate" : "2022-11-17 18:21:59", "RSSI" : 6, "description" : "", "dtype" : "Temp + Humidity", "hwid" : "4", "id" : "230E", "idx" : 8461, "name" : "Living Temp/Hum", "nvalue" : 0, "stype" : "Cresta, TFA TS34C", "svalue1" : "20.0", "svalue2" : "60", "svalue3" : "1", "unit" : 1 }
So you can’t see which device it is by the topic name, the idx is in the json (8461)
To get this device ( a temperature sensor) into HA using mqtt i rewrote the mqtt topic using NodeRed
NodeRed flow
[ { "id": "836cc419ddb2ca2b", "type": "mqtt in", "z": "cfb00976f06591d6", "name": "", "topic": "domoticz/out/#", "qos": "2", "datatype": "auto-detect", "broker": "8c74c5f6.9a7a48", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 200, "y": 140, "wires": [ [ "dbe628e18027a287" ] ] }, { "id": "a6cb517fd1cc9987", "type": "mqtt out", "z": "cfb00976f06591d6", "name": "", "topic": "", "qos": "", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "8c74c5f6.9a7a48", "x": 870, "y": 140, "wires": [] }, { "id": "dbe628e18027a287", "type": "function", "z": "cfb00976f06591d6", "name": "MQTT REWRITE", "func": "var varidx = msg.payload.idx;\nmsg.topic = \"home/\"+varidx+\"/payload\";\nreturn msg;\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 570, "y": 140, "wires": [ [ "a6cb517fd1cc9987" ] ] }, { "id": "8c74c5f6.9a7a48", "type": "mqtt-broker", "name": "MQTTSERVERIP", "broker": "MQTTSERVERIP", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "15", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" } ]
The function node code ( rewrites the mqtt topic)
var varidx = msg.payload.idx; msg.topic = "home/"+varidx+"/payload"; return msg;
Now we have a idx separated payload “home/IDX/payload”
(The other entries svalue/nvalue are from testing.
Adding the MQTT entries to HomeAssistant configuration.conf
mqtt: sensor: - name: "LivingTemperature" state_topic: "home/8461/payload" unit_of_measurement: "Ā°C" value_template: "{{ value_json.svalue1 }}" - name: "LivingHumidity" state_topic: "home/8461/payload" unit_of_measurement: "%" value_template: "{{ value_json.svalue2 }}"
Now i can add the card to the dashboard.
This should now be a generic mqtt translator
A quick update:
Adding a motion sensor:
Home Assistant - name: "LivingMotion" state_topic: "home/45/payload" value_template: "{{ value_json.nvalue }}"
Add sensors to be reset to the switch node
[ { "id": "836cc419ddb2ca2b", "type": "mqtt in", "z": "cfb00976f06591d6", "name": "", "topic": "domoticz/out/#", "qos": "2", "datatype": "auto-detect", "broker": "8c74c5f6.9a7a48", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 200, "y": 140, "wires": [ [ "dbe628e18027a287", "768bb6e4b6731436" ] ] }, { "id": "a6cb517fd1cc9987", "type": "mqtt out", "z": "cfb00976f06591d6", "name": "", "topic": "", "qos": "", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "8c74c5f6.9a7a48", "x": 870, "y": 140, "wires": [] }, { "id": "dbe628e18027a287", "type": "function", "z": "cfb00976f06591d6", "name": "MQTT REWRITE", "func": "var varidx = msg.payload.idx;\nmsg.topic = \"home/\"+varidx+\"/payload\";\nreturn msg;\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 570, "y": 140, "wires": [ [ "a6cb517fd1cc9987" ] ] }, { "id": "768bb6e4b6731436", "type": "switch", "z": "cfb00976f06591d6", "name": "", "property": "payload.idx", "propertyType": "msg", "rules": [ { "t": "eq", "v": "45", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 1, "x": 330, "y": 260, "wires": [ [ "e46fed76a596a719" ] ] }, { "id": "e46fed76a596a719", "type": "delay", "z": "cfb00976f06591d6", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 500, "y": 260, "wires": [ [ "3f7eeffc8d066de3" ] ] }, { "id": "3f7eeffc8d066de3", "type": "function", "z": "cfb00976f06591d6", "name": "nvalue 0", "func": "msg.payload.nvalue = 0;\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 700, "y": 260, "wires": [ [ "dbe628e18027a287" ] ] }, { "id": "8c74c5f6.9a7a48", "type": "mqtt-broker", "name": "MQTTIP", "broker": "MQTTIP", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "15", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" } ]
UPDATE 20240122
I’m using domoticz as a 433->mqtt bridge, and some virtual devices i can toggle with curl (bash scripts)
I needed to make a custom 433 door sensor in Home Assistant with toggles to OFF after a few seconds. (There is NO off signal in this cheap sensor i’m using)
I’m changing the payload complete, to have a payload which matches the device class for door: (state with on/off)
It was nvalue = 0/1
(Whenever the IDX changes, I only have to update this Nodered part)
HA won’t notice the change.
var nvalue = msg.payload.nvalue; msg.payload = {}; if(nvalue == 1) { msg.payload.state = "ON"; return msg; } AND after 5 seconds msg.payload = {}; msg.payload.state = "OFF"; return msg;
Node-RED Deploy Export nodes Export [ { "id": "d8a1af40d14307a9", "type": "mqtt in", "z": "a8ec6104.cb08c", "name": "", "topic": "home/35/payload", "qos": "2", "datatype": "auto-detect", "broker": "8c74c5f6.9a7a48", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 220, "y": 720, "wires": [ [ "ac3f66d770bb8f56" ] ] }, { "id": "31cb1ca9e4060710", "type": "delay", "z": "a8ec6104.cb08c", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "allowrate": false, "outputs": 1, "x": 660, "y": 760, "wires": [ [ "dbf50e2146f5e631" ] ] }, { "id": "96d60ca0976c555c", "type": "mqtt out", "z": "a8ec6104.cb08c", "name": "", "topic": "home/frontdoor/payload", "qos": "", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "8c74c5f6.9a7a48", "x": 1010, "y": 720, "wires": [] }, { "id": "ac3f66d770bb8f56", "type": "function", "z": "a8ec6104.cb08c", "name": "If open", "func": "var nvalue = msg.payload.nvalue;\nmsg.payload = {};\nif(nvalue == 1)\n{\nmsg.payload.state = \"ON\";\nreturn msg;\n} \n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 490, "y": 720, "wires": [ [ "31cb1ca9e4060710", "96d60ca0976c555c" ] ] }, { "id": "dbf50e2146f5e631", "type": "function", "z": "a8ec6104.cb08c", "name": "Send Close", "func": "msg.payload = {};\nmsg.payload.state = \"OFF\";\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 810, "y": 760, "wires": [ [ "96d60ca0976c555c" ] ] }, { "id": "8c74c5f6.9a7a48", "type": "mqtt-broker", "name": "MQTTSERVER", "broker": "MQTTSERVER", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "15", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" } ]
HA Part : Instead of the generic setup above (Old post part)
mqtt: binary_sensor: - name: "FrontDoor" state_topic: "home/frontdoor/payload" value_template: "{{ value_json.state }}" device_class: door
Home Assistant/NodeRed update
Upgraded the 2nd (Main) nodered machine to 3.0
Now the node-red-contrib-home-assistant-websocket nodes work again.
Also updated HA, and added some iframes using below.
The HA update broke my mqtt lighting due to changes in the code.
Below also in the example some iframe entries.
( When adding grafana, you need to change grafana.ini
allow_embedding = true
mqtt: broker: mqttbrokerserver <--- still errors on this part, discovery: true <--- but where to configure? light: <--- Moved this under mqtt - name: "KitchenOutside" <--- added a dash payload_on: "99" payload_off: "0" unique_id: "KitchenOutside" brightness_scale: "99" brightness_state_topic: ha433/kitchenoutside/brightcontrol brightness_command_topic: ha433/kitchenoutside/brightcontrol state_topic: ha433/kitchenoutside/brightcontrol command_topic: ha433/kitchenoutside/control optimistic: false on_command_type: brightness panel_iframe: <--- iframes added nodered: title: "NodeRed" url: "http://noderedserver:1880/" icon: si:nodered require_admin: true domoticz: title: "Domoticz" url: "http://domoticzserver:8080/" icon: si:homeadvisor require_admin: true influxdb: host: influxserver port: 8086 database: homeassistant max_retries: 3 default_measurement: state <--- changed this
HomeAssistant add long-lived access token:
- Click you profile icon bottom right
- Scroll all the way down and press create token
Node-red
Add a HA node to a flow, double click and add a server with the little pencil
Base URL is important, you can’t just add http://internalip:port
Use a the URL configured in HA (config/network)
Mqtt Bash Nodered Notify
When running scripts which take a long time, i don’t want to wait for things to finish before i can start the next one.
For example, using my dedup script or compiling stuff. I wanna know when it is finished.
So i made some scripts
I’ve put a function in .bashrc, so i can use a command like
notify “Compiling is ready”
A command like this i can put at the end of a command or in a script file at the end.
make && make install && notify “compile ready”
What does it do when executed?
- Send a mqtt message to the broker
- Node-red will read this message and:
- Send a message to my display on my desk – Sound and message notification. (See another post how i made this )
- Send a message to a script on my Domoticz instance downstairs.
- This will use a script to get a speech file from google, and play this on some small speakers in my livingroom
- Send a pushover message to my phone
- Display a message on my TV ( not in code below )
How?
At the end of your .bashrc
function notify() {
if [ -z "$1" ]; then
echo "Usage: $0 \"message\"";
exit 1;
fi
mosquitto_pub -h 10.1.0.17 -t notify/bashscript -m "$1"
}
Scripts on my Domoticz instance
Python script
#!/usr/bin/python
import paho.mqtt.client as mqttClient
import time
import os
import subprocess
import shlex
Connected = False
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to broker")
global Connected
Connected =True
else:
print("Connection failed")
def on_message(client, userdata, message):
print "Message received: " + message.topic + " : " + message.payload
fileName = "/home/pi/domoticz/scripts/speech" + " \"" + message.payload + "\""
print fileName
args = shlex.split(fileName)
time.sleep(1)
p = subprocess.Popen(args)
broker_address = "10.1.0.17"
port = 1883
#user = "user"
#password = "password"
client = mqttClient.Client("speechcmd")
#client.username_pw_set(user, password=password)
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker_address, port=port)
client.loop_start()
while Connected != True:
time.sleep(0.1)
client.subscribe('speech/cmd')
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print "exiting"
client.disconnect()
client.loop_stop()
Caching speech script
This script will look for a cached audiofile with requested text, and uses that. Else it wil request a audio file from google, caches it and plays it though the speakers.
#!/bin/bash
INPUT=$*
input2=$(echo $INPUT | base64)
echo "$input2 = $INPUT" >> /home/pi/cache/files-text-relation
if [ -f /home/pi/cache/$input2.mp3 ] ; then
mpg123 -q /home/pi/cache/$input2.mp3 1>/dev/null 2>/dev/null
else
echo not cached
STRINGNUM=0
ary=($INPUT)
for key in "${!ary[@]}"
do
SHORTTMP[$STRINGNUM]="${SHORTTMP[$STRINGNUM]} ${ary[$key]}"
LENGTH=$(echo ${#SHORTTMP[$STRINGNUM]})
#echo "word:$key, ${ary[$key]}"
#echo "adding to: $STRINGNUM"
if [[ "$LENGTH" -lt "100" ]]; then
#echo starting new line
SHORT[$STRINGNUM]=${SHORTTMP[$STRINGNUM]}
else
STRINGNUM=$(($STRINGNUM+1))
SHORTTMP[$STRINGNUM]="${ary[$key]}"
SHORT[$STRINGNUM]="${ary[$key]}"
fi
done
for key in "${!SHORT[@]}"
do
echo "Playing line: $(($key+1)) of $(($STRINGNUM+1))"
NEXTURL=$(echo ${SHORT[$key]} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g')
echo $NEXTURL
mpg123 -w $input2 -q "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$NEXTURL&tl=En-us"
ffmpeg -i $input2 -codec:a libmp3lame -qscale:a 2 /home/pi/cache/$input2.mp3
mpg123 /home/pi/cache/$input2.mp3
done
fi
Node-red flow
function notify() {
if [ -z "$1" ]; then
echo "Usage: $0 \"message\"";
exit 1;
fi
mosquitto_pub -h 10.1.0.17 -t notify/bashscript -m [
{
"id": "1442fca698589679",
"type": "mqtt in",
"z": "cb6f001b.721c3",
"name": "",
"topic": "notify/bashscript",
"qos": "2",
"datatype": "auto",
"broker": "8c74c5f6.9a7a48",
"nl": false,
"rap": false,
"inputs": 0,
"x": 180,
"y": 580,
"wires": [
[
"ddf5744bb5b73d4d",
"faa5c794652d7a57",
"b4e0107399248fea",
"443f960b5d1cf40e"
]
]
},
{
"id": "ddf5744bb5b73d4d",
"type": "mqtt out",
"z": "cb6f001b.721c3",
"name": "",
"topic": "speech/cmd",
"qos": "",
"retain": "",
"broker": "8c74c5f6.9a7a48",
"x": 590,
"y": 560,
"wires": []
},
{
"id": "e95e828451d83158",
"type": "comment",
"z": "cb6f001b.721c3",
"name": "bash notify",
"info": "",
"x": 170,
"y": 540,
"wires": []
},
{
"id": "faa5c794652d7a57",
"type": "mqtt out",
"z": "cb6f001b.721c3",
"name": "",
"topic": "mqttlcd/message",
"qos": "",
"retain": "",
"broker": "8c74c5f6.9a7a48",
"x": 570,
"y": 720,
"wires": []
},
{
"id": "b4e0107399248fea",
"type": "delay",
"z": "cb6f001b.721c3",
"name": "",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"outputs": 1,
"x": 480,
"y": 640,
"wires": [
[
"ac4faf30b8adbe3f"
]
]
},
{
"id": "ac4faf30b8adbe3f",
"type": "function",
"z": "cb6f001b.721c3",
"name": "Empty payload",
"func": "msg.payload = \"\";\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 640,
"y": 640,
"wires": [
[
"faa5c794652d7a57"
]
]
},
{
"id": "dfbe26c12fc5e742",
"type": "pushover",
"z": "cb6f001b.721c3",
"name": "Alleen Henri",
"device": "rmx1931",
"title": "Node-Red-Pushover",
"priority": "1",
"sound": "pushover",
"url": "",
"url_title": "",
"html": false,
"x": 850,
"y": 500,
"wires": []
},
{
"id": "443f960b5d1cf40e",
"type": "function",
"z": "cb6f001b.721c3",
"name": "Set pushover payload",
"func": "\nmsg.topic = \"Bash Notify\";\nmsg.priority = 1;\nmsg.sound = \"cosmic\";\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 660,
"y": 500,
"wires": [
[
"dfbe26c12fc5e742"
]
]
},
{
"id": "8c74c5f6.9a7a48",
"type": "mqtt-broker",
"name": "10.1.0.17",
"broker": "10.1.0.17",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": true,
"keepalive": "15",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
}
]