Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Mitt Home Assistant system


Anbefalte innlegg

Hei!

 

Mitt første møte med "smarthjem" var at jeg ønsket å styre varme (panelovner) da jeg var student. Alt for å spare strøm... Det var med mye triksing med Arduino og null GUI. Det var helt greit, men veldig tungvindt (men billig) å sette opp alt. Nå som jeg ikke er student lengre, eier en leilighet har jeg litt flere muligheter.

 

Dagens system:

Kjører i dag Home Assistant, etter å ha nylig kjørt Domoticz. Grunnen til at jeg gikk over til Home Assistant var pga bedre GUI, og fordi jeg liker å prøve nye ting. Home Assistant er fortsatt ganske ferskt, men med hyppige oppdateringer kommer det nye bugfixer og features ganske ofte.

 

Varme:

Har kun panelovner, bortsett fra gulvvarme på badet. Badet lever sitt eget liv, men resten av varmen styres av en blanding av 433mhz og z-wave temperatur-sensorer som igjen skru av/på z-wave brytere. Dette fungerer utmerket. Her har jeg implementert vanlig modus (ukedag / helg) og ferie-modus. Har også akkurat lagt inn "gjestemodus" slik at gjesterommet ikke blir overstyrt når jeg har overnattingsbesøk.

 

Lys:

I stua og på soverommet har jeg Philips Hue. På kjøkkenet og i gangen har jeg z-wave brytere. Har planer om å utvide med z-wave bryter på kontoret/gjesterommet også, men dette har ikke vært prioritert siden dette er et rom jeg ikke bruker daglig.

 

Tracking:

Bruker i dag IFTT-appen på samboeren sin telefon til å tracke om hun er hjemme eller ikke. Selv bruker jeg iOS og har hittil brukt appen Geofency. Nå som Home Assistant har en nugelunde stabil iOS-app vurderer jeg å gå over til denne. Den er fortsatt i lukket beta, men den blir forhåpentligvis lansert innen kort tid.

Grunnen til at jeg bruker tracking er for å kunne sette leiligheten i "bortemodus" og skru av lys, senke temperaturen og aktivere "alarmen". Kanskje ikke den mest sikre måten å aktivere/deaktivere alarmen på, men som en første versjon fungerer det greit.

 

Script som kjører:

  • Nordlysvarsler: Har et script som sier i fra om det er stor sannsynlighet for at det er nordlys ute, men kun om det er mørkt ute og skyfritt.
  • Alarm: Hvis ingen av oss er hjemme, skrur "alarmen" seg på. Her sjekker jeg alle dør-sensorer og bevegelsessensorer, bortsett fra bevegelsessensoren i gangen pga hunden. Hunden beveger seg sjelden mens vi er på jobb, men greit å ikke få for mange falske alarmer. Om en av oss forlater leiligheten og en dør eller vindu er åpent, får vi en push-melding som varsler oss.
  • Fryser- / kjøleskapdør-varsler: Vi hadde et lite uhell for litt siden hvor fryseren ikke var lukket ordentlig igjen. Denne står i boden og ikke akkurat noe vi holder øye med hver dag. Lang historier kort; denne sto oppe i ca 2 uker. Har derfor montert sensorer på alle fryser- og kjøleskapsdører som varsler om disse har vært åpne i mer enn 3 minutter. Denne spammer meg i intervallene 3 min, 5 min, 10 min, 20 min, 30 min og 60 min.
  • Automatisk kamera: Har foreløpig kun ett kamera. Det er plassert i gangen og filmer hunden når vi er borte. Vil ikke la hunden bare ligge i et lite bur, så burdøra er oppe og har tilgang på hele gangen. Derfor har jeg et kamera som filmer hunden mens vi ikke er hjemme. Har fulgt med på kameraet mens jeg har vært på jobb, men hun beveger seg i snitt to ganger mens vi er borte, dvs når robotstøvsugeren starter i naborommet (stue/kjøkken) og når hun drikker vann. Dette kameraet står rett utenfor badet og soverommet, så ønsker at dette kun filmer mens vi ikke er hjemme. Dette er løst med en Raspberry PI som hele tiden holder styr på om vi er hjemme eller ikke, og skrur på strømmen til kameraet.
  • Vitrineskap / ølglass-skap: Har et skap i stua som er dedikert til ølglass. Ja, jeg samler på ølglass. Har godt over 50 glass. Ikke alle er unike, men man må ha et til hvert sitt bruk. Her har jeg Philips Hue Lightstrip langs kanten på døra som lyser opp skapet. Dette lyser matcher hele tiden taklyset, som også er Philips Hue-pærer, men siden jeg ikke kunne si "alltid sett dette lyset til 1/3 av taklyset" måtte jeg skrive et script som gjorde dette. Har også gjort at dette lyset ikke skal være aktivert på dagtid, selv om taklyset er på. Det fader sakte men sikkert på i løpet av en periode på 2 timer før solnedgang og etter solnedgang.

 

Diverse hardware:

  • Raspberry Pi 3: Home Assistant kjører på denne. Mer info om denne i neste avsnitt.
  • Raspberry Pi 2: Brukte denne til Domoticz før, men ble bytta ut til fordel for en RPI3 når jeg gikk over til Home Assistant. Dette var egentlig litt tilfeldig, men opplevde denne PIen som ganske ustabil. Viser seg å være to forskjellige minnekort som holdt på å dø, begge av merket Transcend.
  • Raspberry Pi 1: Styrer kameraet jeg nevnte over her. Dette er kun et relé som skrur av/på kameraet og som snakker samme med Home Assistant.
  • Server: Dette er en 4-5 år gammel server jeg bygde meg som håndterer mange små oppgaver. Eksempler: Plex Media Server, MySQL, diverse nettsider osv.
  • Ubiquiti Amplifi: Kjøpte meg nytt wifi-mesh network for et par måneder siden. Bor i en leilighet med tykke murvegger, noe som gjorde at jeg fikk elendig wifi-signal gjennom disse veggene. Hadde elendig wifi-signal i ca halve leiligheten, så kjøpte meg først en repeater som utvida nettverket mitt. Dette ble en fiasko siden mobilene våre "hang igjen" på wifi-punktene når vi bevegde oss rundt i leiligheten. Derfor gikk jeg for et mesh-nettverk, som fungerer utmerket!

 

RPI3 oppsett:

  • 16 GB Sony minnekort. Har hatt en del billige minnekort som har streika på Raspberry PIer så har nå kjøpt inn Kingston og Sony minnekort. Begge disse merkene virker solide og tåler litt skriving. Har også flytte databasen bort fra RPIen for å unngå unødvendig mye skriving til minnekortet.
  • iPad lader
  • Razberry 2 (zwave)
  • RFXtrx433E til mine 433mhz temperatursensorer

 

Z-wave noder:

  • 3 x Fibaro dimmere: Dimming av lys over kjøkkenbord + 2 punkter i gangen.
  • 1 x Fibaro switch: Denne er ikke montert, men planen var å få denne montert på gjesterommet.
  • 1 x Qubino dobbel switch: Denne styrer belysning over bardisk og på kjøkkenet.
  • 2 x Fibaro Wall switch (gamle typen): Bruker disse til å styre to panelovner.
  • 1 x Telldus "fjernstrømbryter": Samme som over.
  • 4 x Aeotec Multisensor ZW100: Bruker disse som temperatursensorer og bevegelsessensorer. Valgte denne fordi den kan få strøm fra USB!
  • 1 x Everspring vannlekkasjesensor: Oppdaget at det lakk litt rundt vaskemaskinen i høst. Hadde kommet borti avløpet når jeg monterte tørketrommel og den begynte å lekke. Det var bare snakk om få dråper, men kjøpte meg en vannlekkasjesensor slik at jeg kunne sjekke om det var tett uten at jeg måtte sitte og se på at vaskemaskinen vasket klær...
  • 1 x Veggbryter (batteri): Har brytere på kjøkkenet, men ville kunne styre alle lys på kjøkkenet på vei inn i stua. Så monterte en slik veggbryter ved siden av spisebordet slik at jeg kunne dimme lyset over spisebordet og skru av/på alle lys på kjøkkenet uten å reise meg. Kunne gjort det via telefonen, men liker å ha muligheten til å bruke brytere.

 

Planlagte automatiseringer:

  • Har min surround-receiver i en tilnærmet lukket tv-benk, kun et par hull bak til ledninger. Har lagt merke til at det blir ganske varmt her! Min gamle receiver ble langt i fra så varm, men den var ganske "dum" i forhold til min nye, som blant annet har AirPlay, Bluetooth, Spotify Connect, wifi osv. Så jeg tipper denne bruker en del mer strøm enn min gamle. Har ikke målt temperaturen inni skapet ennå, men skal få kobla opp en temp-sensor her og sjekke hvor varmt det faktisk blir. Tenker jeg kobler opp en Arduino / Raspberry PI her som kan overvåke temperaturen og evt starte en ganske lydløs vifte om det blir for varmt.
  • Har planer om å få bytta ut minst to av mine 433mhz temperatursensorer med NodeMCU. Dette rett og slett fordi jeg vil ha færrest mulig sensorer på batteri.
  • Miele Scout RX1 robotstøvsuger: Denne er egentlig ganske dum. Denne starter hver dag ved et gitt klokkeslett. Har ikke mulighet til å stille inn at det er helg eller at jeg har hjemmekontor e.l.. Så det må på et tidspunkt automatiseres på en eller annen måte.
  • Automatiske persienner: Jeg hadde håpet at mine 4 x MOVEZ skulle ankomme før sommeren, men det ser litt mørkt ut. Planen her er å bruke 2 av disse til å ta ned persiennene på to vinduer i stue midt på dagen / ettermiddagen om vi ser på tv. Dette kan enkelt regnes ut ved å ta i bruk vinkel på sola og om det faktisk er sol ute. Trenger også muligens hjelp av en lyssensor for å sjekke hvor mye lys det faktisk er. Den tredje skal jeg bruke på soverommet som en slags wakup-light. Den siste vet jeg ikke helt hva jeg skal bruke til, men tror jeg skal bruke den til å justere bledningen på den ene persiennen, som i dag nesten hele tiden er nede for å unngå så mye innsyn (bor i 1. etasje).
  • "Hacke" IKEA Ansluta: Jeg har planer om å få gjort disse lysene på kjøkkenet smarte. Så litt på dette i fjor, men fant ingen gode løsninger. For litt siden så jeg at RFLink har nå fått støtte for IKEA Ansluta!

 

Legger ved noen bilder av hvordan UIet mitt ser ut. Det meste av brytere o.l. er skjult, så det er ikke så mye å ta bilde av.

 

58f2197844619_ScreenShot2017-04-15at14_59_23.thumb.png.33f48ffa28cf489f2e91fe30e6544ce9.png58f2197bd7334_ScreenShot2017-04-15at14_59_26.thumb.png.606c1339881dedd4e42a5ff33387c49c.png58f2198230174_ScreenShot2017-04-15at14_59_31.thumb.png.c3face015d6f38dc815c1dc501c50fdf.png58f2197f05c79_ScreenShot2017-04-15at14_59_35.thumb.png.12ae04d43474ee0225453f30189fe715.pngIMG_0484.thumb.jpg.4fb94bce845b8ee886ca4513cc31785d.jpgIMG_0485.thumb.jpg.be03c3530a86c1822993f7f4a96d2811.jpgIMG_0488.thumb.jpg.06b9cec47bec1fbfda8ad063a2077533.jpgIMG_0487.thumb.jpg.afb09c6f53cb800355549da883ec0aef.jpgIMG_0486.thumb.jpg.b4c49cad097a2741c82b312987a5842a.jpg

  • Like 5
Lenke til kommentar
Del på andre sider

5 timer siden, LaStrada skrev:

Har min surround-receiver i en tilnærmet lukket tv-benk, kun et par hull bak til ledninger. Har lagt merke til at det blir ganske varmt her! Min gamle receiver ble langt i fra så varm, men den var ganske "dum" i forhold til min nye, som blant annet har AirPlay, Bluetooth, Spotify Connect, wifi osv. Så jeg tipper denne bruker en del mer strøm enn min gamle. Har ikke målt temperaturen inni skapet ennå, men skal få kobla opp en temp-sensor her og sjekke hvor varmt det faktisk blir. Tenker jeg kobler opp en Arduino / Raspberry PI her som kan overvåke temperaturen og evt starte en ganske lydløs vifte om det blir for varmt.

 

Hadde samme utfordring. Løst med 2 stk 80mm hull (under og på siden mot hjørnet av rommet), den under har en 80mm vifte med USB-tilkobling som er koblet til et støpsel i en on/off-Nexa. Temp overvåkes med en NodeMCU. :) 

Lenke til kommentar
Del på andre sider

Ser ut som en veldig bra oppsett :)

 

Akkurat startet med Home Assistant selv og synes det fungerer veldig bra. Tar fort noen timer å komme inn i hvordan man setter opp config filene men når man først er i gang går det ganske så lett :) Prøvde en del av de andre men falt tilbake igjen på HASS da jeg synes det ser best ut og muligheter for å tilpasse slik man ønsker.

Lenke til kommentar
Del på andre sider

  • 3 uker senere...

Glemte denne tråden litt...

 

Nye script som kjører:

  • Får nå varsler om det skulle begynne å brenne (facebook, mail og push melding)
  • Kan nå sette temperaturen på dagtid, kveld, natt osv for de forskjellige rommene. Før måtte jeg endre yaml-filene for å endre temperatur. Klokkeslettene er fortsatt hardkodet, men det tror jeg skal gå bra. Har også lagt inn en bryter for å aktivere/deaktivere "wakeup heat", dvs at jeg øker temperaturen litt før vi står opp. Jeg liker å ha det litt kaldt på soverommet, men ikke å stå opp når det er kaldt... Derfor er det greit å sette temperaturen litt høyere 30-60 min før jeg faktisk står opp. Denne kan deaktiveres nå fordi jeg ikke trenger det nå som det begynner å bli varmere.
  • Reise til/fra jobb endres mer dynamisk i forhold til om det er jobbdag eller ikke (worday sensor). Må fortsatt endre denne litt slik at den skjules helt om leiligheten står i feriemodus.

590dd5404aae4_ScreenShot2017-05-06at15_50_11.thumb.png.f7785cc3ce1fc792caed6a3622735795.png590dd5431421a_ScreenShot2017-05-06at15_50_20.thumb.png.e1355bfb9f7ccb2d39f22428b0db2569.png

 

Har nå også fått lagt til en "media-fane" som lar meg kontrollere Pioneer receiveren og spotify. Veldig greit med receiver-kontroll her om HDMI-cec av en eller annen grunn skulle feile litt, feks når tv-dekoder og Apple TV krangler om hvem som skal vise bilde... Da ender det gjerne med at volumet ikke fungerer uten at jeg skrur alt av og på igjen. Nå kan jeg endre dette rett fra home assistant.

590dd548ae55e_ScreenShot2017-05-06at15_52_36.thumb.png.9d60a3ba4c380cab25077c975b31b735.png

 

Som jeg nevnte i første posten har jeg et script som gir meg nordlysvarsel. Her merker jeg at jeg må optimalisere litt! Feks så gir den meg mange push-meldinger midt på natta, få timer før jeg står opp og skal på jobb. Her må jeg endre til at jeg ikke får så mange varsler på natta før jeg skal på jobb, og litt lengre når jeg ikke skal på jobb dagen etter. En annen ting er at jeg lar den sende meg push-meldinger 2 timer etter solnedgang og fram til 2 timer før soloppgang. Det fungerte bra i vinter, for da var det alltid mørkt. Men nå i mai i Trøndelag er det ikke mørkt nok til å se nordlyset! Må derfor oppsettet på det. Helst bør jeg ha en sensor som sier hvor mørkt det er ute, uavhengig av solnedgang/soloppgang.

 

Har fått en del pakker fra eBay i forbindelse med "vifteprosjektet" til receiveren min, men har selvfølgelig ikke fått viftene... 

 

@Dennis87 Ja, er knotete å konfigurere ting. Men når man først har kommet i gang synes jeg det går ganske bra. En ting som fortsatt plager meg, er at om man feks har en skrivefeil i konfigurasjonen kan den si at det feiler på den og den linjen. Men hvis den linjen inkluderer en mappe med mange andre filer, gir det meg svært slite. Har derfor lært meg å stort sett endre en og en fil for å så kjøre "check_config" for å sjekke om alt fungerer.

 

@KnutM Jeg har ingen lås, så jeg har ingen erfaring med låser. Jeg bor i et boretslag så jeg kan ikke endre utsiden av døra. Så litt på Danalock o.l., men har ikke funnet en god nok lås. Ser det kommer flere låser på markedet nå, men jeg venter til jeg har lest om folk som har tatt de i bruk før jeg bestiller en.

Lenke til kommentar
Del på andre sider

  • 4 uker senere...

Har de siste ukene mottatt en del ting jeg har bestilt fra ebay, og nå som det har vært langhelg har jeg fått gjort litt:

 

TV-benk:

Her har jeg brukt en Raspberry Pi 1 i noen uker for å logge temperatur. Det bekreftet mine mistanker, det blir varmt her! Oppe i 37-39 grader etter en kort film når det ikke er kjempevarmt i leiligheten. Har ikke prøvd å se lengre filmer eller brukt anlegget til musikk eller lignende, men jeg antar temperaturen kan bli noe høyere.

 

Har nå koblet opp en NodeMCU med en DS18B20 temperatursensor som logger temperatur via mqtt. Prøvde meg på å styre en PC-vifte (12v) fra Kina med PWM, men etter mye styr fikk jeg ikke dette til å fungere med en vanlig Arduino eller NodeMCU. Prøvde til slutt vifta i en PC og det viste seg at PWM-inngangen ikke fungerer... Så da får jeg se om jeg går for en ny vifte eller bruker 5v som spenning på vifta + en transistor e.l. som skru av/på vifta ved behov. Mangler fortsatt en koblingsboks, så bilder osv kommer senere når alt er på plass.

 

Soverom:

Her har jeg koblet opp en NodeMCU med en DHT11 som logger temperatur og luftfuktighet. DHT11 er ikke like nøyaktig som DHT22, så denne kommer til å bli byttet ut når jeg får DHT22 sensorer i posten. Tidligere har jeg hatt en 433mhz sensor fra Clas Ohlson, men denne sliter med dårlig signal (murvegger...), noe som fører til at temperatursensoren kan være utilgjengelig i flere timer. Siden denne temperatursensoren styrer panelovnen på soverommet kan dette føre til ustabile temperaturer. Tenker at den nye NodeMCU-sensoren blir "hovedsensoren" med 433mhz som backup i tilfelle wifi går ned eller lignende. Tror ikke det blir så populært om det blir 25+ grader på soverommet om dette skulle streike midt på natta.

 

Overvåkningskamera:

Som jeg nevnte i første posten her, styrer jeg strømmen til et overvåkningskamera. Har nå byttet ut en Raspberry Pi med en NodeMCU som styrer releet som tar strømmen til kameraet. Det fungerer på samme måte som før, men bruker mye mindre strøm, er raskere til å boote ferdig og få nettverk ved strømbrudd (ca 5 sek vs 90 sek), og ikke minst, den er mye mindre, dvs enklere å gjemme bort. Nå fikk jeg plass til NodeMCU + relé i en koblingsboks, i motsetning til RPI case + koblingsboks før.

 

Kegerator (planlegging):

Driver og planlegger kegerator-sensorer. For de som ikke vet hva en kegerator er, kan dere google dette. Ønsker å logge temperatur, luftfuktighet og om døra er lukket. Bruker fortsatt den innebygde termostaten i kjøleskapet så jeg har lyst til å logge temperaturen her for å sjekke om temperaturen er stabil og nøyaktig nok. Har en Fibaro Binary Switch liggende som jeg ikke bruker lengre, så det er mulig å bruke denne, men da får jeg ikke luftfuktighet.

 

 

Kommer til å publisere kode til alle sensorene etterhvert, men nå inneholder koden sensitiv informasjon til wifi og mqtt, så dette må ryddes litt opp i før jeg legger det ut.

  • Like 2
Lenke til kommentar
Del på andre sider

10 timer siden, LaStrada skrev:

TV-benk:

Her har jeg brukt en Raspberry Pi 1 i noen uker for å logge temperatur. Det bekreftet mine mistanker, det blir varmt her! Oppe i 37-39 grader etter en kort film når det ikke er kjempevarmt i leiligheten. Har ikke prøvd å se lengre filmer eller brukt anlegget til musikk eller lignende, men jeg antar temperaturen kan bli noe høyere.

 

Har nå koblet opp en NodeMCU med en DS18B20 temperatursensor som logger temperatur via mqtt. Prøvde meg på å styre en PC-vifte (12v) fra Kina med PWM, men etter mye styr fikk jeg ikke dette til å fungere med en vanlig Arduino eller NodeMCU. Prøvde til slutt vifta i en PC og det viste seg at PWM-inngangen ikke fungerer... Så da får jeg se om jeg går for en ny vifte eller bruker 5v som spenning på vifta + en transistor e.l. som skru av/på vifta ved behov. Mangler fortsatt en koblingsboks, så bilder osv kommer senere når alt er på plass.

 

Jeg kjøpte USB-vifter og griller:

 

Tok hull i bunn av TV-benken og monterte vifte der. På siden av TV-benken tok jeg hull og bare grill. Har en NodeMCU med DHT22 som tempgiver og styrer vifta via en vanlig Nexa On/off-plugin. :) 

 

Har bestilt et relé jeg tenkte koble vifta til i stedet (og NodeMCU):

 

Node MCU og relé går (forhåpentligvis) i denne boksen:

Sammen med disse (strøm inn via microusb og strøm ut til vifta via en vanlig USB-hunn (slik at jeg enkelt kan koble den fra)):

(disse klippes selvsagt og setter på dupont-connectors)

 

Relé og NodeMCU festes med slike:

 
...er i hvertfall min plan. :) 
  • Like 1
Lenke til kommentar
Del på andre sider

Vifta er ganske stillegående så sånn sett hadde 12v med bare av/på fungert bra nok når jeg ser film. Men i rolige scener hører jeg vifta så da kommer det til å irritere meg, kjenner jeg meg selv rett. Hadde planlagt at vifta skulle skru seg på 20% med PWM ved 32 grader og gradvis opp til 100% ved 45 grader. Etter en del målinger ser det ut til at temperaturen rett over forsterkeren ofte ligger på 30-31 grader etter få minutter tv-titting eller musikk i noen minutter, derfor valgte jeg fra 32 grader sånn at den ikke står på unødvendig ofte.

 

Å ha en nexa eller lignende synes jeg blir litt overkill :P Men tanken har slått meg, i alle fall som en midlertidlig løsning. Har nok av relé-moduler (dog bare moduler med 4 releer) så det er absolutt mulig å bruke det, men har som sagt lyst til å få til PWM på 12v. Mest fordi jeg kan og fordi det er morsomt å prøve nye ting ?

 

Fant et par ethernet-shield i boden rett etter forrige post, så vurderer å bruke kabla nettverk her, selv om en Arduino Uno + ethernet shield tar mye større plass enn en liten NodeMCU. Men jeg liker å ha så mye som mulig kabla når jeg først har lagt opp kabla nettverk dit. Får se hva jeg gjør.

 

@ZoRaC Hvor mye kaldere ble det etter at du monterte vifte? Og ved hvilken temperatur viften seg på?

Lenke til kommentar
Del på andre sider

Ganske stillegående de hos meg også, men det blir resonans i benken og man hører det godt (jeg hadde egentlig tenkt den skulle stå på samtidig med TV, men slo det fra meg ganske kjapt pga støy!). 

20% på 12v vil jo være omtrent som å kjøre den på 5v? :) Jeg oppdaget at den er veldig effektiv - står ikke på mange minuttene for å senke fra 34-27 grader (mener det er terskelene jeg bruker)! :) 

 

Noe skjedde i benken min i desember og vifta har ikke slått seg på siden da - fordi det ikke har blitt varmt nok:

IMG_5367.PNG.baca7b6702b2cd260e7752da47295fd0.PNG

 

Her er en tilfeldig lørdag i oktober:

IMG_5368.PNG.6f24e357233994d9d32a51bc3cdb6603.PNG

 

På disse 8 gangene har vifta gått i bare 25 min tilsammen:

IMG_5369.PNG.b03aea124052831e39fed211c19f78e9.PNG

 

Så da blir det overkommelig støy - bare noen få minutter av gangen. :) 

Endret av ZoRaC
  • Like 1
Lenke til kommentar
Del på andre sider

  • 2 uker senere...
  • 9 måneder senere...

Har fått gjort en del i påsken!

 

Luftkvalitet

Kjøpte en Netatmo Healty Home Coach rett før påske for å logge luftkvalitet på soverommet. Hadde en mistanke om for dårlig luftkvalitet, spesielt på vinteren når ikke ale ventiler er åpne. Har ingen balansert ventilasjon. Denne har ingen ferdig komponent til Home Assistant, men det er enkelt å hente ut verdier fra Netatmo sine APIer så det var enkelt å hente ut data (luftkvalitet, temperatur, luftfuktighet, støy). Baserte meg på denne koden. Synes denne dingsen er litt unødvendig stor og jeg liker ikke at den lever i skyen, men tenkte det var greit å ha en "ferdig" dings som referanse til de andre "luftkvalitetmålerne" jeg tenkte å lage. Har bestilt meg et par BME680-sensorer jeg skal bruke sammen med NodeMCU som også skal logge luftkvalitet. Planen er å ha en sensor i hvert rom, 2 soverom + kjøkken/stue (åpen løsning). Fikk beskjed fra posten nå at disse sensorene har ankommet Norge så de kommer vel snart.

 

Her ser dere grafen siste døgnet. Mangler litt data i går pga en krasj på systemet mitt. Viser seg at RPIen har begynt å fuske når jeg overklokker :( Har vært 100% stabil helt til nå (etter at jeg bytta minnekort for en stund siden), så nå har jeg gått tilbake til default hastighet.

 

5ac362d9c99f0_ScreenShot2018-04-03at12_38_10.png.f75261a117eb2ac20087b6f7f4b7c2c7.png

 

Viftekontroll i TV-benk

Og en liten oppdatering av viftekontrollen jeg har nå snart holdt på med i et år... Har kjøpt 3 nye vifte til dette med PWM-styring. Var egentlig et lite bomkjøp siden 0% PWM ikke stopper viftene, de vil aldri gå lavere enn 40% uansett hva jeg gjør. Måtte løse dette ved å ha en ekstra transistor som kobler ut strømmen om jeg setter viftene til 0%. Har lært at man må lese specs på vifter. Jeg trodde 0% PWM = 0% hastighet, 50% PWM = 50% hastighet osv. Det stemte tydeligvis ikke.

 

Jeg har sagd et nytt hull på baksiden av TV-benken slik at jeg fikk plass til 2 x 120mm som nå blåser luft inn i TV-benken. Er plassert i hvert sitt hjørne, øverst til venstre og øverst til høyre. Det ble øverst rett og slett fordi det er mange ledninger nederst i TV-benken (høyttaler-ledninger, HDMI-kabler, nettverkskabler osv). Tenkte dette kunne gi bedre sirkulasjon, samtidig som jeg kan la viftene gå på en lavere hastighet enn om jeg har én vifte. Satser på at dette i utgangspunktet skal holde og at jeg slipper å ha en vifte som suger luft ut i og med at det er et par hull til ledninger, samt en sprekk rundt hele fronten hvor luften kan komme seg ut. Har støvfilter foran viftene og satser på at dette overtrykket fra viftene holder støvet ute.

 

Den siste vifta er plassert oppå forsterkeren og vil suge luft opp fra forsterkeren om det blir for varmt. Etter mye googling ser det ut som om det var best for forsterkeren. Denne slår inn én grad over viftene på baksiden av TV-benken, og har ennå ikke opplevd at denne har slått inn.

 

Python scriptet finner dere her. Det blir trigget av denne i Home Assistant. Dette er basert på MQTT som kjører på en gammel Raspberry PI som igjen styrer en Arduino Mega. Det er lite optimalt, så her skal jeg på sikt få kobla Arduinoen direkte på det trådløse nettverket.

 

Her er koden som kjører på Arduinoen. Det er litt klipp og lim fra eksempler så kan ikke garantere at alt fungerer perfekt. Har også lagt inn litt debugging, men dekker nok neppe alle mulige feil-scenarioer. Alt baserer seg på input fra MQTT-serveren på RPIen.

Spoiler

#include <DHT.h>

#define DHT_TYPE DHT11
#define DHT_PIN 53
DHT dht(DHT_PIN, DHT_TYPE);

int speed1 = 0;
int speed2 = 0;

void setup() 
{ 
	Serial.begin(115200);

    // Configure Timer 1 for PWM @ 25 kHz.
    TCCR1A = 0;           // undo the configuration done by...
    TCCR1B = 0;           // ...the Arduino core library
    TCNT1  = 0;           // reset timer
    TCCR1A = _BV(COM1A1)  // non-inverted PWM on ch. A
           | _BV(COM1B1)  // same on ch; B
           | _BV(WGM11);  // mode 10: ph. correct PWM, TOP = ICR1
    TCCR1B = _BV(WGM13)   // ditto
           | _BV(CS10);   // prescaler = 1
    ICR1   = 320;         // TOP = 320

    // Set the PWM pins as output.
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);

	// Transistor output pins
	pinMode (4, OUTPUT);
	pinMode (5, OUTPUT);

	digitalWrite(14, LOW);
	digitalWrite(15, LOW);

	OCR1A = 0;
  	OCR1B = 0;
}

bool validateFan(char fan) {
	return (fan == '?' || fan == 'A' || fan == 'B');
}

bool validateSpeed(int speed) {
	return (speed >= 0 && speed <= 100);
}

int aSize = 8;
char inData[8]; // Allocate some space for the string
char inChar = -1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void loop() {
	/**
		Examples:
		T = read temperature and humidity
		H = read temperature and humidity
		FA,100 = fan channel A, speed 100%
		FB,0 = turn fan channel B off
		F?,0 = turn both fans channels off
		F?,100 = set speed to 100% on both fan channels
		F? = return fan information for both channels
		FA = return fan information for channel A
	*/


	// Don't read unless
	// there you know there is data
	while(Serial.available() > 0) {
		// One less than the size of the array
		if(index < (aSize - 1)) {
			inChar = Serial.read(); // Read a character
			inData[index] = inChar; // Store it
			index++; // Increment where to write next
			inData[index] = '\0'; // Null terminate the string
		}
		else {
			Serial.println("Abort!!!");
			resetStuff();
			return;
		}
	}
	delay(200);
	if (index == aSize) {
		// Just continue, do not abort
	}
	else if (index > 0 && inData[index-1] != '\r') {
		return;
	}

	if (index == 0) {
		return;
	}

	if (inData[0] == 'T' || inData[0] == 'H') {
		if (index > 2) {
			Serial.println("INPUT_ERROR: only send 'T' or 'H' to read temperature/Humidity");
		}
		else {
			readTemperature();
		}
	}
	else if (inData[0] == 'F') {
		if (index < 2) {
			Serial.println("INPUT_ERROR: need more information");
		}
		else if (!validateFan(inData[1])) {
			Serial.println("INPUT_ERROR: invalid fan");
		}
		// Get fan information
		else if (index == 3) {
			getFanInformation(inData[1]);
		}
		else {
			int pin = -1;
			if (inData[1] == 'A') {
				pin = 11;
			}
			else if (inData[1] == 'B') {
				pin = 12;
			}

			if (inData[2] != ',') {
				Serial.print("INPUT_ERROR: invalid fan speed. ");
				Serial.println("Did you forget ',' between fan channel and speed?");
			}
			else {
				int speed = 0;
				for (int i=3; i<index-1; i++) {
					int a = (int)inData[i] - 48;
					if (i == 3 && a == 0 && index > 5) {
						Serial.print("INPUT_ERROR: invalid fan speed. ");
						Serial.println("Integer can't start with 0.");
						break;
					}
					else if (a < 0 || a > 9) {
						Serial.print("INPUT_ERROR: invalid fan speed. ");
						Serial.print(inData[i]);
						Serial.print(" (");
						Serial.print(a);
						Serial.println(") is not an integer.");
						break;
					}
					else {
						int p = index - i - 2;
						if (p == 2) {
							speed += a * 100;
						}
						else if (p == 1) {
							speed += a * 10;
						}
						else {
							speed += a;
						}
					}
				}
				if (!validateSpeed(speed)) {
					Serial.print("INPUT_ERROR: invalid fan speed. ");
					Serial.print("Speed need to be between 0 and 100, you sent ");
					Serial.println(speed);
				}
				else {
					setSpeed(speed, pin);
					Serial.print("{\"newSpeed\": ");
					Serial.print(speed);
					Serial.println("}");
				}
			}
		}
	}
	else {
		Serial.println("INPUT_ERROR: unknown command");
	}

	resetStuff();
}

void resetStuff() {
	memset(inData, 0, sizeof inData);
	inChar = -1;
	index = 0;
}

void getFanInformation(char fan) {
	Serial.print("{\"fans\": {");
	if (fan == '?' || fan == 'A') {
		Serial.print("\"a\": ");
		Serial.print(speed1);
		if (fan == '?') {
			Serial.print(", ");
		}
	}

	if (fan == '?' || fan == 'B') {
		Serial.print("\"b\": ");
		Serial.print(speed2);
	}
	Serial.println("}}");
}

void readTemperature() {
	float h = dht.readHumidity();
	float t = dht.readTemperature();
	Serial.print("{\"temperature\": ");
	Serial.print(t);
	Serial.print(", \"humidity\": ");
	Serial.print(h);
	Serial.println("}");
}

void setSpeed(int newSpeed, int fanPin) {
	if (fanPin == -1) {
		setSpeed(newSpeed, 11);
		setSpeed(newSpeed, 12);
	}

	int val = map(newSpeed, 0, 100, 0, 320);

	// speed 0 to 400
	if (fanPin == 11) {
		OCR1A = val; // pin 9 or 11
		speed1 = newSpeed;
	} else {
    	OCR1B = val; // pin 10 or 12
    	speed2 = newSpeed;
    }

    if (newSpeed == 0) {
    	if (fanPin == 12) {
    		digitalWrite(14, LOW);
    	} else {
    		digitalWrite(15, LOW);
    	}
    } else {
    	if (fanPin == 12) {
    		digitalWrite(14, HIGH);
    	} else {
    		digitalWrite(15, HIGH);
    	}
    }
}

 

 

Her er koden som kjører på RPIen (python).

Spoiler

#! /usr/bin/python3 -p

import sys
import time
from time import sleep
import serial
import paho.mqtt.client as paho
from json import loads


fan_rear_topic = "hass/living_room/receiver/fan/rear"
fan_receiver_topic = "hass/living_room/receiver/fan/internal"

broker = "IP TO MQTT"
port = 1883
ser = None
timeout = 60

connected = False
client = None

temperatureDelay = 60


def reconnectArduino():
    s = None
    try:
        s = serial.Serial('/dev/ttyUSB0', 115200, 8, 'N', 1, timeout=5)
        print("Connection to Arduino OK")
        time.sleep(5)
    except Exception as e:
        print("Connection to Arduino failed", e)
        time.sleep(60)
    return s


def on_publish(client,userdata,result):
    pass


def on_connect(client, userdata, flags, rc):
    if rc != 0:
        print("Bad connection Returned code =",rc)
        return
    print("Subscribing to:", fan_rear_topic)
    client.subscribe(fan_rear_topic)

    print("Subscribing to:", fan_receiver_topic)
    client.subscribe(fan_receiver_topic)


# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    m = str(msg.payload.decode("utf-8"))
    print("message received:", m)
    print("Topic:", msg.topic)
    print("Retained:", msg.retain)
    try:
        json_data = loads(m)
    except Exception as e:
        print("Invalid JSON!", e)
        return

    channel = None
    if msg.topic == fan_receiver_topic:
        channel = 'A'
    elif msg.topic == fan_rear_topic:
        channel = 'B'

    if channel is not None:
        try:
            speed = json_data['speed']
        except:
            print("Not valid speed. Check your JSON format")
            return
        try:
            speed = int(speed)
        except:
            print("Not an integer,", speed)
            return

        global ser
        if ser is None:
            print("Cannot update fan speed if Arduino is not connected")
        else:
            status = updateFans(ser, channel, speed)
            if status is None:
                ser = None


def on_disconnect(client, userdata, rc=0):
    print("Disconnected, RC:", rc)
    global connected
    connected = False
    time.sleep(10)


def updateFans(serial, channel, speed):
    if channel != 'A' and channel != 'B' and channel != '?':
        print('Not a valid channel')
        print(channel)
        return False
    elif speed < 0 or speed > 100:
        print('Not a valid channel')
        return False
    else:
        try:
            serial.write(b'F')
            serial.write(channel.encode())
            serial.write(b',')
            serial.write(b'%d' % speed)
            serial.write(b'\r')

            msg = serial.readline();

            print("Channel:", channel, ", speed:", speed)
            return True
        except Exception as e:
            print("Could not write/read to Arduino", e)
            return None


def publishTemperature(serial):
    try:
        serial.write(b'T')
        serial.write(b'\r')
    except Exception as e:
        print("Could not write to Arduino", e)
        return None

    temperatureStartTime = time.time()
    temperatureTimer = time.time() - temperatureStartTime
    msg = ""
    while temperatureTimer < 1:
        temperatureTimer = time.time() - temperatureStartTime
        try:
            msg += serial.readline().decode("utf-8");
        except Exception as e:
            print(e)
            return None
    return msg


def connectToHass():
    try:
        c = client.connect(broker, port, timeout)
        return c
    except Exception as e:
        print("Could not connect to Hass.", e)


client = paho.Client("mqtt_paho_receiver")
client.on_publish = on_publish
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect

startTime = time.time()
ser = reconnectArduino()
result = connectToHass()
if result == 0:
    connected = True
    print("Connected to Hass!")

time.sleep(1)

while True:
    if ser is None:
        ser = reconnectArduino()
    elif connected != True:
        print("Not connected, sleeping for 10 seconds...")
        time.sleep(10)
        result = connectToHass()
        if result is None or result != 0:
            print("Could not connect to Hass... RC =", result)
        else:
            print("Connected to Hass!")
            connected = True
            client.loop()
    else:
        client.loop()
        elapsedTime = time.time() - startTime
        if elapsedTime > temperatureDelay:
            json = publishTemperature(ser)
            if json is not None:
                client.publish("hass/living_room/receiver/sensor", json)
            else:
                print("Message from Arduino is invalid")
                ser = None
            startTime = time.time()

 

 

Har ikke lagd koblingsskjema for dette, men skal se om jeg får gjort dette i fremtiden en gang.

 

I bildet under her ser dere at det var 32 grader i ett minutt i løpet av det siste døgnet. Viftene fikk bytta ut nok luft til å senke temperaturen. Dette er nok ikke et stort problem på denne tiden av året, men om en måned eller to hvor sola varmer opp stua mer tror jeg dette vil ha en større effekt.

 

5ac362e6b81b8_ScreenShot2018-04-03at12_37_55.png.f2ece45544f76bcccbf0eda2592a457e.png

Endret av LaStrada
Klarte å slette koden i spoilerne før jeg trykka post...
  • Like 1
Lenke til kommentar
Del på andre sider

Har prøvd mange forskjellige konfigurasjoner nå, og har kommet frem til at det mest stabilt (minst mulig start/stopp) er å bare la viftene gå når jeg ser på TV / hører på musikk. Viftene starter på 20%* og øker gradvis når temperaturen stiger. Sjekker temperaturen inni TV-benken, CPU-temperatur på begge PIene (Home-Assistant + RetroPie) og justerer viftene deretter.

 

* Disse viftene går aldri lavere enn 40%, selv om jeg setter PWM til lavere enn 40%. Skrur de av med en transistor ved 0% PWM.

 

Her er koden til Python-scriptet som justerer hastighet. Trigges hver gang en relevant temperatur endres. Ikke 100% fornøyd (eller ferdig) med koden, men den fungerer og jeg har fått fjernet alle feilene som har dukket opp, som feks hastighet i feil format, ugyldig temperaturer ved oppstart osv.

 

Legger ved nytt bilde av temperaturen i TV-benken nå som kan sammenlignes med bildet i forrige post. Ikke store forandringene, men nå går temperaturen aldri over 29 grader (foreløpig). Dette vil nok endres litt mer når jeg ser på lengre filmer, spiller mer på RetroPien, varmere i rommet osv. Som jeg skrev i en tidligere post hadde jeg temperaturer oppe i 39 grader i mai i fjor, og det håper jeg at jeg slipper, spesielt siden det nå er mer hardware inni TV-benken som genererer varme.

 

5acd1bee62de9_ScreenShot2018-04-10at22_12_01.png.7bbb56da97d154b94e219db72287a0b7.png

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • 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.