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

Overvåkning av vanntrykkmåler (windows service og script)


Guahtdim

Anbefalte innlegg

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.

 

screenshot.png.2c2703d2c8d2613e111df29cff7687ce.png

"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.

 

metermal.png.97c147ba2e794d23172ed86dea33bfd1.png

"Målermal"

 

Etter litt bildebehandling sitter jeg igjen med.

 

JustMeter.png.391b994a9e547d22241f2a0a48b9f747.png

"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.

 

NaalMal.png.2ebe1e736a1138ad0301d1874ee04784.png

"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. 

 

Homeseer.png.cb48d8fc3d6495d34f77da1dde3ff2f1.png

"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 av Guahtdim
  • Like 3
  • Thanks 1
Lenke til kommentar
Del på andre sider

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.

  • Like 1
Lenke til kommentar
Del på andre sider

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 av Guahtdim
  • Like 1
Lenke til kommentar
Del på andre sider

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.

  • Like 1
Lenke til kommentar
Del på andre sider

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 :)

 

  • Like 2
Lenke til kommentar
Del på andre sider

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

 

:P 

  • Haha 2
Lenke til kommentar
Del på andre sider

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 av Guahtdim
  • Like 2
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.