Are folks here happy with Domoticz?
-
@wergeld, You can't blame domoticz for loosing power, that's a risk with all SD-card based systems. After a similar experience I run domoticz now on a intel NUC for about 4 years without any major issues, and I'm on Beta
@Sweetpants Oh, I am not. Just saying that the issues I am having with logging do not have to do with Domoticz.
-
@gohan said in Are folks here happy with Domoticz?:
You could use node-red to log data to an external db and do whatever you want after that: it should be easier than replace the entire controller
In that scenario, would Node Red be getting the sensor message first and then just somehow quickly piping it to Domoticz and a copy to the external database (e.g. MySQL)?
-
Just to clarify I think Domoticz is very versatile and flexible when it comes to hardware but when it comes to GUI and how to visually show everything it's very nice but not configurable.
@sundberg84 i dont know about you, but i use imperihome as a front end over the top of domoticz with mydomoathome.....that way you get the strong base of domoticz, but i more user friendly and customisable front end
-
I am trying to get away from Domoticz because of the 5 minute log interval that is built in to it.
I have changed it to 1 minute but it is still useless for my boiler sensor.
Sometimes the Boiler is only on 30-45 secs and the temperatures on the flow and return are completely missed.
There has to be something better.
I have been trying myHouse lately but the updates for fixes and enhancements have slowed down as the developer is busy with other things.
So back to the drawing board.@rmtucker I move the data directly from Domoticz into influxDB. This is as accurate as you will get it ;-) Data for example of my smartmeter every 10 seconds. If the device is updated in Domoticz (energy sensor for example) this will add data to influxDB and you will get the bet graphs. Accurate for me.
-
Hello guys,
I am a beginner with Domoticz. I would like to ask you a question. Can i find a way to recover the data from a sensor like temperature or smartmeter to be installed in local?
I am working with Rasperbery +domoticz + Smartplug Fibaro.
Firstly, i install domoticz in raspberry and i configure the plug fibaro to communicate with a usb Zwave. And it works. i can see the graph but I do not succed to retrieve the data locally into the raspberry.
Someone has a solution to propose me?
Thanks guys -
Hello guys,
I am a beginner with Domoticz. I would like to ask you a question. Can i find a way to recover the data from a sensor like temperature or smartmeter to be installed in local?
I am working with Rasperbery +domoticz + Smartplug Fibaro.
Firstly, i install domoticz in raspberry and i configure the plug fibaro to communicate with a usb Zwave. And it works. i can see the graph but I do not succed to retrieve the data locally into the raspberry.
Someone has a solution to propose me?
Thanks guys -
@gohan yeah!! Possible.My goal is to use machine learning with the data i collect.
So if you give me link where the explain how it's working influxdb it Will be good
Thnnk@gohan for your reply -
@gohan said in Are folks here happy with Domoticz?:
You could use node-red to log data to an external db and do whatever you want after that: it should be easier than replace the entire controller
In that scenario, would Node Red be getting the sensor message first and then just somehow quickly piping it to Domoticz and a copy to the external database (e.g. MySQL)?
I use node-red with domoticz, MySensor data hits node-red first (serial gateway) which then pipes the data to domoticz via a fake serial port. That way I can manipulate data that I send to domoticz, and can inject fake mysensor sensors into domoticz as well..
Node-red also dumps all data to influxdb for data storage, and then I use grafana for graphing purposes. Besides that I have created my own dashboard for tablets.
Currently I mostly use domoticz as scripting engine (lua), for some basic events. For example turning on TV if someone starts streaming to my chromecast, and automatically turn it off again if chromecast have been in idle state for 2 minutes (the same for my chromecast audio, that just turn on amplifier instead of TV).
-
I use node-red with domoticz, MySensor data hits node-red first (serial gateway) which then pipes the data to domoticz via a fake serial port. That way I can manipulate data that I send to domoticz, and can inject fake mysensor sensors into domoticz as well..
Node-red also dumps all data to influxdb for data storage, and then I use grafana for graphing purposes. Besides that I have created my own dashboard for tablets.
Currently I mostly use domoticz as scripting engine (lua), for some basic events. For example turning on TV if someone starts streaming to my chromecast, and automatically turn it off again if chromecast have been in idle state for 2 minutes (the same for my chromecast audio, that just turn on amplifier instead of TV).
-
I use node-red with domoticz, MySensor data hits node-red first (serial gateway) which then pipes the data to domoticz via a fake serial port. That way I can manipulate data that I send to domoticz, and can inject fake mysensor sensors into domoticz as well..
Node-red also dumps all data to influxdb for data storage, and then I use grafana for graphing purposes. Besides that I have created my own dashboard for tablets.
Currently I mostly use domoticz as scripting engine (lua), for some basic events. For example turning on TV if someone starts streaming to my chromecast, and automatically turn it off again if chromecast have been in idle state for 2 minutes (the same for my chromecast audio, that just turn on amplifier instead of TV).
-
the module is available through NPM as well.. So npm install node-red-contrib-mysensors :)
The basic node-red mysensors is pasted below, my setup is starting to be quite extensive, with reporting to slack channels, creating a websocket for my custom dashboard etc. But isn't necessary for the basic domoticz/nodered
For connecting node-red/domoticz together I use socat to create a virtual serial port:
socat PTY,link=/dev/ttyS81,mode=666,group=dialout,raw PTY,link=/dev/ttyUSB21,mode=666,group=dialout,raw &node-red:
[ { "id": "9b272654.9ad688", "type": "subflow", "name": "Influx processing", "info": "", "in": [ { "x": 220, "y": 280, "wires": [ { "id": "5cfd0e8.fa302f" } ] } ], "out": [ { "x": 960, "y": 240, "wires": [ { "id": "55204322.aadfbc", "port": 0 } ] }, { "x": 960, "y": 380, "wires": [ { "id": "d6b8cf3e.6954c", "port": 0 } ] } ] }, { "id": "55204322.aadfbc", "type": "function", "z": "9b272654.9ad688", "name": "Influx conditioner", "func": "msg_env = null;\nmsg_utility = null;\nmsg_debug = null;\nst = msg.subType;\nif (msg.messageType == 1 && (st === 0 || st == 1 || st == 4 || st == 17)) {\n var tags = {};var data = {}\n tags.node = msg.nodeId.toString();\n tags.sensor = msg.childSensorId.toString();\n data.value=parseFloat(msg.payload);\n switch (st) {\n case 0 : type = \"temperature\";break;\n case 1 : type = \"humidity\"; break;\n case 4 : type = \"barometer\"; break;\n case 17: type = \"electricity\"; break;\n }\n msg.payload = [data, tags];\n msg.measurement = type;\n msg_debug = msg;\n if (msg.subType==17) \n msg_utility = msg;\n else \n msg_env = msg;\n} \nelse \n msg = null;\nreturn [msg_debug, msg_env, msg_utility];", "outputs": "3", "noerr": 0, "x": 790, "y": 280, "wires": [ [], [ "c042117a.3fbdf" ], [ "f6bdc7dc.77c758" ] ] }, { "id": "5cfd0e8.fa302f", "type": "mysdecenc", "z": "9b272654.9ad688", "name": "", "x": 350, "y": 280, "wires": [ [ "55204322.aadfbc", "d6b8cf3e.6954c" ] ] }, { "id": "c042117a.3fbdf", "type": "influxdb out", "z": "9b272654.9ad688", "influxdb": "9dbdc7c7.624238", "name": "", "measurement": "", "x": 1020, "y": 280, "wires": [] }, { "id": "f6bdc7dc.77c758", "type": "influxdb out", "z": "9b272654.9ad688", "influxdb": "9de2e4ed.fdcfc8", "name": "Utility", "measurement": "", "x": 990, "y": 320, "wires": [] }, { "id": "d6b8cf3e.6954c", "type": "function", "z": "9b272654.9ad688", "name": "Watt/Hour calculator", "func": "/* Takes input on subType 24, calculates difference\n from last time, if around 60 seconds have passed\n since last report.\n It passes the value on as subType 17, and\n childSensorId 2 */\n\nif ((msg.subType===24) && (msg.nodeId===99)) {\n var uTime = Math.floor(Date.now()/60000);\n var lastTime = context.get('lastTime')||0;\n if (lastTime === 0) {\n context.set('lastTime', uTime);\n context.set('lastCount', msg.payload);\n } else {\n if (uTime != lastTime) {\n lastCount = context.get('lastCount');\n currentCount = msg.payload;\n context.set('lastTime', uTime);\n context.set('lastCount', currentCount)\n msg.subType = 17;\n msg.childSensorId = \"2\";\n msg.payload = currentCount - lastCount;\n return msg;\n }\n }\n}", "outputs": 1, "noerr": 0, "x": 560, "y": 340, "wires": [ [ "55204322.aadfbc" ] ] }, { "id": "9dbdc7c7.624238", "type": "influxdb", "z": "67deb464.98214c", "hostname": "127.0.0.1", "port": "8086", "database": "environment", "name": "Environment DB" }, { "id": "9de2e4ed.fdcfc8", "type": "influxdb", "z": "67deb464.98214c", "hostname": "127.0.0.1", "port": "8086", "database": "utility", "name": "Utility DB" }, { "id": "4c13992e.b3ec68", "type": "subflow", "name": "Logging filter", "in": [ { "x": 105.5, "y": 240, "wires": [ { "id": "c2063804.3df9c8" } ] } ], "out": [ { "x": 600, "y": 260, "wires": [ { "id": "b57b1f3.f4a84e", "port": 1 } ] } ] }, { "id": "c2063804.3df9c8", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 230, "y": 240, "wires": [ [ "b57b1f3.f4a84e" ] ] }, { "id": "b57b1f3.f4a84e", "type": "function", "z": "4c13992e.b3ec68", "name": "Filter battery msg", "func": "var battMsg = null;\nvar debugMsg = null;\nvar sketchMsg = null;\nif (msg.messageType==3) {\n if (msg.subType===0)\n battMsg = msg;\n if (msg.subType==9)\n debugMsg = msg;\n if (msg.subType==11 || msg.subType==12)\n sketchMsg = msg;\n}\n\nreturn [battMsg, debugMsg, sketchMsg];", "outputs": "3", "noerr": 0, "x": 430, "y": 240, "wires": [ [ "dec3cc44.213c3", "d8b91167.2746f" ], [], [ "b521bd95.4ade4" ] ] }, { "id": "dec3cc44.213c3", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 650, "y": 180, "wires": [ [ "1b4decbb.e4b213" ] ] }, { "id": "38f9ab87.c70654", "type": "file", "z": "4c13992e.b3ec68", "name": "Battery log", "filename": "/var/tmp/battlog.txt", "appendNewline": false, "createDir": false, "overwriteFile": "false", "x": 1050, "y": 180, "wires": [] }, { "id": "1b4decbb.e4b213", "type": "function", "z": "4c13992e.b3ec68", "name": "inject date", "func": "var date = new Date();\nvar str = date.getFullYear() + \"-\" + (date.getMonth() + 1) + \"-\" + date.getDate() + \" \" + date.getHours() + \":\" + date.getMinutes() + \":\" + date.getSeconds();\nmsg.payload = str + \" - \" + msg.payload;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 830, "y": 180, "wires": [ [ "38f9ab87.c70654" ] ] }, { "id": "d8b91167.2746f", "type": "function", "z": "4c13992e.b3ec68", "name": "Check batt level", "func": "var date = new Date();\nvar str = date.getFullYear() + \"-\" + (date.getMonth() + 1) + \"-\" + date.getDate() + \" \" + date.getHours() + \":\" + date.getMinutes() + \":\" + date.getSeconds();\nmsg.date = str;\nif (parseInt(msg.payload)<5)\nreturn msg;", "outputs": 1, "noerr": 0, "x": 660, "y": 220, "wires": [ [ "c44e1c28.3bb1e" ] ] }, { "id": "c44e1c28.3bb1e", "type": "template", "z": "4c13992e.b3ec68", "name": "BatLow message", "field": "payload", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "{{date}} - Battery level is low on node {{nodeId}} : {{payload}} !", "x": 850, "y": 220, "wires": [ [ "e9231639.16dce8" ] ] }, { "id": "e9231639.16dce8", "type": "twitter out", "z": "4c13992e.b3ec68", "twitter": "", "name": "Tweet", "x": 1030, "y": 220, "wires": [] }, { "id": "b478903e.4b877", "type": "file", "z": "4c13992e.b3ec68", "name": "Presentation log", "filename": "/var/tmp/presentation.txt", "appendNewline": true, "createDir": false, "overwriteFile": "false", "x": 840, "y": 300, "wires": [] }, { "id": "b521bd95.4ade4", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 650, "y": 300, "wires": [ [ "b478903e.4b877" ] ] }, { "id": "bed2e35d.412d2", "type": "subflow", "name": "Domoticz conditioner", "info": "Inverts lockstate for domoticz, as domoticz has inverted the logic in their code, compared to mysensors", "in": [ { "x": 280, "y": 220, "wires": [ { "id": "8afd136d.7502f" } ] } ], "out": [ { "x": 1000, "y": 220, "wires": [ { "id": "91eb6b4c.6e1498", "port": 0 } ] } ] }, { "id": "8afd136d.7502f", "type": "mysdecenc", "z": "bed2e35d.412d2", "name": "", "x": 410, "y": 220, "wires": [ [ "126152bf.ed9ead" ] ] }, { "id": "126152bf.ed9ead", "type": "function", "z": "bed2e35d.412d2", "name": "Invert lockstate for domoticz", "func": "if (msg.subType == 36) {\n if (msg.payload== \"1\") msg.payload=\"0\";\n else msg.payload=\"1\";\n}\nreturn msg;", "outputs": 1, "noerr": 0, "x": 640, "y": 220, "wires": [ [ "91eb6b4c.6e1498" ] ] }, { "id": "91eb6b4c.6e1498", "type": "mysdecenc", "z": "bed2e35d.412d2", "name": "", "x": 870, "y": 220, "wires": [ [] ] }, { "id": "2257718.fdda88e", "type": "subflow", "name": "Energy meter", "info": "Converts input from arduino sketch, to a \nMysensors compatible protocol format, usable\nfor injecting into the message stream from\nnormal Mysensors nodes\n\nOutputs data as nodeId 99.", "in": [], "out": [ { "x": 1020, "y": 200, "wires": [ { "id": "9d92273c.626dd8", "port": 0 } ] } ] }, { "id": "12db17ce.ed24e8", "type": "serial in", "z": "2257718.fdda88e", "name": "Meter input", "serial": "acfe3226.5301d", "x": 240, "y": 200, "wires": [ [ "e56f30b7.1a90d" ] ] }, { "id": "1dcfb48.fe2304c", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_WATT node 99", "nodeid": "99", "childid": "1", "subtype": "17", "internal": "0", "ack": false, "msgtype": "1", "presentation": false, "presentationtype": "13", "presentationtext": "Watt", "fullpresentation": false, "firmwarename": "", "firmwareversion": "", "x": 650, "y": 160, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "f9b89df5.06476", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_KWH node 99", "nodeid": "99", "childid": "1", "subtype": "18", "internal": "0", "ack": false, "msgtype": "1", "presentation": true, "presentationtype": "13", "presentationtext": "Kwh", "fullpresentation": true, "firmwarename": "MeterNode", "firmwareversion": "0.1", "x": 650, "y": 200, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "9d92273c.626dd8", "type": "mysdecenc", "z": "2257718.fdda88e", "name": "", "x": 890, "y": 200, "wires": [ [] ] }, { "id": "e56f30b7.1a90d", "type": "function", "z": "2257718.fdda88e", "name": "Split meter data", "func": "var m=msg.payload.split(';');\nvar msg1 = {payload:m[0]};\nvar msg2 = {payload:m[1]/1000};\nvar msg3 = {payload:m[1]};\nreturn [msg1, msg2, msg3];", "outputs": "3", "noerr": 0, "x": 420, "y": 200, "wires": [ [ "1dcfb48.fe2304c" ], [ "f9b89df5.06476" ], [ "dfd92894.2026d8", "11f1e54.721221b" ] ] }, { "id": "dfd92894.2026d8", "type": "file", "z": "2257718.fdda88e", "name": "meter counter output to file", "filename": "/var/tmp/meascache.txt", "appendNewline": true, "createDir": false, "overwriteFile": "true", "x": 680, "y": 280, "wires": [] }, { "id": "11f1e54.721221b", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_VAR1 (Wh node 99)", "nodeid": "99", "childid": "10", "subtype": "24", "internal": 0, "ack": false, "msgtype": "1", "presentation": false, "presentationtype": 0, "presentationtext": "", "fullpresentation": false, "firmwarename": "", "firmwareversion": "", "x": 660, "y": 240, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "acfe3226.5301d", "type": "serial-port", "z": "", "serialport": "/dev/ttyUTILITY", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "67deb464.98214c", "type": "tab", "label": "Mysensors" }, { "id": "5b8bba4c.a47444", "type": "serial in", "z": "67deb464.98214c", "name": "Mysensors NRF", "serial": "821a7286.7de59", "x": 200, "y": 460, "wires": [ [ "a056d087.fb87f", "8cb827f.b90b8d8" ] ] }, { "id": "47b5936e.b84a6c", "type": "serial out", "z": "67deb464.98214c", "name": "Mysensors NRF", "serial": "821a7286.7de59", "x": 1340, "y": 180, "wires": [] }, { "id": "4755dfb8.b8aa2", "type": "serial out", "z": "67deb464.98214c", "name": "Domoticz", "serial": "b5105521.4aefa8", "x": 1320, "y": 420, "wires": [] }, { "id": "8b4a855.f74b578", "type": "debug", "z": "67deb464.98214c", "name": "Mysensors in", "active": false, "console": "false", "complete": "true", "x": 1110, "y": 340, "wires": [] }, { "id": "8caee560.735118", "type": "subflow:2257718.fdda88e", "z": "67deb464.98214c", "x": 190, "y": 640, "wires": [ [ "44592b43.bba6d4", "d7b40093.e136f" ] ] }, { "id": "44592b43.bba6d4", "type": "debug", "z": "67deb464.98214c", "name": "Energy meter output", "active": false, "console": "false", "complete": "true", "x": 420, "y": 640, "wires": [] }, { "id": "9e471178.61b8f", "type": "subflow:bed2e35d.412d2", "z": "67deb464.98214c", "name": "", "x": 420, "y": 220, "wires": [ [ "173aba02.e8c546", "9aecc18f.21f6d" ] ] }, { "id": "9bdc2a5b.6423d8", "type": "subflow:bed2e35d.412d2", "z": "67deb464.98214c", "name": "Domoticz out", "x": 1110, "y": 420, "wires": [ [ "4755dfb8.b8aa2" ] ] }, { "id": "9ebb1391.6144f", "type": "debug", "z": "67deb464.98214c", "name": "gw debug", "active": false, "console": "false", "complete": "true", "x": 1320, "y": 480, "wires": [] }, { "id": "49c6c17b.b6394", "type": "subflow:4c13992e.b3ec68", "z": "67deb464.98214c", "x": 1110, "y": 480, "wires": [ [ "9ebb1391.6144f" ] ] }, { "id": "602db35f.9fd24c", "type": "serial in", "z": "67deb464.98214c", "name": "Domoticz (20)", "serial": "b5105521.4aefa8", "x": 190, "y": 220, "wires": [ [ "9e471178.61b8f" ] ] }, { "id": "173aba02.e8c546", "type": "debug", "z": "67deb464.98214c", "name": "Domoticz in", "active": false, "console": "false", "complete": "payload", "x": 650, "y": 180, "wires": [] }, { "id": "3ff64036.ae116", "type": "subflow:9b272654.9ad688", "z": "67deb464.98214c", "name": "InfluxDB", "x": 1100, "y": 380, "wires": [ [ "aec232d3.2860b" ], [ "1d454a20.ff7ae6" ] ] }, { "id": "aec232d3.2860b", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "true", "x": 1310, "y": 340, "wires": [] }, { "id": "a056d087.fb87f", "type": "change", "z": "67deb464.98214c", "name": "mark NRF", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "nrf", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 390, "y": 480, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "ba16f31f.9adc5", "type": "change", "z": "67deb464.98214c", "name": "mark RFM", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "rfm", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 390, "y": 520, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "5990dc86.7a2ef4", "type": "function", "z": "67deb464.98214c", "name": "net detect", "func": "var net = flow.get('network') || {};\nvar msg2 = {};\nnet[msg.nodeId] = msg.radio;\nflow.set('network', net);\nmsg2.payload = net;\nreturn [msg, msg2];", "outputs": "2", "noerr": 0, "x": 720, "y": 500, "wires": [ [ "1202b756.eb6449" ], [ "ee23ee4a.b5f14" ] ] }, { "id": "ee23ee4a.b5f14", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "false", "x": 890, "y": 520, "wires": [] }, { "id": "581b2ac8.2248c4", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 570, "y": 500, "wires": [ [ "5990dc86.7a2ef4", "b10cb69c.3e3d18", "ea57b38e.eecb5" ] ] }, { "id": "1202b756.eb6449", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 890, "y": 480, "wires": [ [ "8b4a855.f74b578", "49c6c17b.b6394", "9bdc2a5b.6423d8", "3ff64036.ae116" ] ] }, { "id": "22f329c0.24f896", "type": "function", "z": "67deb464.98214c", "name": "Net switch", "func": "var net = flow.get('network');\nmsg_nrf = null;\nmsg_rfm = null;\nmsg_nodered = null;\nif (msg.nodeId in net) {\n var network = net[msg.nodeId];\n if (network == 'rfm') msg_rfm = msg;\n if (network == 'nrf') msg_nrf = msg;\n if (network == 'nodered') msg_nodered = msg;\n} else {\n msg_nrf = msg;\n msg_rfm = msg;\n msg_nodered = msg;\n}\nreturn [msg_nrf,msg_rfm, msg_nodered];\n", "outputs": "3", "noerr": 0, "x": 890, "y": 220, "wires": [ [ "56c9c62f.f1cbc8" ], [ "4c477db.4619e84" ], [] ] }, { "id": "9aecc18f.21f6d", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 650, "y": 220, "wires": [ [ "22f329c0.24f896", "b10cb69c.3e3d18" ] ] }, { "id": "56c9c62f.f1cbc8", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 1110, "y": 180, "wires": [ [ "47b5936e.b84a6c", "932ebb67.4968d8" ] ] }, { "id": "4c477db.4619e84", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 1110, "y": 240, "wires": [ [ "6b2fe680.509218", "aac8db1a.8aa468" ] ] }, { "id": "932ebb67.4968d8", "type": "debug", "z": "67deb464.98214c", "name": "msg_nrf", "active": false, "console": "false", "complete": "payload", "x": 1320, "y": 140, "wires": [] }, { "id": "6b2fe680.509218", "type": "debug", "z": "67deb464.98214c", "name": "msg_rfm", "active": false, "console": "false", "complete": "payload", "x": 1320, "y": 280, "wires": [] }, { "id": "8919748d.f19738", "type": "debug", "z": "67deb464.98214c", "name": "RFM Input", "active": false, "console": "false", "complete": "payload", "x": 390, "y": 560, "wires": [] }, { "id": "8155e57b.a7b2e8", "type": "serial in", "z": "67deb464.98214c", "name": "Mysensors RFM", "serial": "48886e04.c4cc6", "x": 200, "y": 540, "wires": [ [ "ba16f31f.9adc5", "8919748d.f19738" ] ] }, { "id": "aac8db1a.8aa468", "type": "serial out", "z": "67deb464.98214c", "name": "Mysensors RFM", "serial": "48886e04.c4cc6", "x": 1340, "y": 240, "wires": [] }, { "id": "8cb827f.b90b8d8", "type": "debug", "z": "67deb464.98214c", "name": "NRF input", "active": false, "console": "false", "complete": "payload", "x": 380, "y": 440, "wires": [] }, { "id": "b10cb69c.3e3d18", "type": "link out", "z": "67deb464.98214c", "name": "UI link", "links": [ "2f8a6093.73ef7", "6d7cc489.0bb81c", "ad2dd4f0.d2c718", "d6fb4a23.fcf218" ], "x": 755, "y": 320, "wires": [] }, { "id": "cc31c979.e15578", "type": "link in", "z": "67deb464.98214c", "name": "", "links": [ "5d82dd49.5350d4" ], "x": 755, "y": 360, "wires": [ [ "1202b756.eb6449", "22f329c0.24f896" ] ] }, { "id": "d7b40093.e136f", "type": "change", "z": "67deb464.98214c", "name": "mark nodered", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "nodered", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 400, "y": 600, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "1d454a20.ff7ae6", "type": "link out", "z": "67deb464.98214c", "name": "Trigger KWH to dashboard", "links": [ "1e4f3d9a.978582" ], "x": 1275, "y": 380, "wires": [] }, { "id": "ea57b38e.eecb5", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "true", "x": 710, "y": 580, "wires": [] }, { "id": "821a7286.7de59", "type": "serial-port", "z": "", "serialport": "/dev/ttyNRF24", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "b5105521.4aefa8", "type": "serial-port", "serialport": "/dev/ttyS80", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "48886e04.c4cc6", "type": "serial-port", "z": "67deb464.98214c", "serialport": "/dev/ttyRFM69", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true } ]``` -
In theory it should work, as you can set node-red up to receive MQTT messages, which could then be manipulated, and send off to domoticz (if needed).
I think that @Anticimex made some experiments with mqtt/ethernet gateways using node-red. But can't remember details..
-
In theory it should work, as you can set node-red up to receive MQTT messages, which could then be manipulated, and send off to domoticz (if needed).
I think that @Anticimex made some experiments with mqtt/ethernet gateways using node-red. But can't remember details..
-
Btw. with the setup mentioned above, I have made a basic mysensors router in node-red, I can have two mysensors gateways attached to node-red (nRF24, and RFM69). I then keep track of which gateway I hear which node on, and use that to send commands through the right gateway, when domoticz want to turn on an actuator.
Domoticz only knows of one gateway. It just sees a bunch of nodes reporting data :)
-
-
the module is available through NPM as well.. So npm install node-red-contrib-mysensors :)
The basic node-red mysensors is pasted below, my setup is starting to be quite extensive, with reporting to slack channels, creating a websocket for my custom dashboard etc. But isn't necessary for the basic domoticz/nodered
For connecting node-red/domoticz together I use socat to create a virtual serial port:
socat PTY,link=/dev/ttyS81,mode=666,group=dialout,raw PTY,link=/dev/ttyUSB21,mode=666,group=dialout,raw &node-red:
[ { "id": "9b272654.9ad688", "type": "subflow", "name": "Influx processing", "info": "", "in": [ { "x": 220, "y": 280, "wires": [ { "id": "5cfd0e8.fa302f" } ] } ], "out": [ { "x": 960, "y": 240, "wires": [ { "id": "55204322.aadfbc", "port": 0 } ] }, { "x": 960, "y": 380, "wires": [ { "id": "d6b8cf3e.6954c", "port": 0 } ] } ] }, { "id": "55204322.aadfbc", "type": "function", "z": "9b272654.9ad688", "name": "Influx conditioner", "func": "msg_env = null;\nmsg_utility = null;\nmsg_debug = null;\nst = msg.subType;\nif (msg.messageType == 1 && (st === 0 || st == 1 || st == 4 || st == 17)) {\n var tags = {};var data = {}\n tags.node = msg.nodeId.toString();\n tags.sensor = msg.childSensorId.toString();\n data.value=parseFloat(msg.payload);\n switch (st) {\n case 0 : type = \"temperature\";break;\n case 1 : type = \"humidity\"; break;\n case 4 : type = \"barometer\"; break;\n case 17: type = \"electricity\"; break;\n }\n msg.payload = [data, tags];\n msg.measurement = type;\n msg_debug = msg;\n if (msg.subType==17) \n msg_utility = msg;\n else \n msg_env = msg;\n} \nelse \n msg = null;\nreturn [msg_debug, msg_env, msg_utility];", "outputs": "3", "noerr": 0, "x": 790, "y": 280, "wires": [ [], [ "c042117a.3fbdf" ], [ "f6bdc7dc.77c758" ] ] }, { "id": "5cfd0e8.fa302f", "type": "mysdecenc", "z": "9b272654.9ad688", "name": "", "x": 350, "y": 280, "wires": [ [ "55204322.aadfbc", "d6b8cf3e.6954c" ] ] }, { "id": "c042117a.3fbdf", "type": "influxdb out", "z": "9b272654.9ad688", "influxdb": "9dbdc7c7.624238", "name": "", "measurement": "", "x": 1020, "y": 280, "wires": [] }, { "id": "f6bdc7dc.77c758", "type": "influxdb out", "z": "9b272654.9ad688", "influxdb": "9de2e4ed.fdcfc8", "name": "Utility", "measurement": "", "x": 990, "y": 320, "wires": [] }, { "id": "d6b8cf3e.6954c", "type": "function", "z": "9b272654.9ad688", "name": "Watt/Hour calculator", "func": "/* Takes input on subType 24, calculates difference\n from last time, if around 60 seconds have passed\n since last report.\n It passes the value on as subType 17, and\n childSensorId 2 */\n\nif ((msg.subType===24) && (msg.nodeId===99)) {\n var uTime = Math.floor(Date.now()/60000);\n var lastTime = context.get('lastTime')||0;\n if (lastTime === 0) {\n context.set('lastTime', uTime);\n context.set('lastCount', msg.payload);\n } else {\n if (uTime != lastTime) {\n lastCount = context.get('lastCount');\n currentCount = msg.payload;\n context.set('lastTime', uTime);\n context.set('lastCount', currentCount)\n msg.subType = 17;\n msg.childSensorId = \"2\";\n msg.payload = currentCount - lastCount;\n return msg;\n }\n }\n}", "outputs": 1, "noerr": 0, "x": 560, "y": 340, "wires": [ [ "55204322.aadfbc" ] ] }, { "id": "9dbdc7c7.624238", "type": "influxdb", "z": "67deb464.98214c", "hostname": "127.0.0.1", "port": "8086", "database": "environment", "name": "Environment DB" }, { "id": "9de2e4ed.fdcfc8", "type": "influxdb", "z": "67deb464.98214c", "hostname": "127.0.0.1", "port": "8086", "database": "utility", "name": "Utility DB" }, { "id": "4c13992e.b3ec68", "type": "subflow", "name": "Logging filter", "in": [ { "x": 105.5, "y": 240, "wires": [ { "id": "c2063804.3df9c8" } ] } ], "out": [ { "x": 600, "y": 260, "wires": [ { "id": "b57b1f3.f4a84e", "port": 1 } ] } ] }, { "id": "c2063804.3df9c8", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 230, "y": 240, "wires": [ [ "b57b1f3.f4a84e" ] ] }, { "id": "b57b1f3.f4a84e", "type": "function", "z": "4c13992e.b3ec68", "name": "Filter battery msg", "func": "var battMsg = null;\nvar debugMsg = null;\nvar sketchMsg = null;\nif (msg.messageType==3) {\n if (msg.subType===0)\n battMsg = msg;\n if (msg.subType==9)\n debugMsg = msg;\n if (msg.subType==11 || msg.subType==12)\n sketchMsg = msg;\n}\n\nreturn [battMsg, debugMsg, sketchMsg];", "outputs": "3", "noerr": 0, "x": 430, "y": 240, "wires": [ [ "dec3cc44.213c3", "d8b91167.2746f" ], [], [ "b521bd95.4ade4" ] ] }, { "id": "dec3cc44.213c3", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 650, "y": 180, "wires": [ [ "1b4decbb.e4b213" ] ] }, { "id": "38f9ab87.c70654", "type": "file", "z": "4c13992e.b3ec68", "name": "Battery log", "filename": "/var/tmp/battlog.txt", "appendNewline": false, "createDir": false, "overwriteFile": "false", "x": 1050, "y": 180, "wires": [] }, { "id": "1b4decbb.e4b213", "type": "function", "z": "4c13992e.b3ec68", "name": "inject date", "func": "var date = new Date();\nvar str = date.getFullYear() + \"-\" + (date.getMonth() + 1) + \"-\" + date.getDate() + \" \" + date.getHours() + \":\" + date.getMinutes() + \":\" + date.getSeconds();\nmsg.payload = str + \" - \" + msg.payload;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 830, "y": 180, "wires": [ [ "38f9ab87.c70654" ] ] }, { "id": "d8b91167.2746f", "type": "function", "z": "4c13992e.b3ec68", "name": "Check batt level", "func": "var date = new Date();\nvar str = date.getFullYear() + \"-\" + (date.getMonth() + 1) + \"-\" + date.getDate() + \" \" + date.getHours() + \":\" + date.getMinutes() + \":\" + date.getSeconds();\nmsg.date = str;\nif (parseInt(msg.payload)<5)\nreturn msg;", "outputs": 1, "noerr": 0, "x": 660, "y": 220, "wires": [ [ "c44e1c28.3bb1e" ] ] }, { "id": "c44e1c28.3bb1e", "type": "template", "z": "4c13992e.b3ec68", "name": "BatLow message", "field": "payload", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "{{date}} - Battery level is low on node {{nodeId}} : {{payload}} !", "x": 850, "y": 220, "wires": [ [ "e9231639.16dce8" ] ] }, { "id": "e9231639.16dce8", "type": "twitter out", "z": "4c13992e.b3ec68", "twitter": "", "name": "Tweet", "x": 1030, "y": 220, "wires": [] }, { "id": "b478903e.4b877", "type": "file", "z": "4c13992e.b3ec68", "name": "Presentation log", "filename": "/var/tmp/presentation.txt", "appendNewline": true, "createDir": false, "overwriteFile": "false", "x": 840, "y": 300, "wires": [] }, { "id": "b521bd95.4ade4", "type": "mysdecenc", "z": "4c13992e.b3ec68", "name": "", "x": 650, "y": 300, "wires": [ [ "b478903e.4b877" ] ] }, { "id": "bed2e35d.412d2", "type": "subflow", "name": "Domoticz conditioner", "info": "Inverts lockstate for domoticz, as domoticz has inverted the logic in their code, compared to mysensors", "in": [ { "x": 280, "y": 220, "wires": [ { "id": "8afd136d.7502f" } ] } ], "out": [ { "x": 1000, "y": 220, "wires": [ { "id": "91eb6b4c.6e1498", "port": 0 } ] } ] }, { "id": "8afd136d.7502f", "type": "mysdecenc", "z": "bed2e35d.412d2", "name": "", "x": 410, "y": 220, "wires": [ [ "126152bf.ed9ead" ] ] }, { "id": "126152bf.ed9ead", "type": "function", "z": "bed2e35d.412d2", "name": "Invert lockstate for domoticz", "func": "if (msg.subType == 36) {\n if (msg.payload== \"1\") msg.payload=\"0\";\n else msg.payload=\"1\";\n}\nreturn msg;", "outputs": 1, "noerr": 0, "x": 640, "y": 220, "wires": [ [ "91eb6b4c.6e1498" ] ] }, { "id": "91eb6b4c.6e1498", "type": "mysdecenc", "z": "bed2e35d.412d2", "name": "", "x": 870, "y": 220, "wires": [ [] ] }, { "id": "2257718.fdda88e", "type": "subflow", "name": "Energy meter", "info": "Converts input from arduino sketch, to a \nMysensors compatible protocol format, usable\nfor injecting into the message stream from\nnormal Mysensors nodes\n\nOutputs data as nodeId 99.", "in": [], "out": [ { "x": 1020, "y": 200, "wires": [ { "id": "9d92273c.626dd8", "port": 0 } ] } ] }, { "id": "12db17ce.ed24e8", "type": "serial in", "z": "2257718.fdda88e", "name": "Meter input", "serial": "acfe3226.5301d", "x": 240, "y": 200, "wires": [ [ "e56f30b7.1a90d" ] ] }, { "id": "1dcfb48.fe2304c", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_WATT node 99", "nodeid": "99", "childid": "1", "subtype": "17", "internal": "0", "ack": false, "msgtype": "1", "presentation": false, "presentationtype": "13", "presentationtext": "Watt", "fullpresentation": false, "firmwarename": "", "firmwareversion": "", "x": 650, "y": 160, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "f9b89df5.06476", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_KWH node 99", "nodeid": "99", "childid": "1", "subtype": "18", "internal": "0", "ack": false, "msgtype": "1", "presentation": true, "presentationtype": "13", "presentationtext": "Kwh", "fullpresentation": true, "firmwarename": "MeterNode", "firmwareversion": "0.1", "x": 650, "y": 200, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "9d92273c.626dd8", "type": "mysdecenc", "z": "2257718.fdda88e", "name": "", "x": 890, "y": 200, "wires": [ [] ] }, { "id": "e56f30b7.1a90d", "type": "function", "z": "2257718.fdda88e", "name": "Split meter data", "func": "var m=msg.payload.split(';');\nvar msg1 = {payload:m[0]};\nvar msg2 = {payload:m[1]/1000};\nvar msg3 = {payload:m[1]};\nreturn [msg1, msg2, msg3];", "outputs": "3", "noerr": 0, "x": 420, "y": 200, "wires": [ [ "1dcfb48.fe2304c" ], [ "f9b89df5.06476" ], [ "dfd92894.2026d8", "11f1e54.721221b" ] ] }, { "id": "dfd92894.2026d8", "type": "file", "z": "2257718.fdda88e", "name": "meter counter output to file", "filename": "/var/tmp/meascache.txt", "appendNewline": true, "createDir": false, "overwriteFile": "true", "x": 680, "y": 280, "wires": [] }, { "id": "11f1e54.721221b", "type": "mysencap", "z": "2257718.fdda88e", "name": "V_VAR1 (Wh node 99)", "nodeid": "99", "childid": "10", "subtype": "24", "internal": 0, "ack": false, "msgtype": "1", "presentation": false, "presentationtype": 0, "presentationtext": "", "fullpresentation": false, "firmwarename": "", "firmwareversion": "", "x": 660, "y": 240, "wires": [ [ "9d92273c.626dd8" ] ] }, { "id": "acfe3226.5301d", "type": "serial-port", "z": "", "serialport": "/dev/ttyUTILITY", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "67deb464.98214c", "type": "tab", "label": "Mysensors" }, { "id": "5b8bba4c.a47444", "type": "serial in", "z": "67deb464.98214c", "name": "Mysensors NRF", "serial": "821a7286.7de59", "x": 200, "y": 460, "wires": [ [ "a056d087.fb87f", "8cb827f.b90b8d8" ] ] }, { "id": "47b5936e.b84a6c", "type": "serial out", "z": "67deb464.98214c", "name": "Mysensors NRF", "serial": "821a7286.7de59", "x": 1340, "y": 180, "wires": [] }, { "id": "4755dfb8.b8aa2", "type": "serial out", "z": "67deb464.98214c", "name": "Domoticz", "serial": "b5105521.4aefa8", "x": 1320, "y": 420, "wires": [] }, { "id": "8b4a855.f74b578", "type": "debug", "z": "67deb464.98214c", "name": "Mysensors in", "active": false, "console": "false", "complete": "true", "x": 1110, "y": 340, "wires": [] }, { "id": "8caee560.735118", "type": "subflow:2257718.fdda88e", "z": "67deb464.98214c", "x": 190, "y": 640, "wires": [ [ "44592b43.bba6d4", "d7b40093.e136f" ] ] }, { "id": "44592b43.bba6d4", "type": "debug", "z": "67deb464.98214c", "name": "Energy meter output", "active": false, "console": "false", "complete": "true", "x": 420, "y": 640, "wires": [] }, { "id": "9e471178.61b8f", "type": "subflow:bed2e35d.412d2", "z": "67deb464.98214c", "name": "", "x": 420, "y": 220, "wires": [ [ "173aba02.e8c546", "9aecc18f.21f6d" ] ] }, { "id": "9bdc2a5b.6423d8", "type": "subflow:bed2e35d.412d2", "z": "67deb464.98214c", "name": "Domoticz out", "x": 1110, "y": 420, "wires": [ [ "4755dfb8.b8aa2" ] ] }, { "id": "9ebb1391.6144f", "type": "debug", "z": "67deb464.98214c", "name": "gw debug", "active": false, "console": "false", "complete": "true", "x": 1320, "y": 480, "wires": [] }, { "id": "49c6c17b.b6394", "type": "subflow:4c13992e.b3ec68", "z": "67deb464.98214c", "x": 1110, "y": 480, "wires": [ [ "9ebb1391.6144f" ] ] }, { "id": "602db35f.9fd24c", "type": "serial in", "z": "67deb464.98214c", "name": "Domoticz (20)", "serial": "b5105521.4aefa8", "x": 190, "y": 220, "wires": [ [ "9e471178.61b8f" ] ] }, { "id": "173aba02.e8c546", "type": "debug", "z": "67deb464.98214c", "name": "Domoticz in", "active": false, "console": "false", "complete": "payload", "x": 650, "y": 180, "wires": [] }, { "id": "3ff64036.ae116", "type": "subflow:9b272654.9ad688", "z": "67deb464.98214c", "name": "InfluxDB", "x": 1100, "y": 380, "wires": [ [ "aec232d3.2860b" ], [ "1d454a20.ff7ae6" ] ] }, { "id": "aec232d3.2860b", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "true", "x": 1310, "y": 340, "wires": [] }, { "id": "a056d087.fb87f", "type": "change", "z": "67deb464.98214c", "name": "mark NRF", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "nrf", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 390, "y": 480, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "ba16f31f.9adc5", "type": "change", "z": "67deb464.98214c", "name": "mark RFM", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "rfm", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 390, "y": 520, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "5990dc86.7a2ef4", "type": "function", "z": "67deb464.98214c", "name": "net detect", "func": "var net = flow.get('network') || {};\nvar msg2 = {};\nnet[msg.nodeId] = msg.radio;\nflow.set('network', net);\nmsg2.payload = net;\nreturn [msg, msg2];", "outputs": "2", "noerr": 0, "x": 720, "y": 500, "wires": [ [ "1202b756.eb6449" ], [ "ee23ee4a.b5f14" ] ] }, { "id": "ee23ee4a.b5f14", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "false", "x": 890, "y": 520, "wires": [] }, { "id": "581b2ac8.2248c4", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 570, "y": 500, "wires": [ [ "5990dc86.7a2ef4", "b10cb69c.3e3d18", "ea57b38e.eecb5" ] ] }, { "id": "1202b756.eb6449", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 890, "y": 480, "wires": [ [ "8b4a855.f74b578", "49c6c17b.b6394", "9bdc2a5b.6423d8", "3ff64036.ae116" ] ] }, { "id": "22f329c0.24f896", "type": "function", "z": "67deb464.98214c", "name": "Net switch", "func": "var net = flow.get('network');\nmsg_nrf = null;\nmsg_rfm = null;\nmsg_nodered = null;\nif (msg.nodeId in net) {\n var network = net[msg.nodeId];\n if (network == 'rfm') msg_rfm = msg;\n if (network == 'nrf') msg_nrf = msg;\n if (network == 'nodered') msg_nodered = msg;\n} else {\n msg_nrf = msg;\n msg_rfm = msg;\n msg_nodered = msg;\n}\nreturn [msg_nrf,msg_rfm, msg_nodered];\n", "outputs": "3", "noerr": 0, "x": 890, "y": 220, "wires": [ [ "56c9c62f.f1cbc8" ], [ "4c477db.4619e84" ], [] ] }, { "id": "9aecc18f.21f6d", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 650, "y": 220, "wires": [ [ "22f329c0.24f896", "b10cb69c.3e3d18" ] ] }, { "id": "56c9c62f.f1cbc8", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 1110, "y": 180, "wires": [ [ "47b5936e.b84a6c", "932ebb67.4968d8" ] ] }, { "id": "4c477db.4619e84", "type": "mysdecenc", "z": "67deb464.98214c", "name": "", "x": 1110, "y": 240, "wires": [ [ "6b2fe680.509218", "aac8db1a.8aa468" ] ] }, { "id": "932ebb67.4968d8", "type": "debug", "z": "67deb464.98214c", "name": "msg_nrf", "active": false, "console": "false", "complete": "payload", "x": 1320, "y": 140, "wires": [] }, { "id": "6b2fe680.509218", "type": "debug", "z": "67deb464.98214c", "name": "msg_rfm", "active": false, "console": "false", "complete": "payload", "x": 1320, "y": 280, "wires": [] }, { "id": "8919748d.f19738", "type": "debug", "z": "67deb464.98214c", "name": "RFM Input", "active": false, "console": "false", "complete": "payload", "x": 390, "y": 560, "wires": [] }, { "id": "8155e57b.a7b2e8", "type": "serial in", "z": "67deb464.98214c", "name": "Mysensors RFM", "serial": "48886e04.c4cc6", "x": 200, "y": 540, "wires": [ [ "ba16f31f.9adc5", "8919748d.f19738" ] ] }, { "id": "aac8db1a.8aa468", "type": "serial out", "z": "67deb464.98214c", "name": "Mysensors RFM", "serial": "48886e04.c4cc6", "x": 1340, "y": 240, "wires": [] }, { "id": "8cb827f.b90b8d8", "type": "debug", "z": "67deb464.98214c", "name": "NRF input", "active": false, "console": "false", "complete": "payload", "x": 380, "y": 440, "wires": [] }, { "id": "b10cb69c.3e3d18", "type": "link out", "z": "67deb464.98214c", "name": "UI link", "links": [ "2f8a6093.73ef7", "6d7cc489.0bb81c", "ad2dd4f0.d2c718", "d6fb4a23.fcf218" ], "x": 755, "y": 320, "wires": [] }, { "id": "cc31c979.e15578", "type": "link in", "z": "67deb464.98214c", "name": "", "links": [ "5d82dd49.5350d4" ], "x": 755, "y": 360, "wires": [ [ "1202b756.eb6449", "22f329c0.24f896" ] ] }, { "id": "d7b40093.e136f", "type": "change", "z": "67deb464.98214c", "name": "mark nodered", "rules": [ { "t": "set", "p": "radio", "pt": "msg", "to": "nodered", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 400, "y": 600, "wires": [ [ "581b2ac8.2248c4" ] ] }, { "id": "1d454a20.ff7ae6", "type": "link out", "z": "67deb464.98214c", "name": "Trigger KWH to dashboard", "links": [ "1e4f3d9a.978582" ], "x": 1275, "y": 380, "wires": [] }, { "id": "ea57b38e.eecb5", "type": "debug", "z": "67deb464.98214c", "name": "", "active": false, "console": "false", "complete": "true", "x": 710, "y": 580, "wires": [] }, { "id": "821a7286.7de59", "type": "serial-port", "z": "", "serialport": "/dev/ttyNRF24", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "b5105521.4aefa8", "type": "serial-port", "serialport": "/dev/ttyS80", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true }, { "id": "48886e04.c4cc6", "type": "serial-port", "z": "67deb464.98214c", "serialport": "/dev/ttyRFM69", "serialbaud": "115200", "databits": "8", "parity": "none", "stopbits": "1", "newline": "\\n", "bin": "false", "out": "char", "addchar": true } ]```@tbowmo I feel I have a lot of reading to do...
Setting up my own custom dashboard has been on my todo list forever (I have the shell made and used the Domoticz API to pull in data but am not really satisfied at all with Domo's APIs). InfluxDB is neat but so, so, limited in my opinion (I do SQL Server big data analytics in the real world). -
I want to pick a controller, but I don't want to jump in feet first only to find out later that it's somehow seriously flawed. Domoticz, Openhab, and Vera appear to be the most popular based on number of topics and posts. I think I can rule out Vera based on prior negative experience with it. So, I guess that makes it Domoticz vs. OpenHAB. Any reasons to prefer one over the other? The built-in graphing in Domoticz looks very appealing.
@NeverDie I tried for days. Too buggy, and not enough support. I landed with MyController, which takes advantage of MySensors, plus allows a lot of scripting, etc.
</$0.02>
-
@Anticimex don't you think MQTT is better suited for this task? I am still quite new to node-red and haven't tikered with it much as learning javascript is low on the priority list :D