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

Vinnerliste

Populært innhold

Viser innholdet med mest poeng fra 03. mars 2025 i alle områder

  1. 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?
    2 poeng
  2. Godt poeng, og takk for tipset dette vil gjøre løsningen min enda bedre! En PID-regulering med dynamisk effektstyring kan gi enda mer presis regulering, og siden jeg allerede har effektmåling kan jeg justere effekten gradvis i stedet for bare å slå av og på slik at temperaturen holder seg mer stabil uten at ovnen pendler unødvendig. Dette er absolutt verdt å teste ut og igjen takk for tipset 🙂
    1 poeng
  3. Vet det ble en duplisering nå men tanken er å ta bort de gamle på litt sikt. Nå har jeg begge deler, både den gamle teite varianten og den nye riktigere...
    1 poeng
  4. Bruk smartplugger som gir deg kontroll over strømeffekt og forbruk, også kjøper du den ovnen du vil ha uten å være begrenset av at den må være smart ;-)
    1 poeng
  5. Gjort en quick and dirty fix... Legg inn denne: i stedet for den opprinnelige: [{"id":"c622a1c1b5d187fe","type":"function","z":"2447f70b5f1095ba","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 var obj3 = {}\n let objFt = []\n let ftidStr = \"\";\n if (statsRaw[i].hasOwnProperty(\"prices\")){ // skip no-price stations\n for (j = 0;j < statsRaw[i].prices.length;j++){\n var ftid = statsRaw[i].prices[j].fuelTypeId;\n if (ftid == 1) ftidStr = \"D\";\n else if (ftid == 2) ftidStr = \"B95\";\n else if (ftid == 3) ftidStr = \"B98\";\n else if (ftid == 4) ftidStr = \"FD\";\n else ftidStr = \"-\";\n // New pricestructure 02.03.25\n objFt.push({\"fuelTypeID\":statsRaw[i].prices[j].fuelTypeId,\"type\":ftidStr,\"price\":statsRaw[i].prices[j].price,\"lastUpdated\":statsRaw[i].prices[j].lastUpdated});\n obj3.new = objFt;\n\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":280,"y":560,"wires":[["ee9831abc8e3a182"]]}] Dette gir noen nye felt i flow.stationsPrepd som du igjen kan hente ut med denne: [{"id":"eeb0ef3e1e4c1567","type":"inject","z":"2447f70b5f1095ba","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[2088,25148,2263]","payloadType":"json","x":620,"y":1220,"wires":[["0d4e5a87fd3822c7"]]},{"id":"0d4e5a87fd3822c7","type":"function","z":"2447f70b5f1095ba","name":"List valgte stasjoner","func":"let selected = msg.payload;\nlet stats = flow.get(\"stationsPrepd\");\nlet arr = []\n\nfor (let i in selected){\n for (let j in stats){\n if (stats[j].id == selected[i]){\n for (let k in stats[j].prices.new){\n// node.warn(stats[j].name);\n// node.warn(stats[j].prices.new[k].type);\n// node.warn(stats[j].prices.new[k].price);\n// let dt = new Date(stats[j].prices.new[k].lastUpdated);\n// node.warn(dt.toLocaleString(\"nb-NO\"));\n }\n arr.push(stats[j]);\n }\n \n }\n}\n\nmsg.payload = arr;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":860,"y":1220,"wires":[["88658fb3f9f8c6ae"]]},{"id":"88658fb3f9f8c6ae","type":"debug","z":"2447f70b5f1095ba","name":"debug 14","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1050,"y":1220,"wires":[]}] ...og hvis du fjerner kommentar (//) fra de 5 linjene i "List valgte stasjoner" så kommer resultatet direkte i loggen også... Edit#2: Da skal de være oppegående... Ser Esso Mandalskrysset har en del priser som ikke dukker opp i drivstoffappen, sannsynligvis strøm...
    1 poeng
Vinnerlisten er satt til Oslo/GMT+02:00
×
×
  • 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.