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

Hente badetemperatur fra yr (snitt over fylket)


Guahtdim

Anbefalte innlegg

For å teste meg litt så satte jeg igang med ett script (c#) for å hente badetemperaturer fra yr. Yr legger alle badetemperaturer ut som en xml fil på adressen http://om.yr.no/badetemperatur/badetemperatur.xml

Jeg har laget en liten scriptsnutt som henter ned xml, plukker ut fylket. Løper igjennom alle temperaturer for fylket og gir ett snitt. Grunnen til at jeg kan ta for hele fylket er at så lenge jeg har fulgt med så har Østfold kun fått varsling for 2 steder og begge er på Jeløya. Og siden det er der jeg bor så tenkte jeg i utgangspunktet å ta snittet. Mulig jeg kommer til å flikke mer på scriptet etterhvert for i tillegg å plukke ut høyeste og laveste.

 

Hva gjør man for å bruke dette scriptet?

 

Først lager du en virtual device

NewDevice.png.23f4e916490f254945abc028452c8b04.png

 

Og i den spesifiserer du ett navn, setter den som Status Only Device

 config.png.d9fb11f72cd620d35c51689af8cd09de.png

 

Setter grafikk hvis det interresserer deg

statusGraph.png.3635fabbef69e8b3732703a9952fa67b.png

 

 

Og til slutt går inn på advanced (jeg er usikker på om ID er laget idet man trykker for ny device eller om du må inn etter at du har lagret første gangen). Det som er viktig her er Reference ID.

advanced.png.7af3968cf7a16a75d11f149c5a34fab4.png

 

Legg til scriptet under i homeseer sin scriptkatalog (hos meg er den å finne i C:\Program Files (x86)\HomeSeer HS3\scripts). Filen må ha endelse/extension .cs. I mitt tilfelle har jeg kalt det YrBadetemperatur.cs som gir full path: C:\Program Files (x86)\HomeSeer HS3\scripts\YrBadetemperatur.cs

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;

public object Main(object[] Parms)
{
	int virtualDeviceId = 154; //Virtuell device reference id som man har definert for å legge inn tekstverdien fra yr
	string countyId = "01"; //Hvilket fylke man skal hente inn verdier fra
	string logName="GuahtdimYrBade";//Her kan man sette inn hva man vil. Det er første kolonne i loggen
	hs.WriteLog(logName,"Start Yr badetemp" );
	
	System.Net.WebRequest webRequest = System.Net.WebRequest.Create(@"http://om.yr.no/badetemperatur/badetemperatur.xml");
    System.IO.Stream content;
	System.Net.WebResponse response = webRequest.GetResponse();
	//Håndtere gzip av content
	 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)
	{
		int startPoint = strContent.IndexOf("\n", StringComparison.InvariantCulture) + 1;//Fjerner første xml linje <?xml version="1.0" encoding="UTF-8"?>
		strContent = strContent.Substring(startPoint);
		System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
		xmlDocument.LoadXml(strContent);
		System.Xml.XmlNode ostfoldNode = xmlDocument.SelectSingleNode("//badetemp/badetemperaturer/county[@id='" + countyId + "']");		
		if (ostfoldNode != null)
		{
			System.Xml.XmlNodeList tempNodes = ostfoldNode.SelectNodes("//county[@id='" + countyId + "']/place/temperature");
			if (tempNodes != null)
			{
				int totaltTemp = 0;
				int counter = 0;
				//Henter inn alle vanntemperaturer for fylket og gjør det mulig å lage snitt
				foreach (System.Xml.XmlNode tempNode in tempNodes)
				{
					System.Xml.XmlAttribute test = tempNode.Attributes["water"];
					totaltTemp += int.Parse(test.Value);
					counter++;
				}
        
				decimal avgTemp =(decimal) (totaltTemp/counter);				 
				string badeTempString = "Vanntemperatur Jeløya(snitt): " + avgTemp.ToString("0.0") + "\u00B0C";
				hs.SetDeviceString(virtualDeviceId,badeTempString,true);
				//string stringValue=hs.DeviceString(virtualDeviceId);
				//hs.WriteLog("From device", stringValue);
				hs.WriteLog(logName,badeTempString );
			}
		}
	}
	hs.WriteLog(logName,"Done" );
	return 0;
}

Etter dette bør du lage en event som tar seg av innhenting av verdier. Jeg har gjort det som bildet under viser

event.png.ba0cf7784e983d819f0d94a01d2f5c28.png

 

Det er bare å komme med spørsmål og ønsker.

 

  • Like 4
Lenke til kommentar
Del på andre sider

Det eneste jeg ikke liker med c# script er at man må prefikse metoder og variabler med full path til assembly.

Hva jeg var nødt til:

System.IO.StreamReader reader = new System.IO.StreamReader(content);

Hva jeg er vant til:

var reader = new StreamReader(content);

 

Jeg er vant til at det holder å ha det i using-statements og så er kompilatoren lur nok til å plukke fra riktig assembly. Men nå er jeg klar over det så da er det ikke noe problem å ta hensyn til det neste gang.

 

Mens jeg utviklet scriptet så begynte det plutselig å levere masse feil siden content hadde gått fra plain text til gzip. Men da fikk jeg testet å håndtere det og.

 

Mulig @ZoRaC burde legge ut sitt alternativ hvor han bruker en plugin?

Lenke til kommentar
Del på andre sider

23 minutter siden, Guahtdim skrev:

Mulig @ZoRaC burde legge ut sitt alternativ hvor han bruker en plugin?

 

1. Installer Jon00DataScraper-plugin (hentes fra nettsiden hans)

2. I /Config/Jon00DataScraper.ini, legg inn en ny "grab" (ta neste ledige nummer):

[Grab3]
Devicemode=2
Path=http://om.yr.no/badetemperatur/badetemperatur.xml
Encoding=UTF-8
Pattern1=(?s)Hundhammer.*?temperature water="(.*?)" air="
Pattern2=(?s)Hundhammer.*?text_nb="(.*?)" text
DeviceName1=Badetemp
DeviceText1=[0]°C ([100])
DeviceValue1=[0]

3. Bytt ut "Hundhammer" med stedsbeskrivelsen til det stedet du vil ha.

4. Opprett en event som kjører "/scripts/Jon00DataScraper.vben" f.eks hver time (eller som @Guahtdim har satt opp)

5. Som "parameter" i eventet setter du "grab-nummeret", f.eks 3

6. Kjør eventet og devicen skal bli opprettet under "Utility" / "Jon00 DataScraper" (se i loggen)

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

  • 1 måned senere...
På 7/12/2017 den 10.32, ZoRaC skrev:

 

1. Installer Jon00DataScraper-plugin (hentes fra nettsiden hans)

2. I /Config/Jon00DataScraper.ini, legg inn en ny "grab" (ta neste ledige nummer):


[Grab3]
Devicemode=2
Path=http://om.yr.no/badetemperatur/badetemperatur.xml
Encoding=UTF-8
Pattern1=(?s)Hundhammer.*?temperature water="(.*?)" air="
Pattern2=(?s)Hundhammer.*?text_nb="(.*?)" text
DeviceName1=Badetemp
DeviceText1=[0]°C ([100])
DeviceValue1=[0]

3. Bytt ut "Hundhammer" med stedsbeskrivelsen til det stedet du vil ha.

4. Opprett en event som kjører "/scripts/Jon00DataScraper.vben" f.eks hver time (eller som @Guahtdim har satt opp)

5. Som "parameter" i eventet setter du "grab-nummeret", f.eks 3

6. Kjør eventet og devicen skal bli opprettet under "Utility" / "Jon00 DataScraper" (se i loggen)

 

Ser ut som Yr har lagt om xml, jeg måtte i hvert fall gjøre om på spørringen en smule. 

Her er 4140 stasjonsID, dette finner man i xml-fil. 

PS. fikk ikke all informasjonen frem da jeg åpnet xml i Chrome, men i IE kom all info frem.

 

[Grab5]
Devicemode=2
Path=http://om.yr.no/badetemperatur/badetemperatur.xml
Encoding=UTF-8
Pattern1=(?s)4140.*?water="(.*?)"
Pattern2=(?s)4140.*?text_nb="(.*?)" text
DeviceName1=Badetemperatur
DeviceText1=[0] C ([100])
DeviceValue1=[0]

Lenke til kommentar
Del på andre sider

Det kan virke som om den listen endrer seg på bakgrunn av hvor flinke stedene er til å legge inn badetemperaturer. Slik som ting er nå så er det ingen som rapporterer i Østfold. Men badesesongen er jo over så jeg får heller flikke litt på denne neste sommer.

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.