Guahtdim Skrevet 12. januar 2018 Skrevet 12. januar 2018 (endret) Jeg begynte på dette prosjektet fordi jeg hadde glemt å følge med på trykkmåleren for varmtvann til radiatorene i huset. Rørleggeren som så at det var nesten ikke vann i systemet lurte på om jeg hadde veldig god råd siden jeg risikerte å ødelegge hele systemet. Klok av skade så begynte jeg å drodle opp en løsning for å kunne automatisere overvåkningen siden tanken og måleren er i ett rom jeg ikke går ofte inn i (og selv når jeg er der så glemmer jeg å sjekke status). Tidligere har jeg laget overvåkning av elektrisitetsmåleren på loftet og jeg begynte med en lignende løsning. Foran måleren monterte jeg ett wifi webkamera med ir (jeg gikk for DLink DCS932L, men her er det sikkert mange som fungerer like bra). Dette kameraet kan man sette opp til å sende via ftp. Jeg sender ett bilde til en ftp-server som jeg har på en windowsserver (den magiske serveren som drar alt her i huset). Det tas ett nytt bilde ca hvert 5 minutt og det overskriver det eksisterende bildet siden jeg ikke trenger noe historikk. "Råbilde" På serveren har jeg en windows service som følger med på folderen som bildet legges inn i. Ved en ny eller endret jpg-fil begynner denne servicen å jobbe. Jeg bruker her ett gratis bibliotek som heter OpenCv til å undersøke bildet. Jeg har valgt veien via templates, mens en som kan bildebehandling sikkert ville brukt forskjellige andre funksjoner. I første omgang leter jeg igjennom bildet etter selve måleren ved hjelp av en mal og "klipper" ut den hvis jeg finner den. "Målermal" Etter litt bildebehandling sitter jeg igjen med. "Måleren" Etter dette bruker jeg en mal basert på måler nålen i ønsket posisjon og tester mot utklippet bilde. Jeg roterer malen slik at jeg tester for alle 360 grader. Det "treffet" som har høyest sannsynlighet tas vare på og lagres ned i en database. "Mal for målernål i ønsket posisjon (rotasjon 0 grader)" For å få dette over i Homeseer så har windows servicen en liten webserver basert på NancyFx som har kun en side som vises på localhost. Her kommer data som en semikolon separert streng hvor man har datanavn=data. Jeg prøvde å gjøre dette litt bedre med json i starten, men ble stående fast og gikk for en enkel løsning hvor data kommer som en tekststreng. Mulig jeg skal se på dette ved en senere anledning, men det er ingen hast siden dette er noe som kun brukes lokalt på min server. CS-scriptet kjøres hvert 20 minutt og henter ut data fra windows service. Veldig enkle greier som henter ut rotasjon i grader, sannsynlighet og bildets dato/tid og dette legges inn i hardkodede deviceId (virtuelle devicer). (Og man må jo lage seg 3 devicer i Homeseer som skal motta verdiene) Jeg har en event som sjekker om rotasjonen er over +/-10 grader. Hvis det skjer så får jeg en melding på sms. "Oversikt i Homeseer" Script for å hente tall fra windows service Spoiler using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml; string _logName="WarmWaterScript"; public void Main(object[] Parms) { int RotationMeterDevice=265; int ProbabilityDevice=266; int FileDateDevice=267; int RotationIndex=1; int ProbabillityIndex=0; int FileDateIndex=2; LogToHomeseer("Start WarmWater script" ); string cachebash=DateTime.Now.ToString("yyyyMMddHHmmss"); System.Net.WebRequest webRequest = System.Net.WebRequest.Create(@"http://localhost:1234/?cachebash="+cachebash); webRequest.Headers.Set(System.Net.HttpRequestHeader.CacheControl, "max-age=0, no-cache, no-store"); System.IO.Stream content; System.Net.WebResponse response = webRequest.GetResponse(); if (((System.Net.HttpWebResponse)response).ContentEncoding =="gzip") { content = new System.IO.Compression.GZipStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress); } else { content = response.GetResponseStream(); } System.IO.StreamReader reader = new System.IO.StreamReader(content); string strContent = reader.ReadToEnd(); if (strContent.Length > 0) { LogToHomeseer(strContent); var formattedData=SplitContent(strContent); foreach(var temp in formattedData) { LogToHomeseer(temp); } UpdateHomeSeerDevices(formattedData); } LogToHomeseer("Done"); } public void UpdateHomeSeerDevices(System.Collections.Generic.List<string> formattedData) { SetHsDevice(RotationMeterDevice,formattedData[RotationIndex]); SetHsDevice(ProbabilityDevice,formattedData[ProbabillityIndex]); SetHsDevice(FileDateDevice,formattedData[FileDateIndex]); } public void SetHsDevice(int deviceNumber, string valueToUpdateTo) { hs.SetDeviceString(deviceNumber,valueToUpdateTo,true); if(deviceNumber==RotationMeterDevice) { var intValue=ConvertStringToInt(valueToUpdateTo); hs.SetDeviceValueByRef(deviceNumber,intValue,true); } } public int ConvertStringToInt(string intValueAsString) { int returnValue=-99; if(int.TryParse(intValueAsString,out returnValue)) { LogToHomeseer("Conversion from string to int worked"); } return returnValue; } public System.Collections.Generic.List<string> SplitContent(string lineOfText) { var resultList=new System.Collections.Generic.List<string>(); var splitBySemiColon=lineOfText.Split(';'); if(splitBySemiColon.Length<2) return new System.Collections.Generic.List<string>(); foreach(var stringFragment in splitBySemiColon) { var splitByEquals=stringFragment.Split('='); if(splitByEquals.Length>1) { var dataAsString=splitByEquals[1]; resultList.Add(dataAsString); } } return resultList; } public void LogToHomeseer(string message) { hs.WriteLog(_logName, message); } I tillegg er det en windows service som er veldig spesifikk for meg. Hvis det er interresse så kan jeg prøve å lage noe mer generelt som folk kan leke med. Link til kildekode: https://github.com/oesolberg/MeterReaderService Link til zip-fil med service ferdig kompilert (23 MB pakket, 65 MB utpakket). http://bit.ly/MeterReaderHjemmeAutomasjon Hvordan å installere: Pakk ut alle filene i en egnet katalog (f.eks. c:\program files\meterreader) bruk Powershell og skriv inn følgende kommando : new-service -Name MeterReaderService -DisplayName "MeterReaderService" -Description "MeterReaderService" -BinaryPathName "c:\program files\meterreader\MeterReaderService.exe" -StartupType Manual For å starte service kan du kjøre kommando (i powershell): start-service -name "MeterReaderService" For å endre litt på hva som skal overvåkes må du inn og editere i MeterReaderService.exe.config filen. Følgende er nå satt: <add key="folder" value="C:\temp\warmwater\" /> <!- Hvilken folder som overvåkes --> <add key="filter" value="*.jpg" /> <!- Hvilken filtype man skal trigge på (men her er jeg redd at det kun fungerer med jpg-filer) --> <add key="sleepinterval" value="2000"/> <!- Antall millisekunder man skal vente fra en fil har endret seg til man begynner å behandle den --> <add key="port" value="1234"/> <!- porten til Nancy webserver - url http://localhost:1234 --> <add key="MaalerMal" value="MeterMalWithGray.jpg" /> <!- filen som inneholder målermalen (må ligge i underkatalogen Templates) --> <add key="NaalMal" value="KorrektNaalMedGraatt.jpg" /> <!- filen som inneholder målernålen (må ligge i underkatalogen Templates) --> Endret 23. januar 2018 av Guahtdim 3 1 Siter
Moskus Skrevet 12. januar 2018 Skrevet 12. januar 2018 1 time siden, Guahtdim skrev: Hvis det er interresse så kan jeg prøve å lage noe mer generelt som folk kan leke med. Du trenger ikke spørre om det! 1 Siter
Odd Skrevet 12. januar 2018 Skrevet 12. januar 2018 Du verden .... imponert. Dette er en løsning jeg ikke engang ville har tenkt på. 1 Siter
Guahtdim Skrevet 12. januar 2018 Forfatter Skrevet 12. januar 2018 8 minutes ago, Moskus said: Du trenger ikke spørre om det! OK, jeg skal se hva jeg finner tid til. Men dette vil kun fungere for windows brukere (som kan kjøres services). Dere som kjører Linux må nok desverre lage deres egen "service". Men OpenCv kjøres bl.a. i Python så det skal ikke være helt umulig å gjøre noe liknende jeg har gjort. 1 Siter
erlingba Skrevet 12. januar 2018 Skrevet 12. januar 2018 Det var jo en artig løsning, men en trykkgiver er vel billigere enn et webkamera om nøyaktigheten ikke er veldig høyt prioritert. Siter
Guahtdim Skrevet 12. januar 2018 Forfatter Skrevet 12. januar 2018 (endret) 1 hour ago, erlingba said: Det var jo en artig løsning, men en trykkgiver er vel billigere enn et webkamera om nøyaktigheten ikke er veldig høyt prioritert. Men da må jeg vel inn og mekke på selve varmtvannstanken? Personlig så vil jeg helst at en som kan det tar jobben og da kommer man fort over 450 kroner. Endret 12. januar 2018 av Guahtdim 1 Siter
Moskus Skrevet 12. januar 2018 Skrevet 12. januar 2018 1 time siden, erlingba skrev: Det var jo en artig løsning, men en trykkgiver er vel billigere enn et webkamera om nøyaktigheten ikke er veldig høyt prioritert. Bare fordi noe er teknisk mulig å gjøre selv, betyr ikke at det nødvendigvis er en god ide... Synes @Guahtdim sin løsning var direkte genial og enkel. Et kamera koster jo bare litt mer enn null penger. 1 Siter
Odd Skrevet 12. januar 2018 Skrevet 12. januar 2018 Måten du har gjort det på Guahtdim ga meg umiddelbart ideer til andre bruksområder En av de er ikke spesielt fornuftig, men hadde vært morsom å gjøre. Sette tiden ut fra den analoge klokka på veggen For meg handler det ikke om fornuft alltid, men mer en morsom utfordring, litt som spill for den yngre generasjon .... Det er derfor Philips HUE lampa endrer farge etter antall skritt kona har på fitbiten 2 Siter
Moskus Skrevet 12. januar 2018 Skrevet 12. januar 2018 29 minutter siden, Odd skrev: Sette tiden ut fra den analoge klokka på veggen Tror jeg kan sitere meg selv igjen... ? 1 time siden, Moskus skrev: Bare fordi noe er teknisk mulig å gjøre selv, betyr ikke at det nødvendigvis er en god ide... 2 Siter
Guahtdim Skrevet 19. januar 2018 Forfatter Skrevet 19. januar 2018 Jeg har ikke glemt dette, men sliter med å få tid til å lage en service med "penere" kode. Jeg skal ta meg tid til å få gjort dette i løpet av neste uke. 1 Siter
Guahtdim Skrevet 20. januar 2018 Forfatter Skrevet 20. januar 2018 (endret) oppdatert med link til Github hvor kildekode for service ligger. Jeg tror du ikke trenger mer enn Visual Studio Community(gratis) for å editere koden. https://www.visualstudio.com/downloads/?utm_source=mscom&utm_campaign=msdocs Endret 20. januar 2018 av Guahtdim 1 Siter
Guahtdim Skrevet 20. januar 2018 Forfatter Skrevet 20. januar 2018 (endret) Link til zip-fil med service ferdig kompilert (23 MB pakket, 65 MB utpakket). http://bit.ly/MeterReaderHjemmeAutomasjon Hvordan å installere: Pakk ut alle filene i en egnet katalog (f.eks. c:\program files\meterreader) bruk Powershell og skriv inn følgende kommando : new-service -Name MeterReaderService -DisplayName "MeterReaderService" -Description "MeterReaderService" -BinaryPathName "c:\program files\meterreader\MeterReaderService.exe" -StartupType Manual For å starte service kan du kjøre kommando (i powershell): start-service -name "MeterReaderService" For å endre litt på hva som skal overvåkes må du inn og editere i MeterReaderService.exe.config filen. Følgende er nå satt: <add key="folder" value="C:\temp\warmwater\" /> <!- Hvilken folder som overvåkes --> <add key="filter" value="*.jpg" /> <!- Hvilken filtype man skal trigge på (men her er jeg redd at det kun fungerer med jpg-filer) --> <add key="sleepinterval" value="2000"/> <!- Antall millisekunder man skal vente fra en fil har endret seg til man begynner å behandle den --> <add key="port" value="1234"/> <!- porten til Nancy webserver - url http://localhost:1234 --> <add key="MaalerMal" value="MeterMalWithGray.jpg" /> <!- filen som inneholder målermalen (må ligge i underkatalogen Templates) --> <add key="NaalMal" value="KorrektNaalMedGraatt.jpg" /> <!- filen som inneholder målernålen (må ligge i underkatalogen Templates) --> Endret 21. januar 2018 av Guahtdim 2 Siter
Guahtdim Skrevet 23. januar 2018 Forfatter Skrevet 23. januar 2018 Ok, da skulle alt være på plass og alle som vil kan teste ut. Bare legge igjen spørsmål, tilbakemeldinger og ønsker her så skal jeg prøve å svare så godt jeg kan. Siter
Anbefalte innlegg
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.