Version 4.1.0 does not run on my system, 4.0.9 does
After my previous problem of my own making (not remembering that I needed to update the version in the Docker Compose file), I first upgraded to 4.0.9. Today I saw that 4.1.0 was out a couple of days ago, so I tried to upgrade. But after using the exact same Docker Compose file, only changing 4.0.9 to 4.1.0 in the line FROM nodered/node-red:4.1.0-debian, I get "image unhealthy" with Docker PS and I can't connect to it on MQTT or the frontend (which stands chewing forever until I break it). I have no idea how to find out what the problem is, but this is my Docker Compose file:
services:
node-red:
build:
dockerfile_inline: |
FROM nodered/node-red:4.1.0-debian
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends iputils-ping sshpass openssh-client
USER node-red
container_name: Node-RED
privileged: true
restart: no
group_add:
- "20"
environment:
- TZ=Europe/Oslo
network_mode: host
devices:
- /dev/serial/by-id/usb-RFXCOM_RFXtrx433_A119M1VX-if00-port0:/dev/ttyUSB0
volumes:
- /media/pi/Docker/Docker-Compose/Node-RED/Data:/data
- /media/pi/Docker/Docker-Compose:/home/pi/Docker-Compose:ro
- /home/pi/.ssh/known_hosts:/usr/src/node-red/.ssh/known_hosts
- type: bind
source: /home/pi/Node-RED-omstarter.txt
target: /home/pi/Node-RED-omstarter.txt
Stopping the container, running docker system prune -a and restarting/pulling again makes it work as it should with 4.0.9. I have tried going back and forth a few times, same result every time.
You shouldn't need the extra build step, all those packages should be in the base container.
We also need the logs from the container to know why its "unhealthy"
Thanks for answering! No, not all:
#6 2.457 The following NEW packages will be installed:
#6 2.457 sshpass
#6 2.460 The following packages will be upgraded:
#6 2.461 openssh-client
Here's the current result of docker ps:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
044d57d5296a node-red-node-red "./entrypoint.sh" 41 seconds ago Up 40 seconds (health: starting)
And docker container logs node-red-node-red:
docker container logs node-red-node-red
Error response from daemon: No such container: node-red-node-red
The double node-red confuses me too, since I have container_name: Node-RED in the build file.
the node-red-node-red is because it prefixed by the docker compose name
Run docker logs <container id> not the image name
Got it. Here:
31 Jul 13:06:31 - [info]
Welcome to Node-RED
===================
31 Jul 13:06:31 - [info] Node-RED version: v4.1.0
31 Jul 13:06:31 - [info] Node.js version: v20.19.4
31 Jul 13:06:31 - [info] Linux 6.12.34+rpt-rpi-2712 arm64 LE
31 Jul 13:06:32 - [info] Loading palette nodes
31 Jul 13:06:33 - [info] Settings file : /data/settings.js
31 Jul 13:06:33 - [info] Context store : 'default' [module=memory]
31 Jul 13:06:33 - [info] User directory : /data
31 Jul 13:06:33 - [warn] Projects disabled : editorTheme.projects.enabled=false
31 Jul 13:06:33 - [info] Flows file : /data/flows.json
31 Jul 13:06:33 - [info] Server now running at http://127.0.0.1:1880/
31 Jul 13:06:33 - [warn]
---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.
If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.
You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------
31 Jul 13:06:33 - [info] Starting flows
31 Jul 13:06:33 - [info] Started flows
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 lighting1 listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(Use `node --trace-warnings ...` to show where the warning was created)
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 lighting2 listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 lighting5 listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 lighting6 listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 security1 listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 hunterfan listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 edisio listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
(node:7) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 fan listeners added to [RfxCom]. MaxListeners is 10. Use emitter.setMaxListeners() to increase limit
31 Jul 13:06:33 - [info] [rfx-lights-out:RFXtrx-kommandoer] connecting to /dev/ttyUSB0
31 Jul 13:06:33 - [info] [mqtt-broker:Hytte-Pi] Connected to broker: mqtt://192.168.1.101:1883
31 Jul 13:06:33 - [info] [mqtt-broker:Lokal MQTT-Broker] Connected to broker: mqtt://192.168.1.101:1883
31 Jul 13:06:33 - [info] [avr-yamaha:Hovedforsterker] STARTING event listener
31 Jul 13:06:33 - [info] [avr-yamaha:Hovedforsterker] UDP client listening on 0.0.0.0:1900
31 Jul 13:06:34 - [info] [ps-strategy-best-save:Best Save] Switching on in 32005390 milliseconds
31 Jul 13:06:38 - [info] [avr-yamaha:Hovedforsterker] UPnP Event from [192.168.1.200] --> M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Content-Length: 0
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:MediaServer:1
31 Jul 13:06:38 - [info] [avr-yamaha:Hovedforsterker] UPnP Event from [192.168.1.200] --> M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Content-Length: 0
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:MediaServer:1
It has locked up after a short time, this is after having it up for ten minutes. (It should not be the MaxListenersExceededWarning, that one has been with me since I started with Node-RED in Docker several years ago.)
And it's eating around 50 % CPU, my Pi 5 fan is spinning, I have never heard that except for the first seconds on reboot.
OK, weird. After staying stuck for a while, it suddenly took some commands and then locked up again. Notice the period between the loging:
31 Jul 13:06:38 - [info] [avr-yamaha:Hovedforsterker] UPnP Event from [192.168.1.200] --> M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Content-Length: 0
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:MediaServer:1
31 Jul 13:16:07 - [info] [avr-yamaha:Hovedforsterker] UPnP Event from [192.168.1.200] --> M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Content-Length: 0
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:MediaServer:1
I tried the same upgrade on one of my other Pi's, one of the few without an RFXtrx, and that did not have any problems going to 4.1.0. It has a less complicated flow than the two I have tried before as well, so if you think there's something there I can find time during the weekend to copy the flow on one of the problematic Pi's bit by bit to the working one and find out what makes it stall.
This is most likely linked to the serial port device.
Try running npm rebuild in /data in the container and restart it. This will build/link the native components against the new bookworm libraries in the container.
Done.
docker exec -it 012da016bc2a sh
$ cd /data
$ ls
flows.json flows_cred.json lib node_modules package-lock.json package.json settings.js
$ npm rebuild
rebuilt dependencies successfully
npm notice
npm notice New major version of npm available! 10.8.2 -> 11.5.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.5.2
npm notice To update run: npm install -g [email protected]
npm notice
$ exit
pi@Hytte-Pi:~ $ docker compose down
no configuration file provided: not found
That did not seem to change anything. Same CPU usage, same problem connecting to it.
Sorry, I forgot the serial node doesn't use the normal rebuild any more.
Can you try finding the /data/node_modules/@serialport/bindings-cpp and running npm run rebuild (note the run in the middle)
Done, output was this:
cd /data/node_modules/@serialport/bindings-cpp
$ ls
LICENSE README.md binding.gyp dist node_modules package.json prebuilds src
$ npm run rebuild
> @serialport/[email protected] rebuild
> node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | arm64
gyp info find Python using Python version 3.11.2 found at "/usr/bin/python3"
gyp http GET https://nodejs.org/download/release/v20.19.4/node-v20.19.4-headers.tar.gz
gyp http 200 https://nodejs.org/download/release/v20.19.4/node-v20.19.4-headers.tar.gz
gyp http GET https://nodejs.org/download/release/v20.19.4/SHASUMS256.txt
gyp http 200 https://nodejs.org/download/release/v20.19.4/SHASUMS256.txt
gyp info spawn /usr/bin/python3
gyp info spawn args [
gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'make',
gyp info spawn args '-I',
gyp info spawn args '/data/node_modules/@serialport/bindings-cpp/build/config.gypi',
gyp info spawn args '-I',
gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I',
gyp info spawn args '/usr/src/node-red/.cache/node-gyp/20.19.4/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=/usr/src/node-red/.cache/node-gyp/20.19.4',
gyp info spawn args '-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp',
gyp info spawn args '-Dnode_lib_file=/usr/src/node-red/.cache/node-gyp/20.19.4/<(target_arch)/node.lib',
gyp info spawn args '-Dmodule_root_dir=/data/node_modules/@serialport/bindings-cpp',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/data/node_modules/@serialport/bindings-cpp/build'
CXX(target) Release/obj.target/bindings/src/serialport.o
CXX(target) Release/obj.target/bindings/src/serialport_unix.o
CXX(target) Release/obj.target/bindings/src/poller.o
CXX(target) Release/obj.target/bindings/src/serialport_linux.o
SOLINK_MODULE(target) Release/obj.target/bindings.node
COPY Release/bindings.node
make: Leaving directory '/data/node_modules/@serialport/bindings-cpp/build'
gyp info ok
Then I restarted the container, but the problem was still there.
OK, out of ideas
You'll need to work out which nodes are the likely cause by disabling things.
OK, I found what stopped it here. It's not the serial, it's a node that checks gasonline prices on local stations and send them to Home Assistant to display in graphs. No problems at all in 4.0.9, stops every time in 4.1.0. This is the code:
[{"id":"15c0f11d3fc4b3f7","type":"tab","label":"Bensinpriser","disabled":false,"info":"","env":[]},{"id":"fb3c8172638a8fb7","type":"function","z":"15c0f11d3fc4b3f7","name":"List all stations & create flow.stations","func":"var brands = flow.get(\"brands\");\nvar statsRaw = flow.get(\"stationsRaw\");\n//flow.set(\"Stations\",msg.payload);\n//node.warn( \"pl.length: \" + statsRaw.length);\nvar arr = [];\nvar arr2 = [];\nvar obj2 = {}\nvar msg2 = {}\nvar i = 0;\nvar j = 0;\nfor (i = 0;i < statsRaw.length;i++){\n let obj = {}\n //if (i == 2150)i++;\n //if (i == 2302)i++;\n //if (i == 2305)i++;\n //if (i == 3512)i++;\n obj.id = statsRaw[i].id;\n obj.name = statsRaw[i].name || \"-\"\n // Find brand from brandId\n for (j = 0;j < brands.length;j++){\n if (Number(statsRaw[i].brandId) == Number(brands[j].id)){\n obj.brand = brands[j].name || \"-\"\n obj.logo = brands[j].pictureUrl || \"-\"\n //node.warn(i + \" \" + j + \" \" + brands[j].name);\n break;\n }\n }\n obj.location = statsRaw[i].location || \"-\"\n // Add prices, some stations miss prices, skip these\n //node.warn(\"Add prices\");\n var obj3 = {}\n //console.log(statsRaw[i].prices.length);\n if (statsRaw[i].hasOwnProperty(\"prices\")){ // skip no-price stations\n for (j = 0;j < statsRaw[i].prices.length;j++){\n //node.warn(\"Add prices: \" + i + \" \" + j);\n var ftid = statsRaw[i].prices[j].fuelTypeId;\n if (ftid == 1 && statsRaw[i].prices[j].price != 0){ \n obj3.D = {}\n obj3.D.price = statsRaw[i].prices[j].price;\n obj3.D.lastUpdated = statsRaw[i].prices[j].lastUpdated;\n obj3.D.type = \"D\";\n }\n if (ftid == 2 && statsRaw[i].prices[j].price != 0){ \n obj3.B95 = {}\n obj3.B95.price = statsRaw[i].prices[j].price;\n obj3.B95.lastUpdated = statsRaw[i].prices[j].lastUpdated;\n obj3.B95.type = \"B95\";\n } \n if (ftid == 3 && statsRaw[i].prices[j].price != 0){\n obj3.B98 = {}\n obj3.B98.price = statsRaw[i].prices[j].price;\n obj3.B98.lastUpdated = statsRaw[i].prices[j].lastUpdated;\n obj3.B98.type = \"B98\";\n }\n if (ftid == 4 && statsRaw[i].prices[j].price != 0){\n obj3.FD = {}\n obj3.FD.price = statsRaw[i].prices[j].price;\n obj3.FD.lastUpdated = statsRaw[i].prices[j].lastUpdated;\n obj3.FD.type = \"FD\";\n }\n }\n }//skip to here\n// console.log(obj3);\n obj.prices = obj3;\n\n \n arr.push(obj);\n}\nmsg2.payload = arr;\nflow.set(\"stationsPrepd\",arr);\nreturn msg2;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":20,"wires":[["c1c5aa4d46a165c5"]]},{"id":"c2d1e13e56588a8a","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 163","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":910,"y":120,"wires":[]},{"id":"3ca26b9597ee0d04","type":"http request","z":"15c0f11d3fc4b3f7","name":"API Request","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/brands?stationTypeId=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"X-API-KEY","valueType":"msg","valueValue":"md5Hash"},{"keyType":"other","keyValue":"X-CLIENT-ID","valueType":"other","valueValue":"com.raskebiler.drivstoff.appen.ios"}],"x":130,"y":520,"wires":[["a9261673840aeca8"]]},{"id":"a9261673840aeca8","type":"json","z":"15c0f11d3fc4b3f7","name":"","property":"payload","action":"","pretty":false,"x":130,"y":560,"wires":[["25f7fa92bc718299"]]},{"id":"25f7fa92bc718299","type":"change","z":"15c0f11d3fc4b3f7","name":"set flow.brands","rules":[{"t":"set","p":"brands","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":140,"y":600,"wires":[[]]},{"id":"29b1a398cccaf5a6","type":"change","z":"15c0f11d3fc4b3f7","name":"set.flow.token2","rules":[{"t":"set","p":"token2","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":140,"y":480,"wires":[["3ca26b9597ee0d04"]]},{"id":"095efa33e8e7ca2a","type":"http request","z":"15c0f11d3fc4b3f7","name":"Get Token","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/authorization-sessions","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":130,"y":220,"wires":[["94baceb2b3417947"]]},{"id":"94baceb2b3417947","type":"function","z":"15c0f11d3fc4b3f7","name":"Process Token","func":"//console.log(\"Dieselpriser innhentes\");\nmsg.token = JSON.parse(msg.payload).token;\nmsg.tokenBytes = Buffer.from(msg.token);\nmsg.shiftedBytes = Buffer.concat([msg.tokenBytes.slice(1), msg.tokenBytes.slice(0, 1)]);\nmsg.shiftedToken = msg.shiftedBytes.toString();\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":140,"y":260,"wires":[["bd3b870b7b49c6c2"]]},{"id":"fb42916801687aaf","type":"json","z":"15c0f11d3fc4b3f7","name":"","property":"payload","action":"","pretty":false,"x":110,"y":380,"wires":[["03a73177837e15f9"]]},{"id":"3bc1810bb50310ce","type":"http request","z":"15c0f11d3fc4b3f7","name":"API Request","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.drivstoffappen.no/api/v1/stations?stationTypeId=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"X-API-KEY","valueType":"msg","valueValue":"md5Hash"},{"keyType":"other","keyValue":"X-CLIENT-ID","valueType":"other","valueValue":"com.raskebiler.drivstoff.appen.ios"}],"x":130,"y":340,"wires":[["fb42916801687aaf"]]},{"id":"03a73177837e15f9","type":"change","z":"15c0f11d3fc4b3f7","name":"set flow.stationsRaw","rules":[{"t":"set","p":"stationsRaw","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":160,"y":420,"wires":[["fb3c8172638a8fb7"]]},{"id":"caac60185af71f64","type":"delay","z":"15c0f11d3fc4b3f7","name":"","pauseType":"delay","timeout":"4","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":120,"y":180,"wires":[["095efa33e8e7ca2a"]]},{"id":"c1c5aa4d46a165c5","type":"split","z":"15c0f11d3fc4b3f7","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":80,"wires":[["58e35b7807c9b092","dfc5843690a9476d"]]},{"id":"58e35b7807c9b092","type":"switch","z":"15c0f11d3fc4b3f7","name":"Chosen stations","property":"payload.id","propertyType":"msg","rules":[{"t":"eq","v":"2088","vt":"num"},{"t":"eq","v":"25148","vt":"num"},{"t":"eq","v":"156","vt":"num"},{"t":"eq","v":"167","vt":"num"},{"t":"eq","v":"235","vt":"num"},{"t":"eq","v":"946","vt":"num"},{"t":"eq","v":"815","vt":"num"},{"t":"eq","v":"2263","vt":"num"},{"t":"eq","v":"976","vt":"num"},{"t":"eq","v":"980","vt":"num"},{"t":"eq","v":"25185","vt":"num"},{"t":"eq","v":"273","vt":"num"}],"checkall":"true","repair":false,"outputs":12,"x":420,"y":340,"wires":[["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566","6c56786782c56b51"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"]]},{"id":"b56273e5ea99c3fc","type":"inject","z":"15c0f11d3fc4b3f7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":120,"wires":[["caac60185af71f64"]]},{"id":"c843fa224c3d90f9","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 170","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":460,"wires":[]},{"id":"2268b0ed56350566","type":"function","z":"15c0f11d3fc4b3f7","name":"Convert to message","func":"var kjede = msg.payload.brand;\nvar navn = msg.payload.name;\nconst diff = new Date().getTime() - msg.payload.prices.B95.lastUpdated;\nvar timer = Math.floor(diff/1000/60/60);\nvar minutter = Math.floor((diff/1000/60/60 - timer )*60);\nmsg.topic = kjede + ' ' + navn;\nmsg.payload['pris'] = msg.payload.prices.B95.price;\nmsg.payload['timer'] = timer;\nmsg.payload['minutter'] = minutter;\nmsg.payload['epoch'] = (msg.payload.prices.B95.lastUpdated / 1000);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":340,"wires":[["ca552240d225b271"]]},{"id":"ca552240d225b271","type":"change","z":"15c0f11d3fc4b3f7","name":"Remove unnecessary fields","rules":[{"t":"delete","p":"payload.prices","pt":"msg"},{"t":"delete","p":"payload.id","pt":"msg"},{"t":"delete","p":"payload.logo","pt":"msg"},{"t":"delete","p":"payload.name","pt":"msg"},{"t":"delete","p":"payload.brand","pt":"msg"},{"t":"delete","p":"payload.location","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":460,"wires":[["c843fa224c3d90f9","f61b2fc090523858"]]},{"id":"bd3b870b7b49c6c2","type":"md5","z":"15c0f11d3fc4b3f7","name":"MD5","fieldToHash":"shiftedToken","fieldTypeToHash":"msg","hashField":"md5Hash","hashFieldType":"msg","x":110,"y":300,"wires":[["3bc1810bb50310ce","29b1a398cccaf5a6"]]},{"id":"7c6ba7685c1bbfb6","type":"comment","z":"15c0f11d3fc4b3f7","name":"Show chosen stations with price and update time","info":"","x":260,"y":20,"wires":[]},{"id":"f61b2fc090523858","type":"mqtt out","z":"15c0f11d3fc4b3f7","name":"Send til Home Assistant","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"36159a16.2aa98e","x":790,"y":520,"wires":[]},{"id":"2daf93cf704c36b4","type":"mqtt in","z":"15c0f11d3fc4b3f7","name":"Oppdater bensinpriser ved oppstart av Home Assistant","topic":"Oppdater bensinpriser","qos":"2","datatype":"auto-detect","broker":"36159a16.2aa98e","nl":false,"rap":true,"rh":0,"inputs":0,"x":260,"y":60,"wires":[["caac60185af71f64"]]},{"id":"7b6fe343aff9ceaa","type":"switch","z":"15c0f11d3fc4b3f7","name":"Finne stasjoner på navn","property":"payload.name","propertyType":"msg","rules":[{"t":"cont","v":"Mandal","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":630,"y":140,"wires":[["c2d1e13e56588a8a"]]},{"id":"cd85b29ad0d8b086","type":"switch","z":"15c0f11d3fc4b3f7","name":"Finne stasjoner på adresse","property":"payload.location","propertyType":"msg","rules":[{"t":"cont","v":"Søgne","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":620,"y":200,"wires":[["732f30ae5c2bfea3"]]},{"id":"dfc5843690a9476d","type":"switch","z":"15c0f11d3fc4b3f7","name":"Fjerne rene ladestasjoner","property":"payload.prices","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":790,"y":80,"wires":[["7b6fe343aff9ceaa","cd85b29ad0d8b086"]]},{"id":"732f30ae5c2bfea3","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 172","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":910,"y":160,"wires":[]},{"id":"6c56786782c56b51","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 173","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":400,"wires":[]},{"id":"36159a16.2aa98e","type":"mqtt-broker","name":"Hytte-Pi","broker":"192.168.1.101","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]