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

Vinnerliste

Populært innhold

Viser innholdet med mest poeng siden 08. juli 2024 i Innlegg

  1. Etter stadige innbrudd med påfølgande redusert kjeksbeholdning vart det i dag konkludert med at dette ikkje kan fortsette. Fleire tiltak vart vurdert, før konklusjonen vart å montere Aqara dørsensor! Testa med god effekt, så får vi sjå framover om tjuven ved neste anledning får ein overraskelse 😁 Snapchat-532688679.mp4
    12 poeng
  2. Jeg har laget min første Home Assistant-integrasjon - Google pollen! Jeg kan egentlig ikke Python, men kan programmere i andre språk. Så jeg klarer å lese og forstå Python, men ikke å «skrive det fra bunn». Ble ganske imponert over Github Copilot, som ganske kjapt og enkelt lagde en fungerende kode som jeg kunne bruke som utgangspunkt! Koden ligger her: https://github.com/svenove/home-assistant-google-pollen
    7 poeng
  3. Da har jeg tatt avskjed med HomeSeer etter snart 20 år til fordel for Home Assistant. Jeg må si at jeg er mektig imponert over hvor enkelt integrasjoner bare popper inn. Har nå fått flyttet over alle Z-wave, Zigbee og RFXCom, samt fått opp Reolink kameraer, varmepumper, Nissan-tilkobling, Tibber, Yr, Sonos, TP-link mesh, Yale dørlås og en del andre Wi-Fi enheter jeg har i huset. Har ikke hatt noen problemer med å få dette satt opp overhodet. Z-wave var så enkelt som å flytte over USB-stick'en, siden den inneholder hele nettverket. For Zigbee valgte jeg å kjøpe en ny USB-stick (Sonoff 3.0) og legge til device på nytt inn i ZHA-integrasjonen. Dermed kunne den gamle PC'en fortsatt styre de enhetene jeg ikke hadde fått flyttet over. Skal sies at det gamle Zigbee-oppsettet kjørte på en Raspberry Pi med en Conbee stick. Kommer ikke til å savne noen av delene. Nå kjører alt på en Gigabyte Brix GB-BRR5H-4500 med 16 GB RAM (tenker å oppgradere til 32). Så nå er det bare å bygge noen kule dashboard og se på flere muligheter for å koble sammen enheter i forskjellige automasjoner.
    7 poeng
  4. Hei! Det jobbes kontinuerlig med oppdateringer for komfyrvakt. Komfyrvakten følger også Zigbee standard så langt det lar seg gjøre. Da komfyrvakt ikke har noen egen standard i Zigbee 3.0 må det dessverre noen egne tilpasninger til for å få dette så nært optimalt som mulig. Når det er sagt så er det hovedsakelig rapportering som er fokus for produktet (sensortemperatur, strømforbruk, alarm og relé status). Kontroll av selve reléet er begrenset til kun å kunne slå dette av via Zigbee protokollen (krav for sertifisering - Vi har også vurdert å fjerne dette i fremtidig oppdatering og kun ha rapportering om status). Det jobbes med en firmware oppdatering for produktet som skal rette kWt oppdateringen (Rapporteres kun 1 gang pr døgn via Zigbee) samt generelle stabilitetsendringer. Vi jobber også med en OTA oppdateringsløsning via BT for de plattformer som ikke har OTA via Zigbee innebygget som gjør det enklere å få de nyeste oppdateringene på produktet. Vi har tidligere vært i dialog med Nabucasa direkte for en "Works with Home Assistant" sertifisering uten at vi kom i mål den gangen. Det er en del praktiske ting samt kostnadsspørsmål som må på plass. Når det er sagt så tar jeg dette absolutt med videre. Hva er deres foretrukne løsning for integrasjon i HA? Z2M eller ZHA?
    6 poeng
  5. Dagbladet kan ta seg en bolle, jeg gjør så godt jeg kan!!
    6 poeng
  6. Har gjort veldig mye de siste par mnd: * Migrert alle serverne mine fra ESXi 7.0 til Proxmox VE (takk for den, Broadcom! 😞). Det gikk overraskende smertefritt, siden jeg hadde tilgang på en ekstra PC som kunne brukes. La da til ESXi-serveren i Proxmox og kunne bare ta en "import" av hver enkelt VM. Så var det bare å endre litt på nettverksoppsettet, fjerne VMtools og installere QEMU i stedet, så var det i boks! * Migrert fra Xeoma til Frigate for kameraene mine. Frigate kjører i en Proxmox LXC (Xeoma var en egen Ubuntu VM) og den får tilgang til å bruke iGPU, slik at CPU-belastningen er minimal (3 kamera). Jeg har også fått aktivert varsling ved detekterte personer i carporten på natt/borte (mot varsel ved bevegelse i Xeoma - blafrende plastposer, osv ga mange falske varsler!). * Migrert Mosquitto og Zigbee2MQTT til LXC. Disse kjørte før på samme VM som HomeSeer, men nå har jeg satt opp en Proxmox LXC til hver av dem i stedet. Da slipper jeg nedetid på disse tingene ved restart av HS-VMen f.eks. * Oppgradert fra HS3 til HS4. Det var vel litt "på overtid", 5 år etter jeg kjøpte oppgraderingslisens... Det gikk dessverre ikke helt smertefritt, for jeg kom meg ikke forbi lisens-aktiveringssiden (første siden man får opp etter oppgradering). Meldte supportsak til HS også, uten at det førte noen vei. Snapshot i Proxmox funker heldigvis fint da, så jeg kunne lett rulle tilbake til HS3. Etter et par kvelder så prøvde jeg nest nyeste versjon av HS4 - da funket det! 🙂 Utover det så merker jeg at særlig HSTouch er mye raskere/stabil med HS4 enn det det var med HS3. Og mscMQTT er også mer stabilt i nyeste versjon. * Fortsetter migreringen fra HomeSeer til Home Assistant. Det meste av ZigBee, Chromecasts, 433 MHz-utstyr er nå migrert over og styres fra HASS. Z-wave gjenstår, men der må jeg flytte ALT samtidig (i motsetning til ZigBee, som via Z2M kan styres fra begge systemer samtidig). Så her er det nok noen uker enda før jeg er i mål. 😛
    6 poeng
  7. Jeg vil bare fremsnakke kundeservice fra Fibaro her. Jeg hadde surret bort noen monteringsdetaljer for noen av mine enheter og spurte på support om det er mulig å få tak i dem. Det kom svar etter en dag, og de bare sendte meg det jeg trengte. Helt gratis, og fri frakt. Riktignok ganske enkle plastdetaljer, men det kostet jo å behandle det og betale frakt. Så i tillegg til at Fibaro er de mest driftssikre komponentene i mine systemer, så har de også en kundebehandling som man ikke er vant til i 2024. Det er til å bli glad av, selv om det nå begynner å bli nok regnvær. Det kan de nok ikke gjøre noe med. MVH Einar Sjaavik
    6 poeng
  8. Når en har en meget komplisert plen på 750 m2 og robotklipper uten sporing så dukker der jo fort opp behov for litt snekring på gutterommet... Har hatt meg en del turer rundt i hagen for å lete etter klipperen som har satt seg fast en eller annen plass så litt hjelp til å lete og, ikke minst, se hvilke områder som klippes er ganske greit... Nå har jeg jobbet noe tid med dette og det er på tide å dokumentere litt av prosessen i tilfelle andre vil gjøre noe lignende... 1: Skaffe kart over hagen. Her har jeg brukt kommunekart.com og "Tegn i kart" for å lage et omriss av plenen. Etter omrisset er laget lagres det til fil i kml format. For enkelhets skyld konverterer jeg denne til .geojson format i online konverteringsprogram. Pr i dag ser omrisset slik ut i kommunekart.com: .geojson filen importeres manuelt i Node-RED. Dette er jo en mer eller mindre engangs sak... 2: Innhente GPS-data og sende til MQTT. ESP32 med NEO-6 GPS koster "next to nothing" og er en grei løsning for dette bruket. Har slitt en del med Arduino-IDE så derfor havnet jeg på MicroPython denne gang. Siden jeg har 2 separate prosesser gående samtidig har jeg valgt å bruke uasyncio for multitasking. Task#1: Innhente data fra GPS og lagre posisjonsdata i fil. Task#2: På gitte intervall, pt hvert 30 sek, koble på wlan og sende data fra datafilen til MQTT broker. I hagen min er der noen wlan dødsoner og derfor nyttig å gjøre opplasting litt i rykk og napp når wlan er tilgjengelig. 3: Behandle GPS-data i Node-RED. Etterhvert som data mottas fra MQTT lagres de i et array of objects i flow-variabel og deretter tegnes det opp i en chart node. Array med data begrenses til et passende antall posisjoner, pt. 3000. Eldre data slettes automatisk. Prototype GPS-tracker: Første sporing: Node-RED: [{"id":"7b7be9e90c83eaff","type":"group","z":"c0e718067b85a8cc","name":"Lagre GPS-data","style":{"label":true},"nodes":["43d583213bfaa02f","2218191fe090798b","55b21eb55f283b61","8c73af56d7fdc323","36f55a2e222b2326","c466d510d0476f0e","93ac548a0bcda12d"],"x":24,"y":779,"w":832,"h":192},{"id":"43d583213bfaa02f","type":"mqtt in","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"","topic":"Ambrogio/Robertino/pos","qos":"2","datatype":"auto-detect","broker":"6db118ed1b0c56de","nl":false,"rap":true,"rh":0,"inputs":0,"x":160,"y":830,"wires":[["2218191fe090798b","55b21eb55f283b61","36f55a2e222b2326"]]},{"id":"2218191fe090798b","type":"show-value","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"","path":"","x":160,"y":880,"wires":[[]]},{"id":"55b21eb55f283b61","type":"function","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"GPS Tracker position","func":"let xMax = 5.229248;\nlet xMin = 5.228394;\nlet yMax = 59.392793;\nlet yMin = 59.392350;\nconst numpos = 4000;\nlet arr = flow.get(\"Robertino\") || []\nlet arr2 = []\n//node.warn(msg.payload);\nlet data = msg.payload;\n//var temp=data.split(\",\");\nlet msg2 = {}\n//node.warn(data);\n\n// lon/lat har format ddmm.mmmmmm\nlet lat = Number(data.lat) / 100;\n//node.warn(lat)\nlet intpart = parseInt(lat);\nlet fractpart = lat - intpart;\nlat = intpart + (fractpart * 1.666667);\n//node.warn(lat)\n\nlet lon = Number(data.lon) / 100;\nintpart = parseInt(lon);\nfractpart = lon - intpart;\nlon = intpart + (fractpart * 1.666667);\n\nlet time = data.utc;\n//node.warn(lat);\n//node.warn(lon);\n\n// Ignorer verdier utenfor kartet\nif (lat < yMax && lat > yMin && lon < xMax && lon > xMin) arr.push({\"lat\": lat, \"lon\": lon, \"UTC\": time});\n\n// Remove old positions\nlet n = arr.length;\n//node.warn(n);\narr2 = arr.slice(n - numpos);\n\n//node.warn(arr);\n//node.warn(arr2);\nflow.set(\"Robertino\", arr2);\nmsg.payload = \" \";\nmsg2.topic = \"Robertino\";\nmsg2.payload = time;\nreturn [msg, msg2];","outputs":2,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":830,"wires":[["c466d510d0476f0e"],["8c73af56d7fdc323"]]},{"id":"8c73af56d7fdc323","type":"ui_text","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","group":"a7f439d7b1e0bbd4","order":9,"width":"8","height":"1","name":"Robertino last track","label":"{{msg.topic}} last trck","format":"<font size=6>{{msg.payload}}<font size=3> UTC","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":740,"y":870,"wires":[]},{"id":"36f55a2e222b2326","type":"debug","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"debug 180","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"","statusType":"counter","x":160,"y":930,"wires":[]},{"id":"c466d510d0476f0e","type":"function","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"Reset delay","func":"//msg.delay = 600000;\nvar m1 = {reset:true};\nreturn [[m1,msg]];","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":820,"wires":[["93ac548a0bcda12d"]]},{"id":"93ac548a0bcda12d","type":"delay","z":"c0e718067b85a8cc","g":"7b7be9e90c83eaff","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":770,"y":820,"wires":[["3f628673e320b6ef"]]},{"id":"6db118ed1b0c56de","type":"mqtt-broker","name":"DaleMQTT","broker":"172.16.0.94","port":"1883","clientid":"34567890","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":false,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a7f439d7b1e0bbd4","type":"ui_group","name":"Status","tab":"55b4bf40cf1e815d","order":2,"disp":true,"width":"8","collapse":false,"className":""},{"id":"55b4bf40cf1e815d","type":"ui_tab","name":"Ambrogios","icon":"android","order":23,"disabled":false,"hidden":false},{"id":"af4caa710bbb0c2a","type":"group","z":"c0e718067b85a8cc","name":"Presenter GPS data i chart","style":{"label":true},"nodes":["8e291ee416e96572","597d06bd03195022","6969dbab26c1048b","51404847151e1696","3f628673e320b6ef"],"x":24,"y":999,"w":742,"h":112},{"id":"8e291ee416e96572","type":"inject","z":"c0e718067b85a8cc","g":"af4caa710bbb0c2a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":140,"y":1050,"wires":[["3f628673e320b6ef"]]},{"id":"597d06bd03195022","type":"function","z":"c0e718067b85a8cc","g":"af4caa710bbb0c2a","name":"Read temp positions & parse","func":"//let poss = flow.get(\"temp\");\nlet poss = flow.get(\"Robertino\") || []\nvar data = []\nvar data0 = []\nvar data1 = []\nvar data2 = []\nvar data3 = []\nlet j = 0;\n//for (let i in poss.data[0].attributes.positions){\n// data0.push({x: poss.data[0].attributes.positions[i].longitude,y:poss.data[0].attributes.positions[i].latitude});\nfor (let i in poss){\n if (poss[i].lat > 59 && poss[i].lon > 5) data0.push({x: poss[i].lon,y:poss[i].lat});\n// node.warn(poss.data[0].attributes.positions[i].longitude);\nj = i;\n}\n// Ta vare på siste pos for oransje markering plott (nåværende pos)\n//data2.push({x: poss.data[0].attributes.positions[0].longitude,y:poss.data[0].attributes.positions[0].latitude});\n//data2.push({x: poss.data[0].attributes.positions[1].longitude,y:poss.data[0].attributes.positions[1].latitude});\ndata2.push({x: poss[j-3].lon,y:poss[j-3].lat});\ndata2.push({x: poss[j-2].lon,y:poss[j-2].lat});\ndata2.push({x: poss[j-1].lon,y:poss[j-1].lat});\ndata2.push({x: poss[j].lon,y:poss[j].lat});\n\n// Omriss av plenen\ndata1 = flow.get(\"plen\");\n// Omriss av elendom\ndata3 = flow.get(\"eiendom\");\n\n\ndata[1] = data1; // Lawnlimits\ndata[3] = data3; // Lawnlimits\ndata[2] = data0; // Track\ndata[0] = data2; // Last track\n//node.warn(data[2]);\n\nmsg.payload = [{\n \"series\": [\"A\",\"B\",\"C\",\"D\"],\n \"xAxisID\": 'custom-x-axis',\n \"yAxisID\": 'custom-y-axis',\n \"data\": data,\n \"labels\": [\"\"]\n}]\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":1040,"wires":[["51404847151e1696"]]},{"id":"6969dbab26c1048b","type":"function","z":"c0e718067b85a8cc","g":"af4caa710bbb0c2a","name":"modify chart options","func":"/*let centX = 5.1372;//2285;\nlet xW = 0.0005;\nlet xH = 0.0005;\nlet centY = 59.2355;//3924;\nlet xMax = centX + xW;\nlet xMin = centX - xW;\nlet yMax = centY + xH;\nlet yMin = centY - xH;\n*/\nlet xMax = 5.229248;\nlet xMin = 5.228394;\nlet yMax = 59.392793;\nlet yMin = 59.392350;\n\n\nlet gridcolors = 'rgba(255, 160, 0, 0.3)'\nmsg.ui_control = {\n options: {\n legend: {\n display: false\n },\n tooltips: {\n enabled: false\n },\n scales: {\n xAxes: [{\n type: 'linear',\n id: 'custom-x-axis',\n position:'bottom',\n padding:100,\n gridLines:{\n color:gridcolors,\n zeroLineColor:'rgba(123, 113, 113, 0.75)',\n tickMarkLength:7,\n drawTicks:false\n },\n ticks: {\n fontColor:\"#ccc\",\n max: xMax,\n min: xMin,\n stepSize: 0.0001\n \n }\n }],\n yAxes: [{\n id: 'custom-y-axis',\n \n gridLines:{\n color:gridcolors,\n zeroLineColor:'red',\n tickMarkLength:5,\n drawTicks:false\n },\n ticks: {\n fontColor:\"#ccc\",\n max: yMax,\n min: yMin,\n stepSize: 0.0001\n }\n }]\n }\n }\n}\ndelete msg.payload\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":1070,"wires":[["51404847151e1696"]]},{"id":"51404847151e1696","type":"ui_chart","z":"c0e718067b85a8cc","g":"af4caa710bbb0c2a","name":"Plen","group":"7ab0161dbb92ab3f","order":3,"width":"30","height":"20","label":"","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"1","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#ff7f00","#00ff00","#8585fa","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":690,"y":1040,"wires":[[]]},{"id":"3f628673e320b6ef","type":"junction","z":"c0e718067b85a8cc","g":"af4caa710bbb0c2a","x":280,"y":1050,"wires":[["597d06bd03195022","6969dbab26c1048b"]]},{"id":"7ab0161dbb92ab3f","type":"ui_group","name":"Map","tab":"55b4bf40cf1e815d","order":3,"disp":true,"width":"32","collapse":false,"className":""},{"id":"f51cf63d67a5a2e5","type":"group","z":"c0e718067b85a8cc","name":"Les geojson fil og lagre koordinater i flow.plen","style":{"label":true},"nodes":["7a8aba7d1b2233c3","c3ac6155687bd8b2","7a3a31186dd532c5","65861ab97117862e"],"x":24,"y":1139,"w":1012,"h":82},{"id":"7a8aba7d1b2233c3","type":"json","z":"c0e718067b85a8cc","g":"f51cf63d67a5a2e5","name":"","property":"payload","action":"","pretty":false,"x":670,"y":1180,"wires":[["c3ac6155687bd8b2"]]},{"id":"c3ac6155687bd8b2","type":"function","z":"c0e718067b85a8cc","g":"f51cf63d67a5a2e5","name":"Plukk ut pos fra fil og lagre i flow","func":"var plen = []\nvar eiendom = []\n\nfor (var i in msg.payload.features[0].geometry.coordinates){\n let tempobj = {x: msg.payload.features[0].geometry.coordinates[i][0] ,y: msg.payload.features[0].geometry.coordinates[i][1]};\n plen.push(tempobj);\n}\n//payload.features[1].geometry.coordinates[0][0]\n//payload.features[1].geometry.coordinates[0][9]\n//payload.features[1].geometry.coordinates[0][9][0]\n//payload.features[1].geometry.coordinates[0][9][1]\nfor (var i in msg.payload.features[1].geometry.coordinates[0]) {\n let tempobj = { x: msg.payload.features[1].geometry.coordinates[0][i][0], y: msg.payload.features[1].geometry.coordinates[0][i][1] };\n eiendom.push(tempobj);\n}\n//node.warn(plen);\nflow.set(\"plen\", plen);\nflow.set(\"eiendom\", eiendom);\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":880,"y":1180,"wires":[["3f628673e320b6ef"]]},{"id":"7a3a31186dd532c5","type":"file in","z":"c0e718067b85a8cc","g":"f51cf63d67a5a2e5","name":"","filename":"/home/nodered/PlenV4Eiendom.geojson","filenameType":"str","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":390,"y":1180,"wires":[["7a8aba7d1b2233c3"]]},{"id":"65861ab97117862e","type":"inject","z":"c0e718067b85a8cc","g":"f51cf63d67a5a2e5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":1180,"wires":[["7a3a31186dd532c5"]]}] uPython programmet: import ubinascii import machine from umqtt.simple import MQTTClient from machine import UART import network, utime, machine import os import uasyncio import json uart = UART(2, 9600) SSID = "WLAN-SSID" SSID_PASSWORD = "WLAN-PWD" filenum = 0 SERVER = "172.16.0.94" CLIENT_ID = ubinascii.hexlify(machine.unique_id()) TOPIC = "Ambrogio/Robertino/pos" gps_target = "$GPGGA" gps_target = gps_target.encode('ASCII') async def readAndSend(): global filenum while True: await uasyncio.sleep_ms(1000 * 30) #Run every 30 sec sta_if = network.WLAN(network.STA_IF) if not sta_if.isconnected(): print('connecting to network...') sta_if.active(True) sta_if.connect(SSID, SSID_PASSWORD) while not sta_if.isconnected(): print("Attempting to connect....") await uasyncio.sleep_ms(1000) print('Connected! Network config:', sta_if.ifconfig()) mqttClient = MQTTClient(CLIENT_ID, SERVER, keepalive=60) mqttClient.connect() print(f"Connected to MQTT Broker: {SERVER}") locfilenum = filenum # Store current filenumber filenum = filenum + 1 # New filenumber for logging filename = 'data'+str(locfilenum)+'.txt' if filename in os.listdir(): print('Found '+ filename) f = open(filename, 'r') line = f.readline() while line != "": print(filename+", MQTT:"+line.strip()) mqttClient.publish(TOPIC, str(line)) await uasyncio.sleep_ms(500) line = f.readline() print("file finished") print("Removing ", filename) os.remove(filename) mqttClient.disconnect() print("Disconnect from wlan") sta_if.disconnect() def left(s, amount): return s[:amount] async def main(): global filenum print("Cleanup old files...") # Delete all existing data files on startup for f in os.listdir(): if left(f, 4) == "data": print("Deleting: ", f) os.remove(f) print("All data files deleted.") while True: if uart.any() > 0: await uasyncio.sleep_ms(100) gps_msg = uart.readline() if len(gps_msg) >= 60: gps_type = left(gps_msg, 6) if gps_type == gps_target: utc = gps_msg[7:13] lat = gps_msg[17:27] lon = gps_msg[30:41] newmsg = {} newmsg['utc'] = utc newmsg['lat'] = lat newmsg['lon'] = lon jmsg = json.dumps(newmsg) # Create JSON object for datafile #if lat >= '5923' and lat <= '5924' and lon >= '513' and lon <= '514': filename = 'data'+str(filenum)+'.txt' print(filename+", GPS:"+jmsg) f = open(filename, 'a') f.write(jmsg) f.write("\r\n") f.close() await uasyncio.sleep_ms(200) # Start hele sulamitten event_loop = uasyncio.get_event_loop() event_loop.create_task(main()) event_loop.create_task(readAndSend()) event_loop.run_forever() ESP32 forsynes pt via USB fra en batteribank og GPS forsynes fra Vin og GND pinnene på ESP32. GPS-TX går til ESP-RX2, GPS-RX til ESP-TX2. Har sett i minst ett eksempel på nett at NEO6 GPSen forsynes fra 3.3V men spec sier at NEO6 skal ha 3.7-5V. Prøvde først med 3.3V og det virket men fikk en del mangelfulle setninger fra GPS så med 5V gikk det myyyyye bedre... Så langt ha jeg brukt en 10Ah batteribank og den holder liv i greiene i mange døgn men skal hacke meg inn på strømforsyningen i klipperen etterhvert...
    5 poeng
  9. ...og så kan det jo være greit å ha i bakhånd litt top-notch medisinsk verneutstyr i tilfelle media slipper ut et nytt virus som vi må beskytte oss mot:
    5 poeng
  10. Høstens første frost krever alltid litt ekstra arbeid så det er greit å få et varsel noen dager i forkant. Hjul på bil må skiftes, vannslange må innendørs, utekrane må sjekkes at den er tom for vann og campingvogn sine vannbeholdere må tømmes. Så da er et varsel i HA laget slik som dette Det er kun et lett synlig bilde som har en betingelse for synlighet. Først laget jeg en sensor som viser laveste temperatur meldt de nærmeste dagene. - template: - trigger: - trigger: state entity_id: weather.orstad_utsyn action: - action: weather.get_forecasts data: type: daily target: entity_id: weather.orstad_utsyn response_variable: wd sensor: - unique_id: laveste_temperatur_framover name: "Laveste temperatur framover" unit_of_measurement: "°C" state: "{{ [state_attr('weather.orstad_utsyn', 'temperature')|float(0), (wd['weather.orstad_utsyn'].forecast | rejectattr('templow', 'undefined') | map(attribute='templow')|list|min)]|min|round(1) }}" Deretter en binær sensor som bruker laveste temperatur sammen med måned. Jeg trenger ikke varsel om høstens første frost i desember til mai. -template: - binary_sensor: - unique_id: bbb82639-7432-4f3f-8950-a5c860a6ede0 name: frostvarsel state: "{{ states('sensor.laveste_temperatur_framover')|float < 2 and (now().month == 9 or now().month == 10 or now().month == 11) }}" Selve kortet er lagd som dette
    5 poeng
  11. Vi åpner nå tre nye forum for direkte kommunikasjon med smarthus leverandørene! Vi har snakket med tre av de store smarthus leverandørene og signalisert et behov for enkelt å kunne kontakte kompetente personer hos dem for å få svar på mer kompliserte tekniske spørsmål. Det viste seg at de også hadde et ønske om å kunne få ryddet opp i en del feilinformasjon og myter som flyter rundt i sosiale fora. Dette er organisert rundt et eget forum for hver leverandør der det som vanlig er oss forumdeltakere som spør og svarer på det vi kan, men i tillegg vil det være representanter for leverandøren der med egne brukere som kan gi fasit eller korreksjoner. Leverandørenes brukere vil være klart merket så det vil ikke være tvil om hvem du får svar fra. Hvert forum vil ha en underkategori for spørsmål og svar og en for generell diskusjon og kommunikasjon. Forumene finner du her: https://www.hjemmeautomasjon.no/forums/forum/110-leverandører/ Vis full oppføring
    5 poeng
  12. Det er ihvertfall mer enn dere har fått til på de 6 årene integrasjonen har eksistert 🙂
    5 poeng
  13. Ok nå har jeg lekt ganske mye. Laget meg en template sensor som bruker Nordpool input, og så har jeg satt opp en gjeng med hjelpere for å ha data om nettpriser for dag/natt, moms, strømselskap osv osv. Alt kan nå konfigureres via GUI, eneste som blir litt massivt er selve template sensoren men den setter man jo opp bare en gang. Synes det ble ganske bra! Nå skal jeg bare se over litt tid om det fungerer stabilt.
    4 poeng
  14. "Feilen" ligger i betingelsene dine: Når sikringen har gått vil garasjelyset aldri kunne bli "OFF". Dermed sørger denne linja: ... for å trigge eventet hvert eneste sekund. "For at least XX" er skummelt å bruke som første betingelse. Bruk heller "for exactly 10 m", så slipper du problemet 🙂 Som en ekstra betingelse går det som oftest utmerket å bruke "for at least". Se FAQ nederst i HS skolen del 7:
    4 poeng
  15. Da er jeg i boks med fjernstyring av Alde 3000 vannbåren varme og fjernstyring av stigetrinn i bobilen. Kabler var greie å komme til. I boksen er en RPi 3B+ og 2x4 rele som styres av Node-RED med Node-RED Dashboard som brukergrensesnitt. Som en bonus fikk jeg også med meg zigbee2mqtt, Mosquitto og en G-sensor som forteller meg om bilen står beint. Det hele plassert i custom designet 3D printet boks:
    4 poeng
  16. Det er ingenting som prinsipelt skiller FutureHome's forretningspraksis fra alle andre som selger sky-avhengig hardware. Det er helt irrelevant om abonnementskostnaden var 0, 10, 100 eller 1000 kroner måneden den dagen det viser seg at det er for lite til å opprettholde skytjenesten. Det er komplett urealistisk å tro at noen klarer å selge slike tjenester til høy nok pris til å garantere evig drift. Derfor vil du som kunde på et eller annet tidspunkt oppleve at prisen øker drastisk og/eller at tjenesten faller bort. Alternativet er helt åpenbart. Ikke kjøp hardware som er avhengig av skytjenster. Skal FutureHome kritiseres så er det mer interessant å se på markedsføringen av de komponenter som evt viser seg å ikke fungere uten sky. Dersom de var annonsert som åpne, eller på en måte som må forstås som åpne ("zigbee" f.eks), så er jo markedsføringen misvisende. Men det er uansett nokså poengløst å angripe det etter at konkursen er et faktum... Se heller på hva de andre som ennå ikke er konkurs holder på med.
    3 poeng
  17. Bare til info: Jeg har syv kameraer og flere hundre enheter koblet til min Rpi5 (som var tidligere en Rpi4). Både på Rpi4 og Rpi5 kjørte dette med ca 1% prosessorutnyttelse og på Rpi5 er det så lite belastning av vifta sjelden går. En PC er sikker fint, men en trenger ikke det hvis det kun er HA som skal kjøre på den. Med tanke på oppetid så anbefaler jeg dedikert hardware. Og gjerne kjøp to Rpi, SSD og zigbee/zwave pinner så har en noe på lager og kan ta dette i bruk umiddelbart hvis noe skulle svikte. Men dette blir jo veldig avhengig av hvor langt en strekker det. Sørger en for at lys og varme kan styres manuelt så er det også lettere å være uten automasjon en uke mens en venter på postgang og nye enheter.
    3 poeng
  18. Såpe dispenseren på kjøkkenvasken er ganske utilgjengelig, så det er vanskelig å se når den er full eller tom. Laget derfor en såpe sensor som sier ifra om den snart er tom, eller når den er full slik at det ikke renner over når den fylles på.
    3 poeng
  19. Svarer meg selv i tilfelle noen andre skulle være i samme situasjon. Har kjørt både ZHA og Z2M samtidig med samme koordinator. Var ikke klar over at dette ikke var lurt. Jeg har kvittet meg helt med ZHA og kjører alle enhetene mine gjennom Z2M. Oppdateringen startet umiddelbart etter dette.
    3 poeng
  20. Fil med oppdatert Guide ligger vedlagt (Beklager feilen der!) En fullverdig oppdateringslogg kommer så fort den er klar, jeg ville dele den med dere så fort vi fikk filene oversendt! I korte trekk: - Oppdatering av kildekode til nyeste versjon - Endring fra Zigbee End device til Router device - Rettet feil som resulterte i Zigbee drop - Endret så komfyrvakten kan slås av/på via Zigbee Verdiene du har unknown på i oversiken i HA rapporterer ikke komfyrvakten noe data på. Vakten rapporterer: - Effekt (W) - kWh - Temperatur (Når vakten er aktiv og trekker strøm). Rundt den nye muligheten til å kunne slå på relé via Zigbee så har vi fått det vurdert at dette er innenfor kravene for sikkerhet. I tilfellet hvor vakten har slått ut og den forsøkes å slås på igjen vil den igjen slå ut så lenge det er en fare tilstede. 140279X-Firmware.zip
    3 poeng
  21. Her er kode for å hente inn pris for hver time i dag og i morgen. Den henter også inn pris for aktuell time, men det bruker jeg ikke til noe. Jeg er kun interessert i attributten "prices". Hvis du skal bruke aktuell pris i sensorens tilstand så ville jeg satt scan_interval til en mye høyere verdi, feks en gang i døgnet. Og heller trigget en oppdatering med en automasjon som kjører hver hele time med action: homeassistant.update_entity data: entity_id: - sensor.hvakosterstrommen_price_today command_line: - sensor: scan_interval: 1800 command: > echo "{\"prices\":" $( curl -s 'https://www.hvakosterstrommen.no/api/v1/prices/{{ now().strftime('%Y/%m-%d') }}_NO2.json' ) "}" name: "hvakosterstrommen_price_today" value_template: "{{ (value_json.prices | selectattr('time_start', 'match', now().strftime('%Y-%m-%dT%H:00')) | list | first)['NOK_per_kWh'] }}" unit_of_measurement: "NOK/kWh" json_attributes: - prices - sensor: scan_interval: 1800 command: > echo "{\"prices\":" $( curl -s 'https://www.hvakosterstrommen.no/api/v1/prices/{{ (now()+timedelta(days=1)).strftime('%Y/%m-%d') }}_NO2.json' ) "}" name: "hvakosterstrommen_price_tomorrow" value_template: "{{ (value_json.prices | selectattr('time_start', 'match', (now()+timedelta(days=1)).strftime('%Y-%m-%dT%H:00')) | list | first)['NOK_per_kWh'] }}" unit_of_measurement: "NOK/kWh" json_attributes: - prices
    3 poeng
  22. Omsider fått litt system på Piene mine. Fant ikke noe jeg likte på nett så laget selv... https://www.printables.com/model/1220361-rpi-5-nvme-poe-cabinet-and-rack Og når jeg først var i seget så fixet jeg automatisk backup til Synology etter denne oppskriften...
    3 poeng
  23. @OlavT Den gjør slik at du kan styre din Mill gen 2 ovn trådløst via ESPhome. Jeg og mange flere med meg hadde problemer med Mill gen2 ovner som ikke lar seg oppgradere med siste firmware fra Mill sitt økosystem. Resultatet blir i praksis en "dum" ovn som du ikke kan styre. Så isteden for å kaste ovnen, kan du oppgradere den ved å bytte ut chip'en som står i disse ovnene originalt. I praksis vil man da fjerne hele Mill styringen og erstatte den med en esp8266 som man installere den eksterne komponenten på. Da kan du f.eks. styre den lokalt via Home assistant som en klima enhet.
    3 poeng
  24. Vi jobber nå sammen med leverandøren om en oppdatert Zigbee driver på produktet. Så vi håper vi kan ha en løsning for de kundene som opplever Zigbee drop. Firmware vil da være mulig å laste opp via OTA. Pål
    3 poeng
  25. Jeg tror det baserer seg på dårlige erfaringer med annet utstyr. Mine zigbee enheter varer i mange år på et batteri. Mange er på det sjette året. Enig at det er null stress. Fordelen er at det gir en total frihet i å plassere brytere og sensorer akkurat der de gjør mest nytte. Tradisjonelle brytere og dimmere er etter min mening bare en selvpålagt begrensing. Smarte pærer / belysning gir en full kontroll på hvordan lyssettingen skal være. Ser at det også brukes argumenter om at en må ha tradisjonelle brytere fordi det kan hende at en ny eier ikke liker smarthus. For min del kunne jeg ikke brydd meg mindre om hva en fremtidig ny eier synes om det 🙂
    3 poeng
  26. Hei! 03/22 = V1 Firmware 04/22 = V1 Firmware 09/22= V2 Firmware 07/24= V2 Firmware Forskjell på V1 vs V2. Korrigert kompensasjonstabell = Det vil si at den ønskede temperaturen harmonerer med målt temperatur. Alle modeller skal ha repeater funksjon på Zigbee. (V1 hadde en "aggressiv" kompensasjonstabell innebygget på linje med alle "dumme" panelovner, men dumme ovner rapporterer ikke målt temperatur og derfor opplever man ikke denne forskjellen) V1 modeller kan oppdateres til V2 firmware om man har en kontroller som støtter dette. Firmware ligger på nettsiden til Elektroimportøren, eller kontakt kundesenter for å få oversendt disse. Mvh Pål, Namron
    3 poeng
  27. Har i noen måneder brukt uike verktøy til å enkelt generere yaml kode kun ved å beskrive behovene mine. Blir bare mer og mer imponert over utviklingen og hva det er mulig å få til - dersom spørsmålene stilles riktig - med høyst begrensede programmeringskunnskaper. Et eksempel er denne som fargekoder timene basert på rangering av strømprisen: type: custom:apexcharts-card series: - entity: sensor.nordpool_kwh_oslo_nok_3_10_0 name: Pris type: column float_precision: 4 data_generator: > const today = entity.attributes.raw_today; const tomorrow = entity.attributes.raw_tomorrow; const allData = today.concat(tomorrow); const categorizeHours = (data) => { const sorted = [...data].sort((a, b) => a.value - b.value); const categories = { lowestFour: sorted.slice(0, 4).map(p => p.start), nextFour: sorted.slice(4, 8).map(p => p.start), middle: sorted.slice(8, 16).map(p => p.start), nextHighestFour: sorted.slice(16, 20).map(p => p.start), highestFour: sorted.slice(20).map(p => p.start) }; return categories; }; const todayCategories = categorizeHours(today); const tomorrowCategories = categorizeHours(tomorrow); const getColor = (start) => { for (const day of [todayCategories, tomorrowCategories]) { if (day.lowestFour.includes(start)) return '#006400'; // Dark Green if (day.nextFour.includes(start)) return '#90EE90'; // Light Green if (day.middle.includes(start)) return '#1E90FF'; // Blue if (day.nextHighestFour.includes(start)) return '#FFA500'; // Orange if (day.highestFour.includes(start)) return '#FF0000'; // Red } return '#808080'; // Default Gray (shouldn't occur) }; return allData.map(p => ({ x: new Date(p.start).getTime(), y: p.value, fillColor: getColor(p.start) })); now: show: true label: Nå graph_span: 2d span: start: day locale: nb apex_config: chart: height: 300px zoom: enabled: true toolbar: show: true tools: zoom: true zoomin: false zoomout: false pan: false reset: true legend: show: false dataLabels: enabled: false xaxis: type: datetime labels: datetimeFormatter: month: ddd day: ddd yaxis: forceNiceScale: false min: 0 plotOptions: bar: columnWidth: '95%' På den måten kan jeg se når f.eks. varmekabler på bad og VVB er aktvert (som begge er aktivert på døgnets 8 billigste timer, altså mørkegrønne og lysegrønne farger). Etter nærmere ettertanke kan VVB og varmekabler uansett være aktivert om prisen er under 0.2 kroner. Gir derfor AI-assistenten følgende beskjed: can you modify the code and make all bars dark green if the value is bellow 0.2? og jeg får dette resultatet: Answer Certainly! I'll modify the code to make all bars dark green if their value is below 0.2, while keeping the color categorization for the rest. Here's the updated version: type: custom:apexcharts-card series: - entity: sensor.nordpool_kwh_oslo_nok_3_10_0 name: Pris type: column float_precision: 4 data_generator: > const today = entity.attributes.raw_today; const tomorrow = entity.attributes.raw_tomorrow; const allData = today.concat(tomorrow); const categorizeHours = (data) => { const sorted = [...data].sort((a, b) => b.value - a.value); // Sort descending const categories = { highestFour: sorted.slice(0, 4).map(p => p.start), nextHighestFour: sorted.slice(4, 8).map(p => p.start), middle: sorted.slice(8, 16).map(p => p.start), nextLowestFour: sorted.slice(16, 20).map(p => p.start), lowestFour: sorted.slice(20).map(p => p.start) }; return categories; }; const todayCategories = categorizeHours(today); const tomorrowCategories = categorizeHours(tomorrow); const getColor = (start, value) => { if (value < 0.2) return '#006400'; // Dark Green for values below 0.2 for (const day of [todayCategories, tomorrowCategories]) { if (day.highestFour.includes(start)) return '#FF0000'; // Red if (day.nextHighestFour.includes(start)) return '#FFA500'; // Orange if (day.middle.includes(start)) return '#1E90FF'; // Blue if (day.nextLowestFour.includes(start)) return '#90EE90'; // Light Green if (day.lowestFour.includes(start)) return '#00FF00'; // Green } return '#808080'; // Default Gray (shouldn't occur) }; return allData.map(p => ({ x: new Date(p.start).getTime(), y: p.value, fillColor: getColor(p.start, p.value) })); now: show: true label: Nå graph_span: 2d span: start: day locale: nb apex_config: chart: height: 300px zoom: enabled: true toolbar: show: true tools: zoom: true zoomin: false zoomout: false pan: false reset: true legend: show: false dataLabels: enabled: false xaxis: type: datetime labels: datetimeFormatter: month: ddd day: ddd yaxis: forceNiceScale: false min: 0 plotOptions: bar: columnWidth: '95%' Som gir meg denne: ...så kan jeg lage automasjonene tilsvarende. Andre som har fått tilsvarende hjelp?
    3 poeng
  28. Jeg har kjøpt et par "Arida 160RE" ventilatorer med varmeveksler. De kan kommunisere som master/slave via kabel. "Klimair 160RE" og "Südwind Ambientika" ser ut til å være samme ventilator. "Südwind Ambientika Wireless+" har trådløs kommunikasjon på 868MHz, og jeg ville lage noe tilsvarende til Arida 160RE. Da slipper jeg å banke opp CAT5 -kabel 🙂 Kontroller-kortet er av bra kvalitet. Bestykket med Texas MSP430TM microkontroller og Texas SN75176B differential bus tranceiver. Ut fra hva jeg målte, og så på skopet, måtte vifta ganske sikkert kjøre Modbus/RS485. Kjøpte et par Eletechsup RT18A01 RS485 868MHz tranceivers. Alternativt RT4AE01. 240 kroner 'ish for 2stk i den store butikken. Litt utfordring å finne dokumentasjon. De er klare til bruk, men konfig kan endres med AT-kommandoer via et USB/RS485 interface. Tranceiverne passet perfekt i innbyggingsbokser (#89041) fra Kjell&Co: Testet tranceiverne på viftene. Den ene vifta satt opp som slave + motsatt luftstrøm av master. Våget ikke å "stjele" 5V fra vifte-kontrollerne. Tranceiverne får strøm fra noen gamle mobilladere. Virket!! Før permanent montering, har jeg endret ID + satt ned effekten på tranceiverne et par hakk. Bare 9m avstand og nærmest fri sikt mellom dem. Det gikk greit å endre konfig med AT-kommandoer via GTKTerm eller CoolTerm i Linux. I stedet for fjernkontrollen, kan jeg styre master-vifta på IR fra Home Assistant via en Broadlink RM4 Mini. Har brukt "python-broadlink" for å hente kodene fra fjernkontrollen. Et annet alternativ er å ha en RS485 tranceiver #3 med USB interface som master, sette begge viftene som slaver og styre de fra PC. Men ikke i dag. Nå prater viftene sammen - trådløst. Og det var målet
    3 poeng
  29. Vet nå ikke om jeg bare er gammeldags men tenker at dimmere varer "evig" og det gjør ikke lyspærer samme hvor mye LED de er... Ikke dimbar... Det er ofte ulempen med billige lamper/pærer.
    3 poeng
  30. Nå vet ikke jeg helt hva jeg så av Proxmox sist jeg tok en kikk men enten har jeg kikket feil eller mye har skjedd siden dengang så nå er ESXI historie og Proxmox er oppe og går på flere NUCer og det har fungert supert i noen uker... Ble litt overrasket over mine innlegg i denne tråden men konverteringen er jo beskrevet langt bedre i en annen tråd...
    3 poeng
  31. Jeg ville isolert kobberrøret for varmt vann som går opp langs veggen
    3 poeng
  32. Har hatt min yale doorman samt magnetsensorer og røykvarslere koblet mot en eldre "Yale Smart Alarm" i lengre tid. Dette har irritert meg sykt at boksen har webinterface som vi som sluttbrukere ikke får tilgang til. Så tenkte å få ordnet dette en gang for alle. Etter å ha kikket på kretskortet så fant jeg to flash brikker, loddet av disse og dumpet innholdet. Den ene innehold alle innstillinger i klartekst, inkludert til webinterfacet. Webinterface lar deg gjør alt du kan gjøre via den elendige yale appen, og den lar deg fjerne koblingen mot Yale UK, så nå helt skyfritt. Ser også ut som man kan legge inn post av events til en url eller mailadresse, så det blir neste å teste. Vet jo ikke om alle enheter har samme passord eller om det er unikt per enhet, men hvis noen andre sitter på samme boks og vil prøve så send meg en melding. Legger ved ett par bilder av interfacet om interresant (status viser ikke på enhetene da den nå ligger på labben min og ikke har dekning).
    3 poeng
  33. Det må vi klare å få til! Sant, @iblis 🙂 Det har ikke høyest prioritet sånn på tampen av juli, men i løpet av neste måned burde vi ha det på plass. 👍
    3 poeng
  34. Angående hvilken z-stick man bør gå for har Home Assistant denne artikkelen: https://www.home-assistant.io/integrations/zwave_js/#which-z-wave-controller-should-i-buy og selvfølgelig - man velger ikke ut ifra hvilken som er mest tilgjengelig og rimelig, forhandlere i vårt land er ikke nødvendigvis de mest oppdaterte. Har selv Zooz sin z-stick 700 Idag hadde jeg kjøpt denne, selv om den ikke er nevnt i HA-artikkelen https://thepihut.com/products/zooz-800-series-z-wave-usb-stick
    2 poeng
  35. Helt grei den @christbj 😉 Jeg er klar over at slik metadata kan legges til, men jeg gjør det som dette av to grunner. 1. Lettere å gjøre entities unike F.eks har jeg tre bad, men jeg kan ikke ha tre light.bad_taklampe. Må skille badene i entity navn på en måte. Så leng jeg ikke har flere av samme type rom i en etasje går det greit. 2. Ønsker også god oversikt i f eks Z2M og Node-Red
    2 poeng
  36. Hatt Shelly Wall Display x2 i over 2 uker nå, har enda ikke bestemt meg om den blir stående på pulten eller blir byttet ut med bryteren på veggen. 😊
    2 poeng
  37. Ikke helt fornøyd men langt bedre enn opprinnelig... 4 fløyter samtidig og med litt forskjellig tone...
    2 poeng
  38. Jeg ville vært forsiktig med å bruke det bittelille releet i en shelly til VVB. Den skal stå på mange timer i strekk. Selv har jeg gått for en 25A kontaktor som er styrt av en shelly, da skal det ikke være noen risiko for varmgang. Men dette krever jo elektriker.
    2 poeng
  39. Hei alle sammen! En gledens dag er kommet og vi kan endelig slippe FW oppdateringen til Namron Komfyrvakt! Selve oppdateringen må gjennomføres via Bluetooth og guide ligger vedlagt i zip-filen. Kjør oppdatering og kom gjerne med feedback! 140279X-Firmware.zip
    2 poeng
  40. Teknologivalg blir smak og behag. Men du kan ikke basere deg på hva som er mest hensiktsmessig for elektrikeren. For dem er det er fordel at systemet er lukket og begrenset til én leverandør. Det gir færre variable å ta hensyn til. Mye enklere å levere og sannsynligvis mindre support. Evt lock-in er bare en bonus som øker sannsynligheten for at du kommer tilbake og kjøper mer av samme. De trenger heller ikke bekymre seg for evt total utskifting av hele systemet på et senere tidspunkt hvis du finner ut at Plejd ikke var tingen likevel, eller skytjenestene skulle forsvinne. Den risikoen tar du alene. For dem vil det bare være en ny sjanse til å få et stort oppdrag. Jeg forstår det slik at alle tredjeparts-løsninger for Plejd er basert på at det finnes en fungerende Plejd skytjeneste der produktene registrers og man kan hente ut nøkler. Det ville ihvertfall ikke jeg tatt sjansen på for faste installasjoner som skal leve i 10+ år.
    2 poeng
  41. Da dukket opp en liten pakke fra NKON.NL: ...så da blir batteribanken 48V/1070Ah, ca. 55 kWh. Handelen hos NKON var helt grei og gode priser, måtte bare passe på å velge NON-EU i nettbutikken først... DHL var ikke såååå imponerende... Status på fjoråret ble 6060kWh kjøpestrøm mot 6670kWh året før. Ikke så verst med tanke på at helt fra tidlig i januar har jeg kjørt uten varmepumpe. Gulvvarme og bereder har gått på direkte varmekolbe så det gir jo litt over 3 ganger høyere forbruk til varme enn det varmepumpen kunne prestere. Har jo firt en del på komfortkravene for å få det til... Termostaten på badegulvet står jo på 25 grader men i praksis ligger det under 20 og ikke så helt uvanlig at det er nede i 16 også uten at det er noe problem... Jeg har også en følelse av at november/desember har vært ekstra tunge med veldig tett skydekke. En normal overskyet dag har jeg gjerne 1.5-2kW fra solcellene men i disse månedene har jeg snaut nok vært over 200W annet enn i veldig korte perioder.
    2 poeng
  42. Har hatt et litt for komplisert program for å finne de laveste strømpristimene (etter litt for mange strømprisleverandører som dukker opp for så å forsvinne igjen...) så nå har jeg skrevet om og koden er blitt delelig med andre... Det kan fremdeles se litt komplisert ut men flyten er stort sett ovenfra og ned men om en gjør endringer i f.eks. timevalg må en gå litt tilbake og oppdatere uten å lage en endeløs loop. Funksjonen er rimelig enkel: Strømpriser hentes fra hvakosterstrommen.no (med manuelt alternativ fra NordPool) kl 13:02 og gjentas hvert 5. minutt inntil strømdata er mottatt. En kan velge et antall billige timer en trenger (2 alternativer) og er en innenfor de valgte timer slås der på globale variabler: lavPris og lavLavPris som kan benyttes fritt til å styre f.eks bereder. Systemet forholder seg kun til totalpris inkl avgifter og strømstøtte siden det er den vi virkelig betaler men de andre prisene vises også for informasjon. Systemet lagrer strømpriser for 72 timer og har en "Planleggingsperiode" fra kl 22:00 til 22:00. Denne perioden er valgt siden nettleien faller kl 22:00 i ukedagene og det kan være greit å få med seg. Det hele vises grafisk på en rimelig oversiktlig måte (mener jeg...). Om/Når nettleien endrer seg må det endres i noden "Lagre nettleie" og aktiviseres med trykk på "timestamp". Pr i dag ligger nettleie inne med 0.7 og 0.6 for hhv dag og natt/helg. Flowen ser slik ut: Skjermbilde med betjening (i dette bildet er med noen få tilleggselementer som er viktig i mitt system men som ikke har noe med strømpris å gjøre): Ant lave timer og Ant LavLav timer er valg for hvor mange timer en vil ha. Listboksene under viser de utvalgte timene inkl strømpris for hver time. Over listboksene vises status: Om en er innenfor eller utenfor de valgte timene. De utvalgte timene vises i grafen som lilla. "Vis kun resttimer" er et valg for å fjerne timer som er "brukt" fra listboksene. Dette er kun et visuelt valg og påvirker ikke annen funksjon. Graf Blå er planleggingsperioden og også markert inneværende time. Graf Oransje er total strømpris som vi betaler og resten i grafen sier seg selv med etikettene øverst. Visning av "Vis kun resttimer" og overgang til ny planperiode: Visning av når nye prisdata ankommer kl 13:02: [{"id":"8a9326e69a043d08","type":"delay","z":"b468e89a030cb946","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1040,"y":840,"wires":[["143924fdaab67cff","cb7159478bedaaf1"]]},{"id":"178c4f3e51c168f5","type":"function","z":"b468e89a030cb946","name":"Refresh Dashboard items","func":"var m1 = {reset:true};\nreturn [[m1,msg]];","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":840,"wires":[["8a9326e69a043d08"]]},{"id":"19314273e31cb034","type":"group","z":"b468e89a030cb946","name":"Strømpris chart","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["d45591226bb68efc","1366923163fe3133","cb7159478bedaaf1","08a9ac90d5a7da54"],"x":14,"y":549,"w":752,"h":122},{"id":"d45591226bb68efc","type":"ui_chart","z":"b468e89a030cb946","g":"19314273e31cb034","name":"","group":"a51799506567a0f3","order":2,"width":"0","height":"0","label":"Strømplan 24/72 timer.","chartType":"line","legend":"true","xformat":"dd HH","interpolate":"step","nodata":"wait","dot":false,"ymin":"","ymax":"","removeOlder":"48","removeOlderPoints":"100","removeOlderUnit":"3600","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#ff7f0e","#62a0ea","#edd400","#f7f7f7","#98df8a","#62a0ea","#813d9c","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":640,"y":590,"wires":[["b6089f059556a469","45a6be97437e5578","143924fdaab67cff"]]},{"id":"1366923163fe3133","type":"inject","z":"b468e89a030cb946","g":"19314273e31cb034","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[]","payloadType":"json","x":590,"y":630,"wires":[["d45591226bb68efc"]]},{"id":"cb7159478bedaaf1","type":"function","z":"b468e89a030cb946","g":"19314273e31cb034","name":"Prepare for 72h chart","func":"let markPlanPer = flow.get(\"prisMax\") + 0.2 || 1.5; // Høyde på markør for planperiode og inneværende time\nlet markSelHours = markPlanPer * 0.08; // Høyde på markør for planperiode og inneværende time\nlet markCurrentHour = markPlanPer * 0.98;\n\nlet prisMax = -99;\nlet prisMin = 99;\nlet prisSnitt = 0;\nlet dt = new Date();\n//Ny periode kl 22:00: Flytt dato til over midnatt for å sette periodestart og slutt.\nif (dt.getHours() >= 22) dt = new Date(Number(dt) + 4*60*60*1000);\n\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\nlet dtPerStart = dt2 - 2*60*60*1000;\nlet dtPerEnd = dt2 + 22*60*60*1000;\n\n//node.warn(dtPerStart);\n//node.warn(dtPerEnd);\n\n// Resett dt til riktig tid.\ndt = new Date();\n\n\ndt.setDate(dt.getDate());\nlet currHour = dt.getHours();\nlet currDate = dt.getDate();\nlet currMonth = dt.getMonth() + 1; // Mnd er 0-11 i utgangspunktet\nlet currYear = dt.getFullYear();\nlet currPlanPerStart = new Date()\n\nlet timerValgtLav = []\ntimerValgtLav = flow.get(\"timerValgtLav\");\nlet timerValgtLavLav = []\ntimerValgtLavLav = flow.get(\"timerValgtLavLav\");\n\nlet pdt=0; //PrisDenneTime for kalkulasjoner\nlet msg2 = [[],[],[],[]];\nmsg2.payload = [{ \"series\": [\"Jonaspris\", \"\", \"Råpris+nettleie og avgifter\",\"Råpris\",\"Nettleie\",\"\",\"Lave priser\",\"LavLave priser\"], \"data\": [[],[],[],[],[],[],[],[]], \"labels\": []}];\nlet pris72 = flow.get(\"Prisdata72\");\nlet i = 0;\n\nif (pris72 != null) {\n for (i = 0; i < pris72.length; i++){\n pdt = Number(pris72[i].pris);\n var priceHourTimestamp = new Date(pris72[i].ts);//new Date(pris48[i].timestamp);\n msg2.payload[0].data[0][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].jonaspris).toFixed(2)};\n msg2.payload[0].data[2][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].pristot).toFixed(2)};\n msg2.payload[0].data[3][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].pris).toFixed(2)};\n msg2.payload[0].data[4][i] = {\"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i].nettleie).toFixed(2)};\n\n // Add \"Now\" marker\n if (Number(currDate) === Number(priceHourTimestamp.getDate() ) && Number(currHour) === Number(priceHourTimestamp.getHours())){\n msg2.payload[0].data[1][i] = {\"x\": Number(priceHourTimestamp), \"y\": markCurrentHour};}\n else{\n msg2.payload[0].data[1][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};}\n \n // Add \"Planning period\" marker\n if (pris72[i].ts >= dtPerStart && pris72[i].ts < dtPerEnd){\n msg2.payload[0].data[5][i] = {\"x\": Number(priceHourTimestamp) + 1, \"y\": markPlanPer};\n // Finn max, min og gjennomsnittspris\n if (Number(pris72[i].jonaspris) < prisMin) prisMin = Number(pris72[i].jonaspris);\n if (Number(pris72[i].jonaspris) > prisMax) prisMax = Number(pris72[i].jonaspris);\n prisSnitt += Number(pris72[i].jonaspris);\n //node.warn(i);\n }\n else{\n msg2.payload[0].data[5][i] = {\"x\": Number(priceHourTimestamp) + 2, \"y\": 0};\n }\n\n // Add \"Selected low hours\" marker\n let phts = Number(new Date(priceHourTimestamp));\n// let phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\n// let exists = timerValgtLav.some(c => c.timestamp === phtsFormatted); //\"2024-11-06 02:00\");\n let exists = timerValgtLav.some(c => c.ts === phts); //\"2024-11-06 02:00\");\n if (exists){\n // node.warn(\"På\");\n msg2.payload[0].data[6][i] = {\"x\": Number(priceHourTimestamp), \"y\": markSelHours};}\n else{\n // node.warn(\"Av\");\n msg2.payload[0].data[6][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};\n }\n\n // Add \"Selected LowLow hours\" marker\n phts = Number(new Date(priceHourTimestamp));\n// phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\n exists = timerValgtLavLav.some(c => c.ts === phts); //\"2024-11-06 02:00\");\n// exists = timerValgtLavLav.some(c => c.timestamp === phtsFormatted); //\"2024-11-06 02:00\");\n //node.warn(exists);\n if (exists){\n // node.warn(\"På\");\n msg2.payload[0].data[7][i] = {\"x\": Number(priceHourTimestamp), \"y\": markSelHours*.6};}\n else{\n // node.warn(\"Av\");\n msg2.payload[0].data[7][i] = {\"x\": Number(priceHourTimestamp), \"y\": 0};\n }\n \n\n }\n // Legg til time # 73 for bedre lesbarhet\n priceHourTimestamp = Number(priceHourTimestamp) + (1000 * 60 * 60)\n //node.warn(Number(priceHourTimestamp));\n msg2.payload[0].data[0][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].jonaspris).toFixed(2)};\n msg2.payload[0].data[1][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0};\n msg2.payload[0].data[2][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].pristot).toFixed(2)};\n msg2.payload[0].data[3][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].pris).toFixed(2)};\n msg2.payload[0].data[4][i] = { \"x\": Number(priceHourTimestamp), \"y\": Number(pris72[i-1].nettleie).toFixed(2)};\n msg2.payload[0].data[5][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n msg2.payload[0].data[6][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n msg2.payload[0].data[7][i] = { \"x\": Number(priceHourTimestamp), \"y\": 0 };\n}\n\nprisSnitt = prisSnitt/24;\nflow.set(\"prisMin\", prisMin);\nflow.set(\"prisMax\", prisMax);\nflow.set(\"prisSnitt\", prisSnitt);\n\n// Fjern unødvendige/gamle data fra chart\nlet msg3 = [[],[]]\nmsg3.payload = msg2.payload;\nfor (i = 0; i < 20; i++){\n for (let j = 0; j<=7;j++){\n msg3.payload[0].data[j].shift();\n }\n}\n\n//node.warn(msg3.payload);\n\nmsg.payload = msg3.payload;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":360,"y":590,"wires":[["d45591226bb68efc"]]},{"id":"08a9ac90d5a7da54","type":"inject","z":"b468e89a030cb946","g":"19314273e31cb034","name":"Refresh charts","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"0 0-23 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":590,"wires":[["cb7159478bedaaf1"]]},{"id":"a51799506567a0f3","type":"ui_group","name":"Charts","tab":"a73dc047b0befb9e","order":3,"disp":false,"width":"30","collapse":false,"className":""},{"id":"a73dc047b0befb9e","type":"ui_tab","name":"Prisgraf v2","icon":"euro_symbol","order":7,"disabled":false,"hidden":false},{"id":"bb1f6387ef45151f","type":"group","z":"b468e89a030cb946","name":"Tabell laveste timer for batterilading","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["3ea6f148d6030a9f","45a6be97437e5578","f944761036305ed5","7cc2fd4a050bccdd","3f26c24b2f14e081","60c75de6263a8794","50456aa1e7ddea01"],"x":14,"y":679,"w":1042,"h":142},{"id":"3ea6f148d6030a9f","type":"ui_table","z":"b468e89a030cb946","g":"bb1f6387ef45151f","group":"e9e1f6f856a0ef75","name":"Laveste LavLav priser tbl","order":9,"width":"5","height":"10","columns":[{"field":"timestamp","title":"Time","width":"65%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"jonaspris","title":"Pris","width":"28%","align":"right","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":920,"y":780,"wires":[]},{"id":"45a6be97437e5578","type":"function","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"Hent valgte pristimer","func":"let liste2 = flow.get(\"liste2\") || false // Vis kun resttimer i listbox Lav og LavLav\nlet pdLow = flow.get(\"lavpris\");\nlet nmax = flow.get(\"AntLavLavTimer\");\nlet pdSelected = []\nlet pdSelDisp = []\nlet i = 0;\n// Klon objekt for å bryte forbindelsen til opprinnelige data for ellers vil opprinnelige data endres\nlet newpdLow = RED.util.cloneMessage(pdLow); \nlet dt = new Date();\n\n\nfor (i = 0; i < nmax;i++){\n pdSelected.push(newpdLow[i]);\n}\nflow.set(\"timerValgtLavLav\", pdSelected);\n\n// Fjern foregående timer fra tabell dersom valgt\nfor (i = 0; i < nmax;i++){\n if (liste2){\n if (pdLow[i].ts >= (Number(dt) - 60*60*1000)){\n pdSelDisp.push(newpdLow[i]);\n }\n }else{\n pdSelDisp.push(newpdLow[i]);\n }\n//node.warn(pdLow[i].ts);\n//node.warn(Number(dt));\n\n}\n\n// Pynt dataene for tabellvisning\nfor (i = 0; i < pdSelDisp.length;i++){\n pdSelDisp[i].timestamp = new Date(pdSelDisp[i].ts).toLocaleString(\"nb-NO\").slice(0,-3) ;\n pdSelDisp[i].jonaspris = parseFloat(pdSelDisp[i].jonaspris).toFixed(2);\n}\n//node.warn(pdSelDisp),\nmsg.payload = pdSelDisp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":780,"wires":[["60c75de6263a8794"]]},{"id":"f944761036305ed5","type":"ui_numeric","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","label":"Ant LavLav timer","tooltip":"Velg antall laveste pristimer for batterilading","group":"e9e1f6f856a0ef75","order":5,"width":"5","height":"1","wrap":false,"passthru":false,"topic":"topic","topicType":"msg","format":"{{value}}","min":"0","max":"24","step":1,"className":"","x":330,"y":720,"wires":[["3f26c24b2f14e081"]]},{"id":"7cc2fd4a050bccdd","type":"change","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"get LavLav#","rules":[{"t":"set","p":"payload","pt":"msg","to":"AntLavLavTimer","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":110,"y":720,"wires":[["f944761036305ed5"]]},{"id":"3f26c24b2f14e081","type":"change","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"set LavLav#","rules":[{"t":"set","p":"AntLavLavTimer","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":720,"wires":[["7cc2fd4a050bccdd","45a6be97437e5578","178c4f3e51c168f5"]]},{"id":"60c75de6263a8794","type":"sort","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":650,"y":780,"wires":[["3ea6f148d6030a9f"]]},{"id":"50456aa1e7ddea01","type":"inject","z":"b468e89a030cb946","g":"bb1f6387ef45151f","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":150,"y":780,"wires":[["7cc2fd4a050bccdd","4bcea84cb9e1dcd0"]]},{"id":"e9e1f6f856a0ef75","type":"ui_group","name":"Tabeller","tab":"a73dc047b0befb9e","order":2,"disp":false,"width":"10","collapse":false,"className":""},{"id":"a6bf2d9c44840471","type":"group","z":"b468e89a030cb946","name":"Sett global.lavPris & lavLavPris for bruk over alt.","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["c37c0f4b7371feab","143924fdaab67cff","6782814db0d4c03a","f4934fafce556690","d4e405705b11b8ea","32bbe8db8e28a1fb"],"x":14,"y":1009,"w":772,"h":172},{"id":"c37c0f4b7371feab","type":"cronplus","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"","outputField":"payload","timeZone":"","storeName":"","commandResponseMsgOutput":"output1","defaultLocation":"","defaultLocationType":"default","outputs":1,"options":[{"name":"schedule1","topic":"topic1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 0 * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":120,"y":1080,"wires":[["143924fdaab67cff"]]},{"id":"143924fdaab67cff","type":"function","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"Set global.lavPris & global.lavLavPris","func":"let msg2 = {}\nlet msg3 = {}\nlet msg4 = {}\nlet timerValgtLav = []\ntimerValgtLav = flow.get(\"timerValgtLav\");\nlet phts = new Date();\nlet phtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\nphtsFormatted = phtsFormatted.slice(0,-2) + \"00\";\nlet phts2 = Number(new Date(phtsFormatted));\nlet exists = timerValgtLav.some(c => c.ts === Number(phts2)); //\"2024-11-06 02:00\")\n//node.warn(exists);\n\nglobal.set(\"lavPris\", exists);\nif (exists)\n msg.payload = \"<font color=lime>Ok\";\nelse\n msg.payload = \"<font color=red>-----\";\n\n\nlet timerValgtLavLav = []\ntimerValgtLavLav = flow.get(\"timerValgtLavLav\");\nphts = new Date();\nphtsFormatted = phts.getFullYear() + \"-\" + (\"00\" + (phts.getMonth() + 1)).slice(-2) + \"-\" + (\"00\" + phts.getDate()).slice(-2) + \" \" + (\"00\" + phts.getHours()).slice(-2) + \":\" + (\"00\" + phts.getMinutes()).slice(-2);\nphtsFormatted = phtsFormatted.slice(0, -2) + \"00\";\nphts2 = Number(new Date(phtsFormatted));\nexists = timerValgtLavLav.some(c => c.ts === phts2); //\"2024-11-06 02:00\")\n//node.warn(exists);\n\nglobal.set(\"lavLavPris\", exists);\nif (exists)\n msg2.payload = \"<font color=lime>Ok\";\nelse\n msg2.payload = \"<font color=red>-----\";\n\n// Send prisdata til \"Solar\" for bruk i headline\nmsg4.topic = \"prisMin\";\nmsg4.payload = flow.get(\"prisMin\").toFixed(2);\nnode.send([null,null,null,msg4]);\nmsg4.topic = \"prisSnitt\";\nmsg4.payload = flow.get(\"prisSnitt\").toFixed(2);\nnode.send([null, null, null, msg4]);\nmsg4.topic = \"prisMax\";\nmsg4.payload = flow.get(\"prisMax\").toFixed(2);\nnode.send([null, null, null, msg4]);\n\nmsg3.payload = \"<font size=5 color=orange>Min:\" + flow.get(\"prisMin\").toFixed(2) + \"/sn:\" + flow.get(\"prisSnitt\").toFixed(2) + \"/max:\" + flow.get(\"prisMax\").toFixed(2);\nreturn [msg,msg2,msg3];","outputs":4,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1070,"wires":[["6782814db0d4c03a"],["f4934fafce556690"],["d4e405705b11b8ea"],["32bbe8db8e28a1fb"]]},{"id":"6782814db0d4c03a","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":6,"width":"5","height":"1","name":"Vis Lav nå","label":"","format":"Nå: <font size = 6>{{msg.payload}}","layout":"row-left","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":670,"y":1050,"wires":[]},{"id":"f4934fafce556690","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":7,"width":"5","height":"1","name":"Vis LavLav nå","label":"","format":"Nå: <font size = 6>{{msg.payload}}","layout":"row-left","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":680,"y":1080,"wires":[]},{"id":"d4e405705b11b8ea","type":"ui_text","z":"b468e89a030cb946","g":"a6bf2d9c44840471","group":"e9e1f6f856a0ef75","order":10,"width":0,"height":0,"name":"MinSnMax","label":"","format":"{{msg.payload}}","layout":"row-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":670,"y":1110,"wires":[]},{"id":"32bbe8db8e28a1fb","type":"link out","z":"b468e89a030cb946","g":"a6bf2d9c44840471","name":"Strompris_Out","mode":"link","links":["c6012e7bbe73f35f"],"x":615,"y":1140,"wires":[]},{"id":"5d782f6a3df9efea","type":"group","z":"b468e89a030cb946","name":"Tabell lave timer for direkte forbruk","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["9486fc1a301c466d","b6089f059556a469","52e50cf1d1089267","4bcea84cb9e1dcd0","031c1a6834f7945d","7bf74d11170a6864"],"x":14,"y":859,"w":1022,"h":142},{"id":"9486fc1a301c466d","type":"ui_table","z":"b468e89a030cb946","g":"5d782f6a3df9efea","group":"e9e1f6f856a0ef75","name":"Laveste Lav priser tbl","order":8,"width":"5","height":"10","columns":[{"field":"timestamp","title":"Time","width":"65%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"jonaspris","title":"Pris","width":"28%","align":"right","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":910,"y":960,"wires":[]},{"id":"b6089f059556a469","type":"function","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"Hent valgte pristimer","func":"let liste2 = flow.get(\"liste2\") || false // Vis kun resttimer i listbox Lav og LavLav\nlet pdLow = flow.get(\"lavpris\");\nlet nmax = flow.get(\"AntLavTimer\");\nlet pdSelected = []\nlet pdSelDisp = []\nlet i = 0;\n// Klon objekt for å bryte forbindelsen til opprinnelige data for ellers vil opprinnelige data endres\nlet newpdLow = RED.util.cloneMessage(pdLow);\n\nlet dt = new Date();\n\nfor (i = 0; i < nmax;i++){\n pdSelected.push(newpdLow[i]);\n}\n\nflow.set(\"timerValgtLav\", pdSelected);\n\n\n// Fjern foregående timer fra tabell dersom valgt\nfor (i = 0; i < nmax;i++){\n if (liste2){\n if (pdLow[i].ts >= (Number(dt) - 60*60*1000)){\n pdSelDisp.push(newpdLow[i]);\n }\n }else{\n pdSelDisp.push(newpdLow[i]);\n }\n//node.warn(pdLow[i].ts);\n//node.warn(Number(dt));\n\n}\n\n// Pynt dataene for tabellvisning\nfor (i = 0; i < pdSelDisp.length;i++){\n pdSelDisp[i].timestamp = new Date(pdSelDisp[i].ts).toLocaleString(\"nb-NO\").slice(0,-3) ;\n pdSelDisp[i].jonaspris = parseFloat(pdSelDisp[i].jonaspris).toFixed(2);\n}\n//node.warn(pdSelDisp),\nmsg.payload = pdSelDisp;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":960,"wires":[["7bf74d11170a6864"]]},{"id":"52e50cf1d1089267","type":"ui_numeric","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"","label":"Ant lave timer","tooltip":"Velg antall lavpristimer for direkte forbruk","group":"e9e1f6f856a0ef75","order":4,"width":"5","height":"1","wrap":false,"passthru":false,"topic":"topic","topicType":"msg","format":"{{value}}","min":"0","max":"24","step":1,"className":"","x":320,"y":900,"wires":[["031c1a6834f7945d"]]},{"id":"4bcea84cb9e1dcd0","type":"change","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"get Lav#","rules":[{"t":"set","p":"payload","pt":"msg","to":"AntLavTimer","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":100,"y":900,"wires":[["52e50cf1d1089267"]]},{"id":"031c1a6834f7945d","type":"change","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"set Lav#","rules":[{"t":"set","p":"AntLavTimer","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":510,"y":900,"wires":[["4bcea84cb9e1dcd0","b6089f059556a469","178c4f3e51c168f5"]]},{"id":"7bf74d11170a6864","type":"sort","z":"b468e89a030cb946","g":"5d782f6a3df9efea","name":"","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":650,"y":960,"wires":[["9486fc1a301c466d"]]},{"id":"f3eadd1725385808","type":"group","z":"b468e89a030cb946","name":"Innhenting og behandling av strømpriser.","style":{"label":true,"color":"#000000"},"nodes":["bed0051986a10b75","a14d52fac2cf7941","4ce0f27b155c6831","eecf1a11e64a8746"],"x":8,"y":13,"w":1058,"h":504},{"id":"bed0051986a10b75","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Sorter priser etter laveste pris i tidsrommet kl 22:00-22:00","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["f4c0539b6cc55b55","0a56154a01aa97c9","eda587539ada5352","36db9c6b1167cf77"],"x":514,"y":209,"w":392,"h":142},{"id":"f4c0539b6cc55b55","type":"inject","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":630,"y":250,"wires":[["0a56154a01aa97c9"]]},{"id":"0a56154a01aa97c9","type":"function","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"Velg tidsperiode","func":"//flow.set(\"Prisdata48Work\", flow.get(\"Prisdata48\"));\nlet pd72 = flow.get(\"Prisdata72\") || []\nlet lowprice = []\nlet i = 0;\nlet pdDate = Number(new Date(pd72[22].ts));\nlet today = Number(new Date());\n//today += 6 * 60 * 60 * 1000;\n//node.warn(pdDate - today);\nlet dt = new Date();\n//Ny periode kl 22:00: Flytt dato til over midnatt for å sette periodestart og slutt.\nif (dt.getHours() >= 22) dt = new Date(Number(dt) + 4*60*60*1000);\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\n//node.warn(dt2);\n\n\nlet dt3 = new Date();\n\n//node.warn(dt3.getHours());\nif (pd72.length == 72) { // Enkel sjekk at fullt datasett er tilgjengelig\n if (dt3.getHours() < 22){\n for (i = 22; i <= 45; i++){ // Plukk ut aktuell tidsperiode\n //node.warn(pd72[i]);\n lowprice.push(pd72[i]);\n }\n }\n else{\n for (i = 46; i < 70; i++){ // Plukk ut aktuell tidsperiode fra kl 22:00 og utover til i morgen\n lowprice.push(pd72[i]);\n //node.warn(pd72[i]);\n }\n }\n \n}\nmsg.payload = lowprice;\nreturn msg; \n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":270,"wires":[["eda587539ada5352"]]},{"id":"eda587539ada5352","type":"sort","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","order":"ascending","as_num":true,"target":"payload","targetType":"msg","msgKey":"jonaspris","msgKeyType":"jsonata","seqKey":"payload","seqKeyType":"msg","x":640,"y":310,"wires":[["36db9c6b1167cf77"]]},{"id":"36db9c6b1167cf77","type":"change","z":"b468e89a030cb946","g":"bed0051986a10b75","name":"","rules":[{"t":"set","p":"lavpris","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":310,"wires":[["cb7159478bedaaf1"]]},{"id":"a14d52fac2cf7941","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Nettleie inkl alle avgifter dag: nld, natt og helg: nlnh. Endres manuelt her ved behov.","style":{"fill":"#92d04f","label":true,"color":"#000000"},"nodes":["d915fc95bcdb617b","599d5c07932ddd54"],"x":514,"y":39,"w":526,"h":82},{"id":"d915fc95bcdb617b","type":"change","z":"b468e89a030cb946","g":"a14d52fac2cf7941","name":"Lagre nettleie","rules":[{"t":"set","p":"nld","pt":"flow","to":".7","tot":"num"},{"t":"set","p":"nlnh","pt":"flow","to":".6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":80,"wires":[[]]},{"id":"599d5c07932ddd54","type":"inject","z":"b468e89a030cb946","g":"a14d52fac2cf7941","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":620,"y":80,"wires":[["d915fc95bcdb617b"]]},{"id":"4ce0f27b155c6831","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Opprett flow.Prisdata72","style":{"fill":"#c8e7a7","label":true,"color":"#000000"},"nodes":["d51b8abd1f8b0102","06b3fdadafe92af4","20507782eea7238f","d68c7c64b4396e88","68dedc7c5f6d81bd","ba37809882e5a246","845af2cac241faae","7a2d84c871bfca40","7ad93125a55d7c60"],"x":34,"y":39,"w":462,"h":312},{"id":"289686ae32e9ac0c","type":"subflow","name":"Konv til eget format m nettleie og sst","info":"","category":"","in":[{"x":60,"y":70,"wires":[{"id":"4ab1c86d5f9c7f0a"}]}],"out":[{"x":640,"y":70,"wires":[{"id":"4ab1c86d5f9c7f0a","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"4ab1c86d5f9c7f0a","type":"function","z":"289686ae32e9ac0c","name":"Konverter til kompakt format med nettleie o.l.","func":"/* Plukker kun ut råpris (Kr/kWh uten avgifter) og starttidspunkt fra inndata og legger på \nnettleie og avgifter her. Resultatet blir:\n.ts Timestamp (millisekund siden 01.01.1970) hentet fra starttidspunkt for strømprisen\n.pris Råpris uten avgifter o.l.\n.pristot Strømpris inkl avgifter og nettleie\n.jonaspris Strømpris inkl avgifter og nettleie minus strømstøtte\n.nettleie\n\[email protected]\n*/\nlet ny = []\nlet msg2 = {}\nlet nld = flow.get(\"$parent.nld\") || 0.7\nlet nlnh = flow.get(\"$parent.nlnh\") || 0.6\nlet pristot = 0;\nlet nl = 0;\n\nfor (var i = 0; i < msg.payload.length; i++ ){\n // Legg til Jonaspris (strømpris + nettleie + forbruksavgift + Enovastøtte med verdier fra flow)\n let dato = new Date(msg.payload[i].time_start);\n let ukedag = (dato.getDay()+6)%7; // Endre ukedag fra søndag=0 til mandag = 0\n let time = dato.getHours();\n let raapris = msg.payload[i].NOK_per_kWh;\n let jonaspris = raapris;\n if (raapris > 0.73) jonaspris = 0.73 + (raapris - 0.73) * 0.1; // Beregn strømstøtte\n \n // Beregn nettleie\n if (ukedag >= 5 || time < 6 || time >= 22){\n pristot = raapris * 1.25 + nlnh;\n jonaspris = jonaspris * 1.25 + nlnh;\n nl = nlnh;\n }\n else {\n pristot = raapris * 1.25 + nld;\n jonaspris = jonaspris * 1.25 + nld;\n nl = nld;\n } \n let ts = Number(new Date(msg.payload[i].time_start));\n ny.push({ \"ts\": ts, \"pris\": msg.payload[i].NOK_per_kWh, \"pristot\": pristot, \"jonaspris\": jonaspris, \"nettleie\": nl });\n}\nmsg2.payload = ny;\nreturn msg2;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":70,"wires":[[]]},{"id":"d51b8abd1f8b0102","type":"http request","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Prisdata fra hvakosterstrømmen.no","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":220,"y":190,"wires":[["d68c7c64b4396e88"]]},{"id":"06b3fdadafe92af4","type":"function","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"set url i morgen","func":"var msg2 = {};\n\nvar d2 = new Date();\nd2.setDate(d2.getDate() + 1);\nvar nextYear = d2.getFullYear();\nvar nextMonth = (\"00\" + (d2.getMonth() + 1)).slice(-2);\nvar nextDate = (\"00\" + d2.getDate()).slice(-2);\nvar url2 = \"https://www.hvakosterstrommen.no/api/v1/prices/\" + nextYear + \"/\" + nextMonth + \"-\" + nextDate + \"_NO2.json\";\n//var url2 = \"https://www.hvakosterstrommen.no/api/v1/prices/\" + nextYear + \"/\" + nextMonth + \"-\" + \"07\" + \"_NO2.json\";\n//node.warn(nextYear + \" \" + nextMonth + \" \" + nextDate);\nmsg2.url = url2;\n//console.log(url);\n//console.log(url2);\n\nreturn msg2;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":150,"wires":[["d51b8abd1f8b0102","7ad93125a55d7c60"]]},{"id":"20507782eea7238f","type":"function","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Fyll inn pris på riktig plass i Prisdata72","func":"let pd72 = flow.get(\"Prisdata72\") || []\nlet dt = new Date();\n// Offset to prev midnight\nlet dt2 = Number(new Date(dt.getFullYear() + \".\" + (dt.getMonth()+1) + \".\" + dt.getDate() + \" 00:00\"));\n\n// Opprett flow.Prisdata72 om den ikke eksisterer\nif (pd72.length < 71){\n for (let i = 0;i < 72;i++) pd72.push([\"-\"]);\n flow.set(\"Prisdata72\", pd72);}\n\n// Sjekk at data er leselige\nif (msg.payload[0].ts != null){\n let msgStartTs = msg.payload[0].ts - dt2;\n // Fyll inn prisdata i riktig tredjedel av Prisdata72\n if (msgStartTs < 0){ // I går ------------------------------------------------\n node.warn(\"<0 Prisdata for i går mottatt\");\n for (let i = 0;i <= 23;i++){\n pd72[i] = msg.payload[i];}}\n if (msgStartTs == 0){ // I dag ------------------------------------------------\n node.warn(\"0 Prisdata for i dag mottatt\");\n for (let i = 0;i <= 23;i++){\n pd72[i+24] = msg.payload[i];}}\n if (msgStartTs > 0){ // I morgen ------------------------------------------------\n node.warn(\">0 Prisdata for i morgen mottatt\");\n // Hvis data 48-71 er for i dag: Skift array 24 plasser tilbake\n if ((pd72[48].ts - dt2) == 0){\n for (let i = 0;i <= 47; i++){\n pd72[i] = pd72[i+24];}\n }\n // ...og så legg inn morgendagens data\n for (let i = 0;i <= 23;i++){\n pd72[i+48] = msg.payload[i];}}\n}else{\n node.warn(\"Strømdata ikke tilgjengelige...\")}\n\n// Marker at prisdata for i morgen er ankommet.\nif ((pd72[48].ts - dt2) == 86400000){\n flow.set(\"pdMorgenOk\", true);}\nelse{\n flow.set(\"pdMorgenOk\", false);}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":230,"y":270,"wires":[["0a56154a01aa97c9","68dedc7c5f6d81bd"]]},{"id":"d68c7c64b4396e88","type":"subflow:289686ae32e9ac0c","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"","x":230,"y":230,"wires":[["20507782eea7238f"]]},{"id":"68dedc7c5f6d81bd","type":"debug","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"debug 187","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":350,"y":310,"wires":[]},{"id":"ba37809882e5a246","type":"inject","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"13:02","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"02 13 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":110,"wires":[["06b3fdadafe92af4"]]},{"id":"845af2cac241faae","type":"inject","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"hver 5 min","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/5 13-21 * * *","once":false,"onceDelay":0.1,"topic":"xx","payload":"","payloadType":"date","x":150,"y":80,"wires":[["7a2d84c871bfca40"]]},{"id":"7a2d84c871bfca40","type":"switch","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"Data for i morgen mottatt?","property":"pdMorgenOk","propertyType":"flow","rules":[{"t":"false"}],"checkall":"true","repair":false,"outputs":1,"x":360,"y":80,"wires":[["06b3fdadafe92af4"]]},{"id":"7ad93125a55d7c60","type":"debug","z":"b468e89a030cb946","g":"4ce0f27b155c6831","name":"debug 192","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":350,"y":150,"wires":[]},{"id":"eecf1a11e64a8746","type":"group","z":"b468e89a030cb946","g":"f3eadd1725385808","name":"Prisdata fra NordPool","style":{"fill":"#c8e7a7","label":true,"color":"#000000"},"nodes":["6ce4aa06b498cbbe","62687955c7aa4efe","0b9a6c13ac4210bc","35e0d54c5ac618c8"],"x":34,"y":359,"w":592,"h":132},{"id":"6ce4aa06b498cbbe","type":"nordpool-api-plus","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"I morgen","area":"NO2","currency":"NOK","action":"dayAhead","x":140,"y":400,"wires":[["62687955c7aa4efe"]]},{"id":"62687955c7aa4efe","type":"function","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"if exist NOK/MWh --> NOK/kWh","func":"let today = new Date()\nlet tomorrow = new Date(today)\ntomorrow.setDate(tomorrow.getDate() + 1)\nlet ddate = new Date(msg.payload[6].timestamp)\n\n// Sjekk at data for i morgen er tilstede\nif (Number(ddate.getDate()) == Number(tomorrow.getDate())){\n for (var i = 0; i < msg.payload.length; i++ ){\n msg.payload[i].NOK_per_kWh = msg.payload[i].price/1000;\n msg.payload[i].time_start = Number(new Date(msg.payload[i].timestamp));\n //node.warn(i);\n }\n return msg;\n}\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":400,"wires":[["0b9a6c13ac4210bc"]]},{"id":"0b9a6c13ac4210bc","type":"subflow:289686ae32e9ac0c","z":"b468e89a030cb946","g":"eecf1a11e64a8746","x":450,"y":440,"wires":[["20507782eea7238f"]]},{"id":"35e0d54c5ac618c8","type":"inject","z":"b468e89a030cb946","g":"eecf1a11e64a8746","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":450,"wires":[["6ce4aa06b498cbbe"]]},{"id":"e4c19e487e8287f7","type":"group","z":"b468e89a030cb946","name":"Betjening: Vis kun resttimer i listbokser.","style":{"fill":"#e3f3d3","label":true,"color":"#000000"},"nodes":["b51d06a21038e464","5ab88c22ad7b601e","a9ad0882e1fb8f2b","1f96c7a359c6fede"],"x":14,"y":1189,"w":572,"h":122},{"id":"b51d06a21038e464","type":"ui_switch","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"","label":"Vis kun resttimer","tooltip":"","group":"e9e1f6f856a0ef75","order":15,"width":"3","height":"1","passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"check_box","oncolor":"lime","offvalue":"false","offvalueType":"bool","officon":"check_box_outline_blank","offcolor":"grey","animate":true,"className":"","x":320,"y":1270,"wires":[["5ab88c22ad7b601e"]]},{"id":"5ab88c22ad7b601e","type":"change","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"flow.liste2","rules":[{"t":"set","p":"liste2","pt":"flow","to":"payload","tot":"msg"},{"t":"delete","p":"socketid","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":1270,"wires":[["b6089f059556a469","45a6be97437e5578"]]},{"id":"a9ad0882e1fb8f2b","type":"change","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"flow.liste2","rules":[{"t":"set","p":"payload","pt":"msg","to":"liste2","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":110,"y":1270,"wires":[["b51d06a21038e464"]]},{"id":"1f96c7a359c6fede","type":"inject","z":"b468e89a030cb946","g":"e4c19e487e8287f7","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":130,"y":1230,"wires":[["a9ad0882e1fb8f2b"]]}] Tror det skal klare seg å installere node-red-dashboard, node-red-contrib-nordpool-api-plus, og node-red-contrib-cron-plus i paletten utover standard.
    2 poeng
  43. Hvorfor skal en alltid utjevne forbruk? En bør helller ha en modell som bidrar til å flytte last fra tider der nettet er hardt belastet til tider der nettet er lite belastet. Da nytter det ikke med en modell som straffer høyt forbruk på tider der nettet er lite belastet.
    2 poeng
  44. Har handlet mye på Ali og alt har hatt helt akseptabel kvalitet bortsett fra disse 18650 cellene. Har også gått på et par TooGoodToBeTrue tilbud som har vært akkurat det men Ali har alltid ordnet opp. Den verste smellen kosta nesten kr 20.000 men eneste ulempen for meg ble at mine penger var i Kina i et par mnd... Gikk på dette for det KUNNE være en kjempehandel og jeg visste at Ali tok ansvar om det ble en bommert. Ble også betalt med PayPal men deres garanti stoler jeg langt mindre på enn Ali...
    2 poeng
  45. Home Assistant 2024.9 har nå integrasjon for Fujitsu varmepumper. https://www.home-assistant.io/integrations/fujitsu_fglair Jeg har brukt metoden Håvardgj har beskrevet i denne tråden i lengre tid og den har fungert uten problemer, men jeg kommer til å prøve denne integrasjonen når jeg får tid til å oppgradere til 2024.9.
    2 poeng
  46. Merker meg i videosnutten over at der er tydelig "klippelyd" men den er tilnærmet lydløs i praksis. En ser jo også i videoen at gresset er både høyt og vått så det kan være det som ga litt ekstra lyd. Så langt har L15 gjort en god jobb men jeg ser at den blir litt snau for min 750m2 og ganske kompliserte plen så der er en brukt 2018 modell Ambrogio L250 Elite på vei i posten. Denne er specet til 3200m2 så det skal holde...: L15 fikk firmware oppgradering (fra ver 44xx til ver 70xx) i går og det ga en merkbart mer pålitelig klipping. Det er lett å undervurdere L15 siden den er så knøtttliten men den er spesifisert for 600m2 og selv om den ble litt snau for min plen så står den ikke langt tilbake for Husqvarna 315x som er specet til 1600m2. Hadde en stopp i noen dager på Husqvarnaen i sommer og det gjorde at gresset vokste litt i overkant mye. Da den var i gang igjen la den etter seg en masse striper med klippet gress som etterhvert ble gult. Den brukte over en mnd før dette var borte igjen. Ambrogio driver med kompostklipping og det er svært uvanlig at den legger igjen synlige spor etter høyt gress. Har måttet jobbe en del med kantledning, litt fordi Ambrogio og Husqvarna forholder seg litt forskjellig til kantledningen og litt fordi hagen er blitt ganske overgrodd utenfor ledningen samt at jeg har hatt ønske om å optimalisere klippingen flere steder men har sett at 315x ikke vil klare å kjøre de stedene jeg vil. En litt fancy sak med Ambrogio er at en kan "programmere" klipperens oppførsel med kantledningen: Ved å legge en loop ut fra kantledningen i en lengde av 1-2 meter med 5 cm avstand 90 grader ut fra kantldn. vil det gi klipperen beskjed om å følge kantledningen slavisk de neste ca 10 metrene dersom den er i "følg kantledning"-modus. Dette er nyttig når den skal gjennom trange passasjer og også i sammenheng med neste "program". Legg kantledningen i en trekant der kortsidene er 40cm og langsiden er 50cm så vil det få klipperen til å dreie 90 grader, kjøre rett fram til den treffer kantledningen på andre siden og på den måten kjøre forbi "unødvendige" deler av plenen når den er på vei til ladestasjonen. Har tegnet inn noen slike "programmer" her: I utgangspunktet går alltid klipperen med klokken langs kantledningen for å finne ladestasjon. Denne programmeringen vil kunne spare mye unødvendig kjøretid. Ellers har jeg helt sluttet med å legge kantledning oppå plenen og feste med teltplugger. Nå skjærer jeg en fure med 5" vinkelsliper og dytter ledningen nedi med dette lille verktøyet jeg fant på printables.com:
    2 poeng
  47. Erfarer at topolt er et krav dersom lyskilden er byttbar, for eks pære. Om man bruker led-spotter uten byttbar kilde trengs det ikke. Info Fra min elektriker. Men tabbeboks bak eksisterende boks er vel en grei løsning.
    2 poeng
  48. Jeg har målt varmetapet på min VVB og den er: tap(W) = 2000(0.00135 * t - 0.0384). Dette gjelder for meg der tanken står i et vaskerom på 20grader C. Er det kaldere, som feks i en uisolert kjeller, er tapet større. Så ved 50grader C er tapet 58W og ved 80grader C er tapet 139W. Forskjellen utgjør 709kWt pr år. Med dagens strømpris er det altså litt å spare på å senke temperaturen. 50 grader er nok til at legionella ikke utvikler seg ukontrollert, men de dør ikke heller så jeg varmer opp tanken til 80 grader C to-tre ganger i måneden. Jeg har en OSO tank med OSO sin temperaturfølerstav. Denne er koblet til en esp8266 så jeg har full kontroll på temperatur på 3 steder i tanken. Når den er så lav som 45-50 grader så er det viktig å ha kontroll på det for at temperaturen ikke kommer under dusjvarmt. Temperaturen synker litt på vei til dusj så jeg har funnet ut at 45 grader i VVB er absolutt laveste jeg kan ha uten at noen i huset klager.
    2 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.