Gå til innhold
  • Bli medlem

SveinHa

Medlemmer
  • Innlegg

    1 747
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    111

Alt skrevet av SveinHa

  1. SveinHa

    Analyser MQTT trafikk.

    Der finnes sikkert en del verktøy for å analysere MQTT trafikk men jeg fant ut jeg skulle lage et selv spesifikt med tanke på kun zwavejs2mqtt og zigbee2mqtt. Jeg har laget loggedelen i Node-Red men regner med tilsvarende funksjon finnes i andre verktøy. Først logges all aktuell trafikk. 2 varianter her: Abonner på ALL MQTT trafikk og filtrer ut det du er interessert i Abonner på kun aktuelle topics Alle MQTT nodene er disablet her, enable enten øverste eller en eller flere av de nederste og la dette kjøre en tid, gjerne en time eller 2. Da havner alle aktive topics i filen MQTT_topics.txt. En liten bit av den kan se slik ut: zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Upper_Humidity_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Lower_Humidity_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Upper_Lighting_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Lower_Lighting_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Upper_Ultraviolet_Limit zwaveGar/Uteomraade/UtelysGarasje/switch_multilevel/endpoint_1/targetValue/set zigbee2mqtt/Lys/EldhusUte/set zigbee2mqtt/Lys/SpisebordDim/set zigbee2mqtt/Lys/Sov1Tak/set zigbee2mqtt/HUE/Garasje1/set zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Lower_Ultraviolet_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Temperature_Recover_Limit/65280 zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Recover_Limit_Temperature_Unit/255 zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Humidity_Recover_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Lighting_Recover_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Ultraviolet_Recover_Limit zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Temperature_Below_Lower_Limit/1 zwaveGar/Garasje/BevegAeotec/configuration/endpoint_0/Temperature_Above_Lower_Limit/16 Kjør så dette Python scriptet: import os command = "sort MQTT_topics.txt -o MQTT_topics_s.txt" res = os.system(command) count = 0 fileIn = open('MQTT_topics_s.txt') fileOut = open('MQTT_topics_c.txt', 'w') line=fileIn.readline() while len(line)!=0: newLine=fileIn.readline() if newLine[:newLine.rfind('/')] == line[:line.rfind('/')]: # Begrens strenglengde til siste "/" count += 1 else: subline = line[:line.rfind('/')] # Begrens strenglengde til siste "/" msg = str(count) + ", " + subline + '\n' fileOut.write(msg) count = 0 line = newLine fileIn.close() fileOut.close() command = "sort -nr MQTT_topics_c.txt -o MQTT_topics_c.txt" res = os.system(command) res = os.remove('MQTT_topics_s.txt') ...og der dukker opp en fil med navnet MQTT_topics_c.txt som inneholder alle topics fram til siste "/" med antall duplikater funnet sorterrt synkende: En liten bit av den kan se slik ut: 109, zigbee2mqtt/IKEA/Kjok_TrafoS 109, zigbee2mqtt/IKEA/Kjok_TrafoN 108, zigbee2mqtt/IKEA 96, zwave/TekniskRom/QB2/sensor_multilevel/endpoint_3 96, zigbee2mqtt/Nedis 88, zwave/TekniskRom/QB2/sensor_multilevel/endpoint_0 87, zwaveGar/Garasje/BevegAeotec/battery/endpoint_0 82, zigbee2mqtt/Solar 80, zwaveGar/Garasje/BevegAeotec/sensor_multilevel/endpoint_0 78, zwave/Teknisk/Gulvtemperaturer/sensor_multilevel/endpoint_4 77, zwaveGar/Uteomraade/UtelysGarasje/switch_multilevel/endpoint_1/targetValue 77, zigbee2mqtt/Solar/PwrInDiesel 77, zigbee2mqtt/Solar/PwrIn NodeRed nodene er rimelig grunnleggende og kan importeres herfra: [{"id":"2b42c795f7798f70","type":"mqtt in","z":"1dce5ca2ce2c0a55","d":true,"name":"","topic":"#","qos":"2","datatype":"auto","broker":"6db118ed1b0c56de","nl":false,"rap":true,"rh":0,"inputs":0,"x":150,"y":2140,"wires":[["4417bad8572db2ed"]]},{"id":"4417bad8572db2ed","type":"change","z":"1dce5ca2ce2c0a55","name":"topic2payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":2140,"wires":[["5ade4ca28718f0ef"]]},{"id":"b2d5a3fda7df79f1","type":"file","z":"1dce5ca2ce2c0a55","name":"","filename":"/home/pi/log/MQTT_topics.txt","appendNewline":true,"createDir":true,"overwriteFile":"false","encoding":"none","x":790,"y":2230,"wires":[[]]},{"id":"5ade4ca28718f0ef","type":"switch","z":"1dce5ca2ce2c0a55","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"zwave","vt":"str"},{"t":"cont","v":"zigbee","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":540,"y":2140,"wires":[["b2d5a3fda7df79f1"],["b2d5a3fda7df79f1"]]},{"id":"e70b6f1574b9e395","type":"mqtt in","z":"1dce5ca2ce2c0a55","d":true,"name":"","topic":"zwave/#","qos":"2","datatype":"auto","broker":"6db118ed1b0c56de","nl":false,"rap":true,"rh":0,"inputs":0,"x":160,"y":2190,"wires":[["715f21d7a7c96200"]]},{"id":"897acaa4eb04c040","type":"mqtt in","z":"1dce5ca2ce2c0a55","d":true,"name":"","topic":"zwaveGar/#","qos":"2","datatype":"auto","broker":"6db118ed1b0c56de","nl":false,"rap":true,"rh":0,"inputs":0,"x":170,"y":2240,"wires":[["715f21d7a7c96200"]]},{"id":"74edcc6a00fabba3","type":"mqtt in","z":"1dce5ca2ce2c0a55","d":true,"name":"","topic":"zigbee2mqtt/#","qos":"2","datatype":"auto","broker":"6db118ed1b0c56de","nl":false,"rap":true,"rh":0,"inputs":0,"x":170,"y":2290,"wires":[["715f21d7a7c96200"]]},{"id":"715f21d7a7c96200","type":"change","z":"1dce5ca2ce2c0a55","name":"topic2payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":2230,"wires":[["b2d5a3fda7df79f1"]]},{"id":"c8766bd440588a3b","type":"comment","z":"1dce5ca2ce2c0a55","name":"Logg MQTT data for analyse","info":"","x":220,"y":2090,"wires":[]},{"id":"6db118ed1b0c56de","type":"mqtt-broker","name":"DaleMQTT","broker":"172.16.0.94","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"5","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}] Dette her er versjon 1, finner nok på noe bedre etterhvert...
  2. Så lenge du har hele infrastrukturen på plass ville jeg heller satset på styring av den berederen du allerede har. Mange zwave/zigbee kontaktorer som egner seg til det bruket.
  3. Ja, det kommer jo an på både størrelse på bereder og bruksmønsteret. Jeg kan lett ha min av i et par døgn men så er den 300 liter og vi er bare 2.5 pers og vi dusjer ikke så veldig mye.
  4. Vet ikke om jeg kan gjøre det. Har lett litt etter variabeltyper uten å finne noe... Ny variant: node.warn(kWh_part); kWh_part = kWh_part - 45000000; node.warn(kWh_part); Samme resultat:
  5. La inn: node.warn(kWh_part) node.warn(kWh_part - 45000000) helt i slutten av scriptet og resultatet er: Blir ikke stort klokere... Men den automatiske feilrettingen gjør jobben, har ikke fått noen katastrofer siden jeg la inn den og eneste ulempen, bortsett at det er å rette feil feil, er at jeg mister 2 sekund energidata en gang og 2 i døgnet og det er uvesentlig.
  6. Sjekker, takker og bukker for tips. Edit: Et slikt script: var a = 23000000; var b = 36000000; node.warn(a); node.warn(b); node.warn(a-b); resulterer i:
  7. Jeg hadde ikke sløyfe der i utgangspunktet men mistenkte at kWh_part noen ganger var større enn 36000000, normalt skal den ikke kunne bli det. Det er nok bare de gangene scriptet feiler... Vet egentlig ikke hvilken type variabel det er men har sjekket at den i alle fall kan inneholde 100 ganger 36000000.
  8. Feilrettingsrutinen gjør jobben men jeg merker meg at der er et tidspunkt som går igjen, 1m10s over heltimen: Skjønner likevel ikke hva som skjer...
  9. Jeg bruker også reell strømpris i de daglige beregningene selv om forskjellen på den og råpris varierer fra time til time og sånt sett ikke er reell (hvit: Råpris, gul inkl nettleie og oransje også inkl foreløpig strømstøtte): Strømstøtten has jo øket med rundt 40 øre på bare noen få dager nå... Flere ganger i høst har reell strømpris vært negativ og også flere ganger vært positiv i starten av måneden men etterhvert som strømstøtten har blitt mer reell har totalprisen blitt negativ.
  10. Jeg vil nå si at vv.bereder er en enkel måte å spare penger på. Du sparer ikke energi, som du allerede har funnet ut, men å varme berederen til kr 3.42/kWh koster mindre enn kr 7.09/kWh (som er aktuelle priser uten strømstøtte/nettleie i dag)
  11. Ja, bare at regnestykket inkludert strømstøtte vet du ingenting om i det øyeblikket strømmen forbrukes, du vet kun i forhold til timene før og etter. Resultatet blir det samme: Kjøper du billig blir totalen langt rimeligere enn om du kjøper dyrt selv om tallene ikke er klare før måneden er slutt..
  12. Tja, det er jo det som til slutt går ut av kontoen men de tiltakene du gjør fra dag til dag relateres jo til faktisk strømpris her og nå. Strømstøtten vet en jo lite om i begynnelsen av måneden men blir sakte men sikkert mer pålitelig time for time...
  13. Jeg har heldigvis for det meste gamle frysebokser, 2 stk fra 1990 eller tidligere, 1 kjøl/fryseskap fra samme tidsperiode, alle stående i eldhus som for tiden holder +1 grd.C. Alle fryseboksene holder ca -20 grd.C og energiforbruket pr enhet ligger normalt på 1.6 kWh/døgn men er nå nede i 0.9 kWh/døgn. Samsung French door kjøl/fryseskapet i huset bruker også rundt 1,7 kWh/døgn.
  14. Installerte et snøsmelteanlegg i fortau en gang i et annet årtusen, skulle være svært så flotte greier med sensorer i overflaten men i praksis tok det 3 dager fra snøen falt til den begynte å smelte... så varmekableme ble slått manuelt på hele snøsesongen i stedet for automatisk styring med sensorer... Selv om værmeldinger kan være veldig så som så har jeg nok mer tro på en styring ut fra værprognoser...
  15. For the record: Node-Red har en "AMS Decoder" som dekoder data fra Kamstrup, Aidon og Kaifa målere uten ElWiz.
  16. Ser sånn ut ja... https://www.nrk.no/vestland/omdommekrise-for-straumselskap_-_-difor-forlet-vi-tibber-1.16213906
  17. Hvis du skal tjene stort på annen type automasjon på det anlegget må du nok ha en slags spotpris/timepris på fellesvarmen slik at det vil svare seg å kjøre på med varme når den er lavt priset. Tror jeg ville bare latt den delen av anlegger gå som det går...
  18. ...som å kunne velge Node-Red som system
  19. Tibbers estimat for desember er kr 4472.- men så langt har jeg kommet opp i kr 1661.-, kompensert fram til forfallsdato 21. blir det kr 2906.- Tror jeg hopper på 30 dagers gratis betalingsutsettelse...
  20. Merksnodige greier... Endret tilbake til "kWh_acc = kWh_acc + 0.01" og det feiler i ny og ne likevel. Høyeste verdien jeg har sett er omlag 207132.10569 og den økningen skjer i løpet av EN gjennomkjøring... d=new Date(); var kWh_part = context.get("kWh_part"); var prev_hour =context.get("prev_hour"); var previous_time =context.get("prevtime"); var prev_h_ts =context.get("prev_h_ts"); var kWh_acc =flow.get("kWh_acc"); var kWh_accGet = kWh_acc; // For DEBUG, lagre lest verdi i annen variabel i tillegg for evt bruk senere var value=Number(msg.payload); var d=new Date(); var hours=d.getHours(); //the hour (0-23) var timeest = 0; var kWh_est = 0; var kWh_prev_h = 0; // Finn antall mS siden forrige melding ble mottatt var end_time=d.getTime(); var difference=end_time-previous_time; previous_time=end_time; //Akkumuler måleverdi hver gang den dukker opp kWh_part += (value * difference); //node.warn("W x diff: " + (value * difference)); while (kWh_part > 36000000){ // Midlertidig variabel inneholder mer enn 0.01 kWh //ms til H, W til kW, 2 desimaler 1000*60*60*1000/100 = 36000000 kWh_acc = kWh_acc + 0.01; //inkrementer akkumulert verdi kWh_part = kWh_part - 36000000; //...og trekk fra samme verdi i kWh_part node.warn("kWh_acc inc: " + kWh_acc); } // DEBUG if (kWh_acc > 10 || prev_hour != hours){ node.warn("kWh_accGet:" + kWh_accGet); node.warn("kWh_acc:" + kWh_acc); node.warn("kWh_part:" + kWh_part); node.warn("prev_hour:" + prev_hour); node.warn("previous_time:" + previous_time); node.warn("prev_h_ts:" + prev_h_ts); node.warn("value:" + value); node.warn("hours:" + hours); node.warn("difference:" + difference); } // Ta vare på siste akkumulerte timeverdi og nullstill if (prev_hour != hours){ kWh_prev_h = kWh_acc; kWh_acc = 0; prev_h_ts = d.getTime(); //Tidspunkt for start estimering prev_hour = hours; flow.set("kWh_prev_h", kWh_prev_h); } //Estimer total for denne time if (kWh_acc >= 0.00){ //*****Vent litt hver time for å finne nyttige data å jobbe med timeest = d.getTime() - prev_h_ts; kWh_est = (kWh_acc/timeest) * (60*60*1000) } else { kWh_est = kWh_prev_h; } if (kWh_acc > 20){ kWh_acc = kWh_accGet; node.warn("kWh_acc > 20, automatisk satt til kWh_accGet (sikkerhetsfunksjon)"+kWh_accGet); } context.set("kWh_part",kWh_part); context.set("prevtime", previous_time); context.set("prev_hour", prev_hour); context.set("timeest", timeest); context.set("prev_h_ts", prev_h_ts); flow.set("kWh_acc",kWh_acc); flow.set("kWh_est", kWh_est); return; Har laget et par debug funksjoner, en som dumper alle aktuelle variabler til logg ved feil og en gang i timen "if (kWh_acc > 10 || prev_hour != hours){" og en annen som "sletter" katastrofen og gjør at ting og tang fortsetter "if (kWh_acc > 20){"
  21. Jeg lurer jo på om de rett og slett ikke hadde tid, kassen tom og de MÅ gjøre noe for ikke å brekke ryggen momentant. Nå har de kjøpt seg en mnd ekstra men resultatet blir det samme...
  22. Nå kan det jo så langt i måneden se ut til at den prisen treffer ganske greit men hvordan de har klart å estimere et langt høyere forbruk på de første ukene i desember enn jeg hadde i hele november er verre å svelge... Det lukter...
  23. Må ikke snakke stygt om kinnskjegg Var en tur ute med snøfreseren i dag:
  24. Et sikkert tegn på at de tjener for godt er masse reklame på TV... Jeg har gitt opp Tibber, ikke fordi jeg får noe billigere strøm å snakke om andre steder men om jeg stilltiende godtar at de bruker meg som bank vil de fortsette med det og lignende ting i framtiden. Heldigvis sa de på radioen i dag at Tibbers omdømme var gått fra topp til 104. plass... Ikke vet jeg hvor lang den listen er men 104. er nok rimelig jamngodt med "Lite Godt -" (for de som husker gammeldagse karakterer).
  25. Litt gjetting: Øverst er nok en termoventil som regulere varmen på vannet til gulvene, midterste aner jeg ikke og nederst kan være termostat som kun tillater å åpne vannkursene bare når vannet er varmt nok, alternativt stenger pumpen om det blir for varmt. Med litt flaks finner du manualen til Danfoss-boksen og kan tolke ut fra den og hvor ting er koblet til...
×
×
  • 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.