Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon! 🥇🥈🥉

Mastiff

VIP
  • Innlegg

    1 270
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    24

Alt skrevet av Mastiff

  1. Jeg fant en måte for å hente ut stasjons-ID, det var lett da jeg fattet det. Det blir for mye data for en debug-node, så da må det jo filtreres. Jeg la til en switch-node som slapp igjennom de som hadde et navn der msg.payload.name inneholdt det stasjonen heter. Jeg har også en som søker på adressen, da kan man dekke et større område. Her er flowen med switchnoden som søker opp stasjoner etter navn og adresse, satt opp med å søke på Mandal som sted og Åseral som navn (der det ligger en Tank-stasjon): [{"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":450,"y":120,"wires":[["c1c5aa4d46a165c5"]]},{"id":"c2d1e13e56588a8a","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 163","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1070,"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":630,"y":60,"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"}],"checkall":"true","repair":false,"outputs":11,"x":540,"y":280,"wires":[["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["f388aaacde3e75dc"],["f388aaacde3e75dc"],[]]},{"id":"b56273e5ea99c3fc","type":"inject","z":"15c0f11d3fc4b3f7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"600","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":750,"y":380,"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":780,"y":280,"wires":[["ca552240d225b271"]]},{"id":"ca552240d225b271","type":"change","z":"15c0f11d3fc4b3f7","name":"Remove unnecessary fields from array","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":490,"y":400,"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":420,"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":"f388aaacde3e75dc","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 171","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":340,"wires":[]},{"id":"7b6fe343aff9ceaa","type":"switch","z":"15c0f11d3fc4b3f7","name":"Finne stasjoner på navn","property":"payload.name","propertyType":"msg","rules":[{"t":"cont","v":"Åseral","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":830,"y":120,"wires":[["c2d1e13e56588a8a"]]},{"id":"cd85b29ad0d8b086","type":"switch","z":"15c0f11d3fc4b3f7","name":"Finne stasjoner på adresse","property":"payload.location","propertyType":"msg","rules":[{"t":"cont","v":"Mandal","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":840,"y":160,"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":870,"y":60,"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":1070,"y":160,"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":""}] Og sånn ser det foreløpig ut i Home Assistant hos meg, jeg har gjort så det er den virkelige tiden siden oppdateringen som teller, at ikke tiden bare hopper framover hvert kvarter. I tillegg har jeg endret punktum til komma i kronebeløpet og laget en statistikkgraf. Jeg satte den i gang i dag morges, så det er ikke mye statistikk ennå, og ingen har endret seg. Til slutt la jeg inn en automasjon som reagerer når laveste bensinpris kommer under 19 kroner. Da får jeg en E-post til mobilen (som jeg alltid har med meg), og Aeotec Z-Wave-sirena i ganga lager skipsklokkelyd. Da er det på tide å kjøre kannene til stasjonen og fylle dem for båten! 😁
  2. Her er den forenklede flowen jeg kom fram til, basert på den @SveinHa laget. Veldig enkel, den henter lista over stasjoner, filtrerer ut de jeg skal ha (hvis noen vil bruke den, kan de endre ID-en i Chosen Stations-switchen til det man trenger) og så skal jeg sende resultatet til Home Assistant som MQTT, til en MQTT-sensor for hver stasjon. Denne skal jeg så sette til å varsle meg i det øyeblikket en av stasjonene går under 19 kroner. Dermed kan jeg fylle de seks kannene til Mad Max når det er grei pris. 😀 [{"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":450,"y":60,"wires":[["c2d1e13e56588a8a","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":730,"y":60,"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":170,"y":460,"wires":[["a9261673840aeca8"]]},{"id":"a9261673840aeca8","type":"json","z":"15c0f11d3fc4b3f7","name":"","property":"payload","action":"","pretty":false,"x":170,"y":500,"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":180,"y":540,"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":180,"y":420,"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":170,"y":160,"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":180,"y":200,"wires":[["bd3b870b7b49c6c2"]]},{"id":"fb42916801687aaf","type":"json","z":"15c0f11d3fc4b3f7","name":"","property":"payload","action":"","pretty":false,"x":150,"y":320,"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":170,"y":280,"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":200,"y":360,"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":160,"y":120,"wires":[["095efa33e8e7ca2a"]]},{"id":"c1c5aa4d46a165c5","type":"split","z":"15c0f11d3fc4b3f7","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":370,"y":180,"wires":[["58e35b7807c9b092"]]},{"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"}],"checkall":"true","repair":false,"outputs":8,"x":540,"y":160,"wires":[["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"],["2268b0ed56350566"]]},{"id":"b56273e5ea99c3fc","type":"inject","z":"15c0f11d3fc4b3f7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/10 6-20 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":60,"wires":[["caac60185af71f64"]]},{"id":"c843fa224c3d90f9","type":"debug","z":"15c0f11d3fc4b3f7","name":"debug 170","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":360,"wires":[]},{"id":"2268b0ed56350566","type":"function","z":"15c0f11d3fc4b3f7","name":"Convert to message","func":"msg.topic = \"Bensinstasjoner\";\nvar 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.payload['stasjon'] = kjede + ' ' + navn;\nmsg.payload['pris'] = msg.payload.prices.B95.price;\nmsg.payload['timer'] = timer;\nmsg.payload['minutter'] = minutter;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":160,"wires":[["ca552240d225b271"]]},{"id":"ca552240d225b271","type":"change","z":"15c0f11d3fc4b3f7","name":"Remove unnecessary fields from array","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":550,"y":280,"wires":[["c843fa224c3d90f9"]]},{"id":"bd3b870b7b49c6c2","type":"md5","z":"15c0f11d3fc4b3f7","name":"MD5","fieldToHash":"shiftedToken","fieldTypeToHash":"msg","hashField":"md5Hash","hashFieldType":"msg","x":150,"y":240,"wires":[["3bc1810bb50310ce","29b1a398cccaf5a6"]]},{"id":"7c6ba7685c1bbfb6","type":"comment","z":"15c0f11d3fc4b3f7","name":"Show chosen stations with price and update time","info":"","x":460,"y":20,"wires":[]}] @SveinHa Det stemmer at de har ladere på Esso i Mandalskrysset. Og så er det McDonald's der også, det er sikkert en ren tilfeldighet... 🤣 Ellers ser jeg at det nye oppsettet ditt gir ekstra felter i arrayen, men mente du å duplisere dem, eller skulle du egentlig ta bort de gamle feltene?
  3. Det gikk faktisk greit! Split-node for å dele opp payloaden fra spørringen, og så filternode som bare slipper igjennom de stasjonene jeg trenger. Dermed har jeg prisen her: payload.prices.B95.price Så da kan jeg bare jobbe videre ut fra det. Igjen takk for hjelpen!
  4. Tusen takk! 😃 Da må jeg bare finne ut av det med bensinen. Jeg lurer på om jeg kanskje kan filtrere på id etter den noden som lager liste over stasjoner. Eller ligger det allerede inne på en måte? For hvis jeg kunne få ut et array med de stasjonene jeg ønsker, er det lett å ta bensinen ut fra den andre objektet der.
  5. @SveinHa Jeg har ikke fått Dashbordgreiene til å virke. Men det er ikke noe problem siden jeg egentlig bare skal bruke første del av flowen, hvis jeg får løst det med diesel vs. bensin og de tre stasjonene. Kunne du vært så snill å sjekke, hvis du har tid og gidder, hva som er id-en til Valand (Driv), Mandalskrysset (Esso) og Vestnes (Tank - altså Vestnes i Mandal, ikke stedet på Vestlandet)?
  6. Det er nok ikke så enkelt, ser det ut til. Den der endrer ikke noe, det er visst subDrivstoffpris(3) som denne bruker (etter litt kopiering fram og tilbake). Og i den fører det altså til feil hvis jeg endrer til B95. Det ville vært lett hvis jeg kunne bare hentet ut payload 156, for eksempel, men det er jo ikke stasjonsnummerne som kommer tilbake, så jeg antar at den payloaden vil endre seg når de gjør endringer i stasjonene på appen. Stasjonsnavnet ser jeg er fordi jeg bare får opp til 1000 i noden, de jeg leter etter, er nok da høyere oppe i rekka. Men det fikser jeg, tror jeg. Denne skulle jeg gjerne hatt til å vise de stasjonene jeg trenger. Hvor justerer jeg det? Den viser bare stasjon 1, som er Lierkroa.
  7. @SveinHa Takk! Bingo, nå fikk jeg det til! Iallfall delvis. Jeg er ute etter bensinpriser, ikke dieselpriser, for jeg vil vite når jeg må kjøre og fylle kannene til båten. Så jeg trenger egentlig ikke den lagringen, jeg skal sende det videre til Homeassistant i MQTT-meldinger. Jeg har endret en stasjon for å teste, og jeg har fått fram dieselprisen på Uno-X i Mandal 😁 Men hva må jeg endre for å få 95-oktansprisen på samme sted? Jeg skjønner at det er B95, mens du ser på D, jeg fatter bare ikke hvor det filtreres. Edit: Jeg tror det gjøres i subflowen "Hjernen", men jeg prøvde åkjøre søk erstatt på prices.D til prices.B95, og det ble feil. Edit 2: Og så er det et par stasjoner jeg ikke finner i det jeg får ned av stajoner, selv om de fins i appen min. Hva kan det være? Edit 3: Jeg har forenklet den ved å fjerne alt jeg ikke trenger, så jeg bare tar ut Trend av subflowene, så skal jeg senere sette det opp til å kjøre MQTT til Homeassistant (jeg bruker alltid Hass som GUI). Da er det bare igjen å få det til bensinprisen og finne de manglende stasjonene.
  8. Takk for hjelpen så langt! Da har jeg fått det til å starte, men med flowen som du har der oppe, får jeg bare "TypeError: Cannot read properties of undefined (reading 'filter')" i loggen, og det gir meg jo ikke så mye. Er du sikker på at flowen er den samme som den du har i bildet der? For jeg får dette bildet, som ikke er helt likt (legg merke til de feilkonfigurerte greiene). Lurer på om det kan mangle et eller annet som ligger i en annen flow? Edit: Feilen kommer fra rekka med sub.Drivstoffpris.
  9. Takk! Det skal jeg prøve!
  10. Problemet er at Node-RED nekter å starte fordi den ikke finner fila. Iallfall tror jeg at det er det den sier i feilmeldingen under oppstart hvis jeg laster flowen din.
  11. @SveinHa Jeg fant feilen. Jeg mangler den persist-fila som du har i ditt system, så Node-RED feiler når den prøver å laste den: Node-RED | 2 Mar 10:12:42 - [red] Uncaught Exception: Node-RED | 2 Mar 10:12:42 - [error] TypeError: Cannot read properties of null (reading 'getMessage') Node-RED | at EventEmitter.PersistOutNode.node.restore (/data/node_modules/node-red-contrib-persist/persist.js:159:40) Node-RED | at EventEmitter.emit (node:events:513:28) Node-RED | at Object.start [as startFlows] (/usr/src/node-red/node_modules/@node-red/runtime/lib/flows/index.js:416:12) Node-RED exited with code 1 Så det feilet etter at jeg hadde lagt inn persist-store. Kanskje jeg kan få det til ved å opprette ei tom fil på riktig sted. Hva heter den fila du har lagret Dieselpriser i? Jeg klarer ikke å åpne noden for å sjekke, og i flowen står det bare navnet på Persist storage, som er Dieselpriser.
  12. @SveinHa Takk! Det skjedde et eller annet da jeg installerte en av nodene, så jeg får ikke i gang NR igjen. Jeg må visst hente tilbake en sikkerhetskopi og begynne på nytt... Mulig at det ikke funker så bra med eldre versjoner av ting og nyere versjoner sammen.
  13. @SveinHa Jeg sliter litt med å få flowen din til å funke. 🤔 Kanskje du kan hjelpe meg litt? Jeg har installert @flowfuse/node-red-dashboard (versjon 2.0) og noen til, og jeg får missing på UI table, UI button, UI text og UI Chart. Jeg finner heller ikke den riktige persist. Hvilke versjoner/noder er det egentlig jeg må finne? Kan det være en annen versjon av Dashboard?
  14. @Andreas L Hva slags folie har du brukt? Kunne vært greit å prøve det her også.
  15. @Einar Vel, hvis ølet er fabrikkøl med butikkstyrke, vil jeg helst ikke at det skal bli kringkastet... Men et godt poløl, som Ringnes julebokk eller et av de fra Kinn eller 7 Fjell eller Lindesnes Bryggerhus (Mandalsbryggeri - Julenek skal være fantastisk i år, jeg må få kjøpt noen bokser og smake), ville det vært greit.
  16. Imponerende! Jeg må finne ut hvorfor jeg ikke får det i kroner, men bare i Euro. Og så må jeg få lagt til en eller annen integrasjon for nettleie, for Å Energi fins det ikke noen integrasjon for.
  17. Sett! Den fungerer, men har du klart å få det til i kroner? Jeg får det bare i Euro.
  18. @christbj Takk! Det der skal jeg få sett på! 😃
  19. Jeg mener å huske fra da Hass brukte Open Z-Wave at man kunne se brukerkodene der. Men jeg sjekket nå (jeg skal programmere en ny lås), og jeg ser ikke en eneste kode noe sted i User Code V1, det er derimot plass til å skrive inn 109 koder. Men alle er tomme. Er det ikke mulig å se koden noe sted her? Edit: Jeg brukte refresh og kunne da se den første koden, det er vel masterkoden. Men ingen av de andre var synlige.
  20. Forresten, hvis jeg setter opp ny lås, vil det hjelpe mot dette å klippe til skjermbeskytter av den typen som brukes på mobiler og klistre på? Eller vil det ikke ha noe å si for en sånn varmeskade?
  21. @psv021 Ikke godt å vite, det er hos leietakerne denne står. Men jeg ser ikke helt hvorfor man skulle bruke Antibac før man har kommet inn døra hjemme. Jeg vet at de hadde stående ei flaske på innsiden, i ganga (det hadde visst de fleste i en viss periode...), men det er heller ikke logisk å smøre seg med Antibac før man skal ut. I tillegg skal det vel godt gjøres å få smurt fingerfett, Antibac og hva som helst annet flere centimeter over tastaturet, det er jo krakelering stornt sett hele veie opp. Så jeg tror det er den sterke sola midt på dagen som har tatt den. Ellers er jeg helt enig, det er en suveren lås på alle andre måter, etter at batterislukingen og diverse andre barnesykdommer ble ryddet ut for noen år siden. Jeg har en Easy Access Easy Touch som jeg bruker i vår del av huset (vi har 1/3 av huset selv, fruen bruker det som pendlerleilighet når hun har tidligvakter på gamlehjemmet, selv bor jeg på hytta), og den er elendig i forhold til ID Lock, iallfall når det gjelder automatiseringen. Ramler ut fra Zigbee minst én gang i uka, så jeg må ta ut et batteri og sette det inn igjen. Men den har en ting ID Lock mangler, muligheten for å bruke fysisk nøkkel. Det er nemlig ikke mer enn den ene døra som går inn til den leiligheten, og uten ei bakdør tar jeg ikke sjansen på å bruke en elektronisk lås.
  22. Sånn ser låsen vår ut. Den er like stygg og har like polerte tall på kodene nedover. Ganske lett å gjette koden, antar jeg. Det blir vel 24 forskjellige muligheter. Jeg tror neppe at Rain-X vil gjøre noe med det...
  23. Oi, jeg skylder leieboeren en unnskyldning... Jeg trodde det var noen der som hadde herpet låsen, som ser ut akkurat som på bildet øverst! 🤯 Den på hytta står vestvendt, og den har ingenting sånt.
  24. Jeg skjønner problemet med ikke å ha lysbrytere. Jeg har brytere til alt av lys (i de siste årene har jeg montert Namron K8 Z-Wave-brytere, som enten bare er knyttet direkte til dimmerne eller har én som er tilknyttet direkte og en som går via systemet (for å få dempet lys på badet mellom 23 og 07, for eksempel), og alt er tydelig merket med Brother merkemaskin. Når det gjelder å flytte fra huset, har jeg tenkt å selge sjappa om fire år, når jeg pensjonerer meg. Så bor jeg på hytta, mens jeg leier en hybel i ei eller annen billig, usentralt bakevje i nærheten (Øyslebø, eller noe sånt). Jeg har allerede solgt ett hus med smarhjem, men det var i 2016, og da var alt mye mer avhengig av PC-styring. Selv om jeg bruker PC i mye av oppsettet mitt også. Men da hadde jeg dokumentert alt fullstendig og skrev i annonsen at jeg kunne være systemadministrator for den som overtok. Alt var så ryddig og fint at Julius ville klart å bruke det. Problemet var at han som kjøpte huset, var mer i retning av Homer Simpson... Det gikk et par uker så ga han opp å skjønne noe og fjernet alt sammen. Men jeg hadde iallfall levert det fra meg i fungerende og brukbar stand, og jeg holdt det jeg lovet i boligannonsen. 😁 Edit: Med dokumentere mener jeg også at en noenlunde kompetent elektriker skal klare å fjerne alt og gjøre huset dumt i løpet av en dag eller to. Men det blir nok et stadig mindre problem, for da jeg hadde min annonse inne med "smarthus" i teksten, var den en av fire annonser på Finn som nevnte det. I øyeblikket ser jeg at det er godt over 100. Og dette med strømstyring for å spare strøm gjorde jo det enda mer interessant...helt til de brødhuene i regjeringen endret strømstøtten, så det ikke lønner seg like mye å kjøre ting etter hvilken time strømmen er billigst. Ufattelig tabbe, etter min mening.
  25. Oppslag i bladet til Huseiernes landsforbund (som jeg om 3-5 år håper å kunne si opp fordi jeg ikke har hus lenger, en pensjonist har bedre ting å bruke pensjonen på enn å betale huslån og vedlikehold!) tyder iallfall på at vi nærmer oss å bli en akseptert del av det gode selskap! https://www.huseierne.no/hus-bolig/tema/boligsalg/nar-smarthuset-skifter-eier
×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.