HM-Script für virtuelle Wetterstation

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Zamon
Beiträge: 20
Registriert: 17.01.2016, 16:01

Re: HM-Script für virtuelle Wetterstation

Beitrag von Zamon » 26.04.2020, 14:28

Super Danke, den Schnipsel kann ich an vielen Stellen gebrauchen.....

froema
Beiträge: 205
Registriert: 19.12.2018, 15:20
Hat sich bedankt: 3 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von froema » 27.04.2020, 14:13

Hallo,

ich benutze das Skript und es gefällt mir auch gut. Da ich mich aber mit der Skriptprogrammierung und dem Abholen der Wetterdaten nicht auskenne, folgende Frage: Kann man bei Open weather auch die Sonnenscheindauer des folgenden Tages erhalten? Und wenn ja, wie bekomme ich die in das Skript?

Gruß
Marc

redy09
Beiträge: 40
Registriert: 18.11.2018, 12:31
Hat sich bedankt: 1 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von redy09 » 30.04.2020, 14:43

Hallo!

Tolles Skript! Aber ich finde nicht, ob und ggfs. wie ich die Regenmenge einbinden kann.
Ein Post hatte den Abschnitt mit

string svNiederschlag='OpenWeather Niederschlag';
string svNiederschlagsart='OpenWeather Niederschlagsart';

erweitert. Aber das allein funktioniert nicht. Vielleicht kann jemand das komplette Skript hierfür einstellen?

Vielen Dank!!

redy09
Beiträge: 40
Registriert: 18.11.2018, 12:31
Hat sich bedankt: 1 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von redy09 » 01.05.2020, 12:03

Noch eine Ergänzung. Ich habe jetzt das Skript von Seite 11 installiert nach dem letzten Update ist die Regenmenge mit abgebildet), CuxD angelegt.
Aber das Skript erzeugt die Variablen nicht... Was mache ich falsch?

redy09
Beiträge: 40
Registriert: 18.11.2018, 12:31
Hat sich bedankt: 1 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von redy09 » 01.05.2020, 12:31

Hier mal mein ganzer Code:

Code: Alles auswählen

!OpenWeather-CCU-Script, edited by regedit V1.2, 2019-08-31
!Verwendetes Original: DimMyPrp V1, 2017-02-15, edited by Schalterrei, 2018-07-25



!Hier EIGENE OpenWeatherAppID eintragen
string owAppid='xxx';

!Optionale Experteneinstellungen: Angabe der Stadt (%u0102¼ber https://openweathermap.org/city/) anstatt Geocoords (=false)
string owCityid='xxx';

!Optionale Experteneinstellungen: wget-Command per CUxD oder system.Exec (cuxCMDName='CUxD.<Seriennummer>:1'/false) sowie CUxD logging (true/false)
string cuxCMDName=false;
boolean useLOGIT=false;

!Optionale Experteneinstellungen: OpenWeather-Daten in CUxD Thermostat-Device schreiben (cuxWDSName='CUxD.<Seriennummer>:1'/false)
!Achtung: Ger%u0102¤t=("Universal Wrapper Device" (90) als "Thermostat" / Option "WEATHER|USE_HMDATAPT" muss auf false)
string cuxWDSName='CuxD.CUX9002007:1';

!Systemvariablenbenennung
string svAktualisierung='OpenWeather Letzte Aktualisierung';
string svTemperatur='OpenWeather Temperatur';
string svMinimalTemperatur='OpenWeather Temperatur (min.)';
string svMaximalTemperatur='OpenWeather Temperatur (max.)';
string svLuftfeuchtigkeit='OpenWeather Luftfeuchte (rel.)';
string svLuftdruck='OpenWeather Luftdruck';
string svWindGeschwindigkeit='OpenWeather Windgeschwindigkeit';
string svWindRichtung='OpenWeather Windrichtung';
!string svWindRichtungInt='OpenWeather WindrichtungInt';
string svWetterstation='OpenWeather Wetterstation';
string svSonnenaufgang='OpenWeather Sonnenaufgang';
string svSonnenuntergang='OpenWeather Sonnenuntergang';
string svWetter='OpenWeather Wetter';
string svNiederschlag ='OpenWeather Niederschlag';
string svNiederschlagsart='OpenWeather Niederschlagsart';
string svWolken='OpenWeather Bew%u0102¶lkung';

!************************************************************
!************************************************************
!BEGIN DES SCRIPTS
!************************************************************
!************************************************************

!Variablendeklaration
!***********************
!OpenWeather-Url mit Defaultwerte
string owLocation='&id=INSERT';
string owUrl='http://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric';
!CUxD/Exec und R%u0102¼ckgabe-Variablen (Programmablauf) mit Defaultwerte
boolean cuxCMD=false; boolean cuxWDS=false;string recXML;
!XML-Parser (Tagnamen)
string xmlStartTagName_Aktualisierung;string xmlEndTagName_Aktualisierung;
string xmlStartTagName_Temperatur;string xmlEndTagName_Temperatur;
string xmlStartTagName_Luftfeuchtigkeit;string xmlEndTagName_Luftfeuchtigkeit;
string xmlStartTagName_Luftdruck;string xmlEndTagName_Luftdruck;
string xmlStartTagName_Wind;string xmlEndTagName_Wind;
string xmlStartTagName_Geschwindigkeit;string xmlEndTagName_Geschwindigkeit;
string xmlStartTagName_Windrichtung;string xmlEndTagName_Windrichtung;
string xmlStartTagName_Stadt;string xmlEndTagName_Stadt;
string xmlStartTagName_Sonnenzeit;string xmlEndTagName_Sonnenzeit;
string xmlStartTagName_Wetter;string xmlEndTagName_Wetter;
string xmlStartTagName_Niederschlag;string xmlEndTagName_Niederschlag;
string xmlStartTagName_Wolken;string xmlEndTagName_Wolken;
!XML-Parser (Programmablauf)
integer xmlStartTagLenght;
integer xmlTagStart;integer xmlTagLength;
integer xmlAttributeStart;integer xmlAttributeLength;
string xmlTagContent;
string xmlAttributeValue;
!Zur%u0102¼ckgemeldete und aus der XML extrahierte Werte von OpenWeather
real owTemperatur;real owMinimalTemperatur;real owMaximalTemperatur;
real owLuftfeuchtigkeit;
real owLuftdruck;
real owWindGeschwindigkeit;real owGradzahl;string owWindRichtung;
string owWetterstation;
string owAktualisierung;
string owSonnenaufgang;string owSonnenuntergang;
string owWetter;
real owNiederschlag;string owNiederschlagsart;
integer owWolken;
!Objekte f%u0102¼r Systemvariablen (Programmablauf)
object svObject;
object svObjectlist;
!Objekte f%u0102¼r Devices (Programmablauf)
string dvObjectID;
object dvObject;
object dvObjectlist;
!Generische Variablen (Mehrfachverwendung)
string genString1;string genString2;string genString3;
time genTime1;
integer genInteger1;integer genInteger2;
real genReal1;

!Url zum Abruf des XML-Strings zusammen sezten
!****************************************************
if(owCityid){
	owLocation='&id='#owCityid;
} else {
	if(system.Longitude()&&system.Latitude())
	{
		owLocation='&lat='#system.Latitude()#'&lon='#system.Longitude();
	}
}
owUrl = owUrl#'&APPID='#owAppid#owLocation;

!Pr%u0102¼fen, ob CUX-Daemon Devices vorhanden sind
!***************************************************
if(dom.GetObject(cuxCMDName#'.CMD_SETS')){cuxCMD = true;}
if(dom.GetObject(cuxWDSName#'.SET_TEMPERATURE')){cuxWDS=true;}

!wget ausf%u0102¼hren
!*****************
if(cuxCMD)
{
	!Website via CUxD und wget aufrufen.
	dom.GetObject(cuxCMDName#'.CMD_SETS').State("wget -q -O - '"#owUrl#"'");
	dom.GetObject(cuxCMDName#'.CMD_QUERY_RET').State(1);
	recXML = dom.GetObject(cuxCMDName#'.CMD_RETS').State();
} else {
	!Fallback: Website via system.Exec und wget aufrufen
	system.Exec("wget -q -O - '"#owUrl#"'", &recXML, &genString1);
}

!Pruefen, ob XML-String geholt wurde, ansonsten abbrechen
!****************************************************************
if(!recXML){quit;}






!Tag-Namen-Suche im geholten XML-String vorbereiten
!*********************************************************
!Je nachdem, ob die Daten via CUxD oder Exex bezogen wurden, haben die XML-Tags ein anderes Format.
!Exex liefert einen XML-String mit eckigen Klammern nach dem Schema <tag></tag> oder <tag/>
!CUxD enternt eckige Klammern und liefert eine String nach dem Schema "tag /tag"
if(cuxCMD)
{
	!Suchstrings f%u0102¼r XML-Tags von CUxD festlegen
	xmlStartTagName_Aktualisierung = 'lastupdate ';
	xmlEndTagName_Aktualisierung = '  /lastupdate';
	xmlStartTagName_Temperatur = 'temperature ';
	xmlEndTagName_Temperatur = '  /temperature';
	xmlStartTagName_Luftfeuchtigkeit = 'humidity ';
	xmlEndTagName_Luftfeuchtigkeit = '  /humidity';
	xmlStartTagName_Luftdruck = 'pressure ';
	xmlEndTagName_Luftdruck = '  /pressure';
	xmlStartTagName_Wind = 'wind ';
	xmlEndTagName_Wind = '  /wind';
	xmlStartTagName_Geschwindigkeit = 'speed ';
	xmlEndTagName_Geschwindigkeit = '  /speed';
	xmlStartTagName_Windrichtung = 'direction ';
	xmlEndTagName_Windrichtung = '  /direction';
	xmlStartTagName_Stadt = 'city ';
	xmlEndTagName_Stadt = '  /city';
	xmlStartTagName_Sonnenzeit = 'sun ';
	xmlEndTagName_Sonnenzeit = '  /sun';
	xmlStartTagName_Wetter = 'weather ';
	xmlEndTagName_Wetter = '  /weather';
	xmlStartTagName_Niederschlag = 'precipitation ';
	xmlEndTagName_Niederschlag = '  /precipitation';
	xmlStartTagName_Wolken = 'clouds ';
	xmlEndTagName_Wolken = '  /clouds';
} else {
	!Suchstrings f%u0102¼r XML-Tags von Exec festlegen
	xmlStartTagName_Aktualisierung = '<lastupdate ';
	xmlEndTagName_Aktualisierung = '>';
	xmlStartTagName_Temperatur = '<temperature ';
	xmlEndTagName_Temperatur = '>';
	xmlStartTagName_Luftfeuchtigkeit = '<humidity ';
	xmlEndTagName_Luftfeuchtigkeit = '>';
	xmlStartTagName_Luftdruck = '<pressure ';
	xmlEndTagName_Luftdruck = '>';
	xmlStartTagName_Wind = '<wind>';
	xmlEndTagName_Wind = '</wind>';
	xmlStartTagName_Geschwindigkeit = '<speed ';
	xmlEndTagName_Geschwindigkeit = '>';
	xmlStartTagName_Windrichtung = '<direction ';
	xmlEndTagName_Windrichtung = '>';
	xmlStartTagName_Stadt = '<city ';
	xmlEndTagName_Stadt = '</city>';
	xmlStartTagName_Sonnenzeit = '<sun ';
	xmlEndTagName_Sonnenzeit = '>';
	xmlStartTagName_Wetter = '<weather ';
	xmlEndTagName_Wetter = '>';
	xmlStartTagName_Niederschlag = '<precipitation ';
	xmlEndTagName_Niederschlag = '>';
	xmlStartTagName_Wolken = '<clouds ';
	xmlEndTagName_Wolken = '>';

}

!Geholten XML-String parsen
!******************************

!Parser f%u0102¼r svAktualisierung
if(svAktualisierung)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Aktualisierung.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Aktualisierung);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Aktualisierung);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Datenabruf-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owAktualisierung = xmlAttributeValue.ToString();
			}
		}
	}
}



!Parser f%u0102¼r svTemperatur, svMinimalTemperatur, svMaximalTemperatur
if(svTemperatur)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Temperatur.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Temperatur);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Temperatur);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Temperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owTemperatur = xmlAttributeValue.ToFloat();
			}

			!MinimalTemperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('min="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owMinimalTemperatur = xmlAttributeValue.ToFloat();
			}

			!MaximalTemperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('max="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owMaximalTemperatur = xmlAttributeValue.ToFloat();
			}

		}
	}
}



!Parser f%u0102¼r svLuftfeuchtigkeit
if(svLuftfeuchtigkeit)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Luftfeuchtigkeit.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Luftfeuchtigkeit);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Luftfeuchtigkeit);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftfeuchtigkeits-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owLuftfeuchtigkeit = xmlAttributeValue.ToFloat();
			}

		}
	}
}


!Parser f%u0102¼r svLuftdruck
if(svLuftdruck)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Luftdruck.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Luftdruck);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Luftdruck);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftdruck-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owLuftdruck = xmlAttributeValue.ToFloat();
			}

		}
	}
}


!Parser f%u0102¼r owWindGeschwindigkeit
if(svWindGeschwindigkeit)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wind.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wind);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wind);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Sub-Parser Geschwindigkeit
			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
			xmlStartTagLenght = xmlStartTagName_Geschwindigkeit.Length();
			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Geschwindigkeit);
			if (xmlTagStart>=0)
			{
				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Geschwindigkeit);
				if(xmlTagLength>0)
				{
					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Geschwindigkeit-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('value="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owWindGeschwindigkeit = xmlAttributeValue.ToFloat();
					}

				}
			}

		}
	}
}



!Parser f%u0102¼r owGradzahl, owWindRichtung
! if((svWindRichtung)||(svWindRichtungInt))
! {
! 	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
! 	xmlStartTagLenght = xmlStartTagName_Wind.Length();
! 	xmlTagStart = recXML.Find(xmlStartTagName_Wind);
! 	if (xmlTagStart>=0)
! 	{
! 		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
! 		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wind);
! 		if(xmlTagLength>0)
! 		{
! 			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);
! 
! 			!Sub-Parser Windrichtng
! 			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
! 			xmlStartTagLenght = xmlStartTagName_Windrichtung.Length();
! 			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Windrichtung);
! 			if (xmlTagStart>=0)
! 			{
! 				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
! 				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Windrichtung);
! 				if(xmlTagLength>0)
! 				{
! 					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Gradzahl-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('value="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owGradzahl = xmlAttributeValue.ToInteger();
					}

					!Himmelsrichtung-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('code="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owWindRichtung = xmlAttributeValue.ToString();
					}

				}
				else
				{
					
					!QuickAndDirty fallback if no data
					owGradzahl=-1;
				}
			}
		}
	}
}



!Parser f%u0102¼r owWetterstation
if((svWetterstation)||(svSonnenaufgang)||(svSonnenuntergang))
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Stadt.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Stadt);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Stadt);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Stadtname-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('name="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWetterstation = xmlAttributeValue.ToString();
			}

			!Sub-Parser Sonnezeit
			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
			xmlStartTagLenght = xmlStartTagName_Sonnenzeit.Length();
			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Sonnenzeit);
			if (xmlTagStart>=0)
			{
				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Sonnenzeit);
				if(xmlTagLength>0)
				{
					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Sonnenaufgang-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('rise="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owSonnenaufgang = xmlAttributeValue.ToString();
					}

					!Sonnenuntergang-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('set="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owSonnenuntergang = xmlAttributeValue.ToString();
					}

				}
			}
		}
	}
}


!Parser f%u0102¼r svWetter
if(svWetter)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wetter.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wetter);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wetter);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftfeuchtigkeits-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWetter = xmlAttributeValue.ToString();
			}

		}
	}
}


!Parser f%u0102¼r owNiederschlag, owNiederschlagTyp  -new
if((svNiederschlag)||(svNiederschlagsart))
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Niederschlag.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Niederschlag);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Niederschlag);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Niederschlagsart auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('mode="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owNiederschlagsart = xmlAttributeValue.ToString();
			}

			!Niederschlag auslesen
			if(owNiederschlagsart=='no')
			{
				owNiederschlag = 0;
			}
			else
			{
				xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
				xmlAttributeStart=xmlTagContent.Find('value="');
				if (xmlAttributeStart>=0)
				{
					xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
					xmlAttributeLength = xmlAttributeValue.Find('"');
					xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
					owNiederschlag = xmlAttributeValue.ToFloat();
				}
			}

		}
	}
}


!Parser f%u0102¼r owWolken  -new
if(svWolken)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wolken.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wolken);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wolken);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Wolken auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWolken = xmlAttributeValue.ToInteger();
			}

		}
	}
}



!Ermittelte Werte in Systemvariable schreiben
!**************************************************
!Wenn (noch) keine Systemvariable(n) vorhanden, diese anlegen.
!Code zum anlegen von Variablen abgeleitet von Esche's IT-Blog https://www.blogging-it.com/code-snippet-homematic-systemvariablen-ueber-ein-script-automatisch-erzeugen/programmierung/homematic-script.html

!Schreiben von svAktualisierung
if(svAktualisierung)
{
	!String bzw. Uhrzeit umformatieren
	genString1='';genTime1=null;genString2='';
	genString1 = owAktualisierung.Substr(0,10)#' '#owAktualisierung.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%d.%m.%Y %H:%M"#" Uhr");
	svObject = dom.GetObject(svAktualisierung);
	!Wenn noch keine Systemvarible vorhanden, diese anlegen
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svAktualisierung);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Aktualisierung');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	!Wenn CUxD-CMD-Device vorhanden und useLOGIT, dann Werte via CUxD loggen
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svAktualisierung#';'#genTime1);}
}



!Schreiben von svSonnenaufgang
if(svSonnenaufgang)
{
	genString1='';genTime1=null;genString2='';
	genString1 = owSonnenaufgang.Substr(0,10)#' '#owSonnenaufgang.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%H:%M"#" Uhr");
	svObject = dom.GetObject(svSonnenaufgang);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svSonnenaufgang);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Sonnenaufgang');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svSonnenaufgang#';'#genTime1);}
}



!Schreiben von svSonnenuntergang
if(svSonnenuntergang)
{
	genString1='';genTime1=null;genString2='';
	genString1 = owSonnenuntergang.Substr(0,10)#' '#owSonnenuntergang.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%H:%M"#" Uhr");
	svObject = dom.GetObject(svSonnenuntergang);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svSonnenuntergang);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Sonnenuntergang');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svSonnenuntergang#';'#genTime1);}
}



!Schreiben von svWetterstation
if(svWetterstation)
{
	genString1='';genString2='';genString3='';genInteger1=0;genInteger2=0;
	genInteger1=owWetterstation.Length();
	foreach(genInteger2,genInteger1)
	{
		genString1=owWetterstation.Substr(genInteger2-1,1);
		if(genString1=='%u0102%u0192')
		{
			genString2=owWetterstation.Substr(genInteger2,1);
			if(genString2=='¼'){genString1='%u0102¼';genInteger2=genInteger2+1;}
			if(genString2=='¶'){genString1='%u0102¶';genInteger2=genInteger2+1;}
			if(genString2=='¤'){genString1='%u0102¤';genInteger2=genInteger2+1;}
		}
		genString3=genString3#genString1;
	}

	svObject = dom.GetObject(svWetterstation);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWetterstation);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Wetterstation');
		svObject.ValueUnit('');
		svObject.State(genString3);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString3);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetterstation#';'#genString3);}
}



!Schreiben von svWindgeschwindigkeit
if(svWindGeschwindigkeit)
{
	svObject = dom.GetObject(svWindGeschwindigkeit);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindGeschwindigkeit);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Windgeschwindigkeit");
		svObject.ValueUnit("m/s");
		svObject.ValueMin(0.0000);
		svObject.ValueMax(500.0000);
		svObject.State(owWindGeschwindigkeit);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owWindGeschwindigkeit);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindGeschwindigkeit#';'#owWindGeschwindigkeit);}
}



!Schreiben von svLuftdruck
if(svLuftdruck)
{
	svObject = dom.GetObject(svLuftdruck);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svLuftdruck);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Luftdruck");
		svObject.ValueUnit("hPa");
		svObject.ValueMin(500.0000);
		svObject.ValueMax(1100.0000);
		svObject.State(owLuftdruck);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owLuftdruck);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svLuftdruck#';'#owLuftdruck);}
}



!Schreiben von svTemperatur
if(svTemperatur)
{
	svObject = dom.GetObject(svTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svTemperatur#';'#owTemperatur);}
	if(cuxWDS){dom.GetObject(cuxWDSName#'.SET_TEMPERATURE').State(owTemperatur);}
}



!Schreiben von svMinimalTemperatur
if(svMinimalTemperatur)
{
	svObject = dom.GetObject(svMinimalTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svMinimalTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur (min.)");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owMinimalTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owMinimalTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svMinimalTemperatur#';'#owMinimalTemperatur);}
}



!Schreiben von svMaximalTemperatur
if(svMaximalTemperatur)
{
	svObject = dom.GetObject(svMaximalTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svMaximalTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur (max.)");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owMaximalTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owMaximalTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svMaximalTemperatur#';'#owMaximalTemperatur);}
}



!Schreiben von svLuffeuchtigkeit
if(svLuftfeuchtigkeit)
{
	svObject = dom.GetObject(svLuftfeuchtigkeit);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svLuftfeuchtigkeit);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Luftfeuchtigkeit");
		svObject.ValueUnit("%");
		svObject.ValueMin(0.0000);
		svObject.ValueMax(100.0000);
		svObject.State(owLuftfeuchtigkeit);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owLuftfeuchtigkeit);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svLuftfeuchtigkeit#';'#owLuftfeuchtigkeit);}
	if(cuxWDS){dom.GetObject(cuxWDSName#'.SET_HUMIDITY').State(owLuftfeuchtigkeit);}
}



!Schreiben von svWindrichtung
if(svWindRichtung)
{
	!Englische Windrichtungsangaben %u0102¼bersetzen (z.B. N-W-E in Nord-West-Ost)
	genString1='';genString2='';genString3='';genInteger1=0;
	genString1 = owWindRichtung;
	foreach(genInteger1,genString1.Length())
	{
		genString2=genString1.Substr(genInteger1-1,1);
		if(genString2=='E'){genString3=genString3#'Ost-';}
		if(genString2=='S'){genString3=genString3#'S%u0102¼d-';}
		if(genString2=='W'){genString3=genString3#'West-';}
		if(genString2=='N'){genString3=genString3#'Nord-';}
	}
	genString1=genString3.Substr(0,genString3.Length()-1);
	if (owGradzahl>=0){genString2=owGradzahl.ToString()#'° '#genString1;}
	
	svObject = dom.GetObject(svWindRichtung);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindRichtung);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Windrichtung');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindRichtung#';'#genString2);}

}



!Schreiben von svWetter
if(svWetter)
{
	genString1='';genString2='';genString3='';genInteger1=0;
	genString1 = owWetter;
	genString2=genString1;

	!WriteLine(genString2);

	if(genString2=='thunderstorm with light rain'){genString3=genString3#'Gewitter mit leichtem Regen';}
	if(genString2=='thunderstorm with rain'){genString3=genString3#'Gewittersturm mit Regen';}
	if(genString2=='thunderstorm with heavy rain'){genString3=genString3#'Gewitter mit heftigem Regen';}
	if(genString2=='light thunderstorm'){genString3=genString3#'leichtes Gewitter';}
	if(genString2=='thunderstorm'){genString3=genString3#'Gewitter';}
	if(genString2=='heavy thunderstorm'){genString3=genString3#'heftiges Gewitter';}
	if(genString2=='ragged thunderstorm'){genString3=genString3#'heftiges Gewitter';}
	if(genString2=='thunderstorm with light drizzle'){genString3=genString3#'Gewitter mit leichtem Nieselregen';}
	if(genString2=='thunderstorm with drizzle'){genString3=genString3#'Gewitter mit Nieselregen';}
	if(genString2=='thunderstorm with heavy drizzle'){genString3=genString3#'Gewitter mit starkem Nieselregen';}
	if(genString2=='light intensity drizzle'){genString3=genString3#'leichter Nieselregen';}
	if(genString2=='drizzle'){genString3=genString3#'Nieselregen';}
	if(genString2=='heavy intensity drizzle'){genString3=genString3#'starker Nieselregen';}
	if(genString2=='light intensity drizzle rain'){genString3=genString3#'leichter Nieselregen';}
	if(genString2=='drizzle rain'){genString3=genString3#'Nieselregen';}
	if(genString2=='heavy intensity drizzle rain'){genString3=genString3#'starker Nieselregen';}
	if(genString2=='shower rain and drizzle'){genString3=genString3#'Regenschauer und Nieselregen';}
	if(genString2=='heavy shower rain and drizzle'){genString3=genString3#'starker Regenschauer und Nieselregen';}
	if(genString2=='shower drizzle'){genString3=genString3#'Regenschauer';}
	if(genString2=='light rain'){genString3=genString3#'leichter Regen';}
	if(genString2=='moderate rain'){genString3=genString3#'m%u0102¤%u0102%u0178iger Regen';}
	if(genString2=='heavy intensity rain'){genString3=genString3#'starker Regen';}
	if(genString2=='very heavy rain'){genString3=genString3#'sehr starker Regen';}
	if(genString2=='extreme rain'){genString3=genString3#'Extremniederschl%u0102¤ge';}
	if(genString2=='freezing rain'){genString3=genString3#'Eisregen';}
	if(genString2=='light intensity shower rain'){genString3=genString3#'leichter Regenschauer';}
	if(genString2=='shower rain'){genString3=genString3#'Regenschauer';}
	if(genString2=='heavy intensity shower rain'){genString3=genString3#'starker Regenschauer';}
	if(genString2=='ragged shower rain'){genString3=genString3#'str%u0102¶mender Regen';}
	if(genString2=='light snow'){genString3=genString3#'leichter Schnee';}
	if(genString2=='snow'){genString3=genString3#'Schnee';}
	if(genString2=='heavy snow'){genString3=genString3#'heftiger Schneefall';}
	if(genString2=='sleet'){genString3=genString3#'Graupel';}
	if(genString2=='shower sleet'){genString3=genString3#'Schauer';}
	if(genString2=='light rain and snow'){genString3=genString3#'leichter Regen und Schnee';}
	if(genString2=='rain and snow'){genString3=genString3#'Schneeregen';}
	if(genString2=='light shower snow'){genString3=genString3#'leichter Schneeschauer';}
	if(genString2=='shower snow'){genString3=genString3#'Schneeschauer';}
	if(genString2=='heavy shower snow'){genString3=genString3#'starker Schneeschauer';}
	if(genString2=='mist'){genString3=genString3#'Nebel';}
	if(genString2=='smoke'){genString3=genString3#'Rauch';}
	if(genString2=='haze'){genString3=genString3#'Dunst';}
	if(genString2=='sand, dust whirls'){genString3=genString3#'Sand, Staubwirbel';}
	if(genString2=='fog'){genString3=genString3#'Nebel';}
	if(genString2=='sand'){genString3=genString3#'Sand';}
	if(genString2=='dust'){genString3=genString3#'Staub';}
	if(genString2=='volcanic ash'){genString3=genString3#'Vulkanasche';}
	if(genString2=='squalls'){genString3=genString3#'Sturmb%u0102¶en';}
	if(genString2=='tornado'){genString3=genString3#'Tornado';}
	if(genString2=='clear sky'){genString3=genString3#'klarer Himmel';}
	if(genString2=='few clouds'){genString3=genString3#'vereinzelte Wolken';}
	if(genString2=='scattered clouds'){genString3=genString3#'aufgelockerte Bew%u0102¶lkung';}
	if(genString2=='broken clouds'){genString3=genString3#'durchbrochene Bew%u0102¶lkung';}
	if(genString2=='overcast clouds'){genString3=genString3#'bedeckt';}

	genString1=genString3.Substr(0,genString3.Length());
	genString2=genString1;

	svObject = dom.GetObject(svWetter);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWetter);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo("OpenWeatherMap - Wetter");
		svObject.ValueUnit('');
		svObject.State(owWetter);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		!if(dom.GetObject("Tageszeit").Value()==0)
		if ((((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())>((0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger()))
		|| (((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())<((0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger())))
		{
			svObject.State(genString2#' ');
		}
		else
		{
			svObject.State(genString2);
		}
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetter#';'#genString2);}
}



!Schreiben von svNiederschlag
if(svNiederschlag)
{
	svObject = dom.GetObject(svNiederschlag);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svNiederschlag);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Niederschlagsmenge");
		svObject.ValueUnit("mm/h");
		svObject.ValueMin(0.0);
		svObject.ValueMax(100.0);
		svObject.State(owNiederschlag);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owNiederschlag);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlag#';'#owNiederschlag);}
}
!Schreiben von svNiederschlagsart
if(svNiederschlagsart)
{
	if (owNiederschlagsart=='rain'){owNiederschlagsart=1;}
	if (owNiederschlagsart=='snow'){owNiederschlagsart=2;}
	if (owNiederschlagsart=='no'){owNiederschlagsart=0;}

	svObject = dom.GetObject(svNiederschlagsart);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svNiederschlagsart);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istEnum);
		svObject.ValueList("kein Niederschlag;Regen;Schnee");
		svObject.DPInfo("OpenWeatherMap - Niederschlagsart");
		svObject.ValueUnit("");
		svObject.State(owNiederschlagsart);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owNiederschlagsart);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlagsart#';'#owNiederschlagsart);}
}



!Schreiben von svWolken
if(svWolken)
{
	svObject = dom.GetObject(svWolken);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWolken);
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Bew%u0102¶lkung");
		svObject.ValueUnit("%");
		svObject.ValueMin(0);
		svObject.ValueMax(100);
		svObject.State(owWolken);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owWolken);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWolken#';'#owWolken);}
}



!Schreiben von svWindrichtung
if((svWindRichtungInt)&&(owGradzahl>=0))
{
	svObject = dom.GetObject(svWindRichtungInt);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindRichtungInt);
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Windrichtung Integer");
		svObject.ValueUnit("°");
		svObject.ValueMin(0);
		svObject.ValueMax(360);
		svObject.State(owGradzahl);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owGradzahl);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindRichtungInt#';'#owGradzahl);}
}

mskrause
Beiträge: 167
Registriert: 13.10.2018, 20:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 13 Mal
Danksagung erhalten: 19 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von mskrause » 02.05.2020, 20:02

redy09 hat geschrieben:
01.05.2020, 12:31
Hier mal mein ganzer Code:
die Frage zur Niederschlagsmenge kann ich Dir nicht beantworten, da ich diese Variable in mein Script nicht implementiert habe, aber mir fällt auf, das in Deinem Script einige Textcodierungsfehler sind, oft nur in auskommentierten Zeilen, aber mindesten einer in einer aktiven Zeile, z. B. hier:

Code: Alles auswählen

string svWolken='OpenWeather Bew%u0102¶lkung';
das solltest Du erst einmal drüber gehen oder ist beim kopieren im Post was schief gelaufen?

mbhomie007
Beiträge: 347
Registriert: 13.02.2018, 19:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 127 Mal
Danksagung erhalten: 20 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von mbhomie007 » 03.05.2020, 12:40

Wetter.png
Hallo zusammen,

ich habe auch von regedit (Seite) 11 das Skript genommen.

Das Skript läuft an sich sehr gut, danke für die tolle Arbeit.

Lediglich die Systemvariablen "Bewölkung" und "Windrichtung Integer" werden nicht befüllt.
Auf OpenWeather stehen aber die Daten zur Verfügung.

Kann mir jemand helfen?

P.S. Das ! im Skript vor Zeile 30 habe ich entfernt.
Raspberry Pi 3 Model B Plus Rev 1.3 mit RPI-RF-MOD Funkmodul

mbhomie007
Beiträge: 347
Registriert: 13.02.2018, 19:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 127 Mal
Danksagung erhalten: 20 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von mbhomie007 » 04.05.2020, 22:34

Hallo zusammen,

Ich habe im Script nur die ID und die CUxD-Kanäle verändert.
Außerdem habe ich die Systemvariablen umbenannt unter "Systemvariablenbenennung"

Trotzdem bleiben die beiden Systemvariablen leer. :roll:

Code: Alles auswählen

!OpenWeather-CCU-Script, edited by regedit V1.2, 2019-08-31
!Verwendetes Original: DimMyPrp V1, 2017-02-15, edited by Schalterrei, 2018-07-25



!Hier EIGENE OpenWeatherAppID eintragen
string owAppid='XXXXXXXXXXXXXXXXXXXXXXXXXX';

!Optionale Experteneinstellungen: Angabe der Stadt (über https://openweathermap.org/city/) anstatt Geocoords (=false)
string owCityid=false;

!Optionale Experteneinstellungen: wget-Command per CUxD oder system.Exec (cuxCMDName='CUxD.<Seriennummer>:1'/false) sowie CUxD logging (true/false)
string cuxCMDName='CUxD.CUX2801001:4';
boolean useLOGIT=false;

!Optionale Experteneinstellungen: OpenWeather-Daten in CUxD Thermostat-Device schreiben (cuxWDSName='CUxD.<Seriennummer>:1'/false)
!Achtung: Gerät=("Universal Wrapper Device" (90) als "Thermostat" / Option "WEATHER|USE_HMDATAPT" muss auf false)
string cuxWDSName='CUxD.CUX9002001:1';


!Systemvariablenbenennung
string svAktualisierung='OpenWeatherMap Letzte Aktualisierung';
string svTemperatur='OpenWeatherMap Temperatur';
string svMinimalTemperatur='OpenWeatherMap Temperatur (min.)';
string svMaximalTemperatur='OpenWeatherMap Temperatur (max.)';
string svLuftfeuchtigkeit='OpenWeatherMap Luftfeuchte (rel.)';
string svLuftdruck='OpenWeatherMap Luftdruck';
string svWindGeschwindigkeit='OpenWeatherMap Windgeschwindigkeit';
string svWindRichtung='OpenWeatherMap Windrichtung';
string svWindRichtungInt='OpenWeatherMap WindrichtungInt';
string svWetterstation='OpenWeatherMap Wetterstation';
string svSonnenaufgang='OpenWeatherMap Sonnenaufgang';
string svSonnenuntergang='OpenWeatherMap Sonnenuntergang';
string svWetter='OpenWeatherMap Wetter';
string svNiederschlag='OpenWeatherMap Niederschlag';
string svNiederschlagsart='OpenWeatherMap Niederschlagsart';
string svWolken='OpenWeatherMap Bewölkung';





!************************************************************
!************************************************************
!BEGIN DES SCRIPTS
!************************************************************
!************************************************************

!Variablendeklaration
!***********************
!OpenWeather-Url mit Defaultwerte
string owLocation='&id=INSERT';
string owUrl='http://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric';
!CUxD/Exec und Rückgabe-Variablen (Programmablauf) mit Defaultwerte
boolean cuxCMD=false; boolean cuxWDS=false;string recXML;
!XML-Parser (Tagnamen)
string xmlStartTagName_Aktualisierung;string xmlEndTagName_Aktualisierung;
string xmlStartTagName_Temperatur;string xmlEndTagName_Temperatur;
string xmlStartTagName_Luftfeuchtigkeit;string xmlEndTagName_Luftfeuchtigkeit;
string xmlStartTagName_Luftdruck;string xmlEndTagName_Luftdruck;
string xmlStartTagName_Wind;string xmlEndTagName_Wind;
string xmlStartTagName_Geschwindigkeit;string xmlEndTagName_Geschwindigkeit;
string xmlStartTagName_Windrichtung;string xmlEndTagName_Windrichtung;
string xmlStartTagName_Stadt;string xmlEndTagName_Stadt;
string xmlStartTagName_Sonnenzeit;string xmlEndTagName_Sonnenzeit;
string xmlStartTagName_Wetter;string xmlEndTagName_Wetter;
string xmlStartTagName_Niederschlag;string xmlEndTagName_Niederschlag;
string xmlStartTagName_Wolken;string xmlEndTagName_Wolken;
!XML-Parser (Programmablauf)
integer xmlStartTagLenght;
integer xmlTagStart;integer xmlTagLength;
integer xmlAttributeStart;integer xmlAttributeLength;
string xmlTagContent;
string xmlAttributeValue;
!Zurückgemeldete und aus der XML extrahierte Werte von OpenWeather
real owTemperatur;real owMinimalTemperatur;real owMaximalTemperatur;
real owLuftfeuchtigkeit;
real owLuftdruck;
real owWindGeschwindigkeit;real owGradzahl;string owWindRichtung;
string owWetterstation;
string owAktualisierung;
string owSonnenaufgang;string owSonnenuntergang;
string owWetter;
real owNiederschlag;string owNiederschlagsart;
integer owWolken;
!Objekte für Systemvariablen (Programmablauf)
object svObject;
object svObjectlist;
!Objekte für Devices (Programmablauf)
string dvObjectID;
object dvObject;
object dvObjectlist;
!Generische Variablen (Mehrfachverwendung)
string genString1;string genString2;string genString3;
time genTime1;
integer genInteger1;integer genInteger2;
real genReal1;

!Url zum Abruf des XML-Strings zusammen sezten
!****************************************************
if(owCityid){
	owLocation='&id='#owCityid;
} else {
	if(system.Longitude()&&system.Latitude())
	{
		owLocation='&lat='#system.Latitude()#'&lon='#system.Longitude();
	}
}
owUrl = owUrl#'&APPID='#owAppid#owLocation;

!Prüfen, ob CUX-Daemon Devices vorhanden sind
!***************************************************
if(dom.GetObject(cuxCMDName#'.CMD_SETS')){cuxCMD = true;}
if(dom.GetObject(cuxWDSName#'.SET_TEMPERATURE')){cuxWDS=true;}

!wget ausführen
!*****************
if(cuxCMD)
{
	!Website via CUxD und wget aufrufen.
	dom.GetObject(cuxCMDName#'.CMD_SETS').State("wget -q -O - '"#owUrl#"'");
	dom.GetObject(cuxCMDName#'.CMD_QUERY_RET').State(1);
	recXML = dom.GetObject(cuxCMDName#'.CMD_RETS').State();
} else {
	!Fallback: Website via system.Exec und wget aufrufen
	system.Exec("wget -q -O - '"#owUrl#"'", &recXML, &genString1);
}

!Pruefen, ob XML-String geholt wurde, ansonsten abbrechen
!****************************************************************
if(!recXML){quit;}






!Tag-Namen-Suche im geholten XML-String vorbereiten
!*********************************************************
!Je nachdem, ob die Daten via CUxD oder Exex bezogen wurden, haben die XML-Tags ein anderes Format.
!Exex liefert einen XML-String mit eckigen Klammern nach dem Schema <tag></tag> oder <tag/>
!CUxD enternt eckige Klammern und liefert eine String nach dem Schema "tag /tag"
if(cuxCMD)
{
	!Suchstrings für XML-Tags von CUxD festlegen
	xmlStartTagName_Aktualisierung = 'lastupdate ';
	xmlEndTagName_Aktualisierung = '  /lastupdate';
	xmlStartTagName_Temperatur = 'temperature ';
	xmlEndTagName_Temperatur = '  /temperature';
	xmlStartTagName_Luftfeuchtigkeit = 'humidity ';
	xmlEndTagName_Luftfeuchtigkeit = '  /humidity';
	xmlStartTagName_Luftdruck = 'pressure ';
	xmlEndTagName_Luftdruck = '  /pressure';
	xmlStartTagName_Wind = 'wind ';
	xmlEndTagName_Wind = '  /wind';
	xmlStartTagName_Geschwindigkeit = 'speed ';
	xmlEndTagName_Geschwindigkeit = '  /speed';
	xmlStartTagName_Windrichtung = 'direction ';
	xmlEndTagName_Windrichtung = '  /direction';
	xmlStartTagName_Stadt = 'city ';
	xmlEndTagName_Stadt = '  /city';
	xmlStartTagName_Sonnenzeit = 'sun ';
	xmlEndTagName_Sonnenzeit = '  /sun';
	xmlStartTagName_Wetter = 'weather ';
	xmlEndTagName_Wetter = '  /weather';
	xmlStartTagName_Niederschlag = 'precipitation ';
	xmlEndTagName_Niederschlag = '  /precipitation';
	xmlStartTagName_Wolken = 'clouds ';
	xmlEndTagName_Wolken = '  /clouds';
} else {
	!Suchstrings für XML-Tags von Exec festlegen
	xmlStartTagName_Aktualisierung = '<lastupdate ';
	xmlEndTagName_Aktualisierung = '>';
	xmlStartTagName_Temperatur = '<temperature ';
	xmlEndTagName_Temperatur = '>';
	xmlStartTagName_Luftfeuchtigkeit = '<humidity ';
	xmlEndTagName_Luftfeuchtigkeit = '>';
	xmlStartTagName_Luftdruck = '<pressure ';
	xmlEndTagName_Luftdruck = '>';
	xmlStartTagName_Wind = '<wind>';
	xmlEndTagName_Wind = '</wind>';
	xmlStartTagName_Geschwindigkeit = '<speed ';
	xmlEndTagName_Geschwindigkeit = '>';
	xmlStartTagName_Windrichtung = '<direction ';
	xmlEndTagName_Windrichtung = '>';
	xmlStartTagName_Stadt = '<city ';
	xmlEndTagName_Stadt = '</city>';
	xmlStartTagName_Sonnenzeit = '<sun ';
	xmlEndTagName_Sonnenzeit = '>';
	xmlStartTagName_Wetter = '<weather ';
	xmlEndTagName_Wetter = '>';
	xmlStartTagName_Niederschlag = '<precipitation ';
	xmlEndTagName_Niederschlag = '>';
	xmlStartTagName_Wolken = '<clouds ';
	xmlEndTagName_Wolken = '>';

}

!Geholten XML-String parsen
!******************************

!Parser für svAktualisierung
if(svAktualisierung)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Aktualisierung.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Aktualisierung);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Aktualisierung);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Datenabruf-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owAktualisierung = xmlAttributeValue.ToString();
			}
		}
	}
}



!Parser für svTemperatur, svMinimalTemperatur, svMaximalTemperatur
if(svTemperatur)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Temperatur.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Temperatur);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Temperatur);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Temperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owTemperatur = xmlAttributeValue.ToFloat();
			}

			!MinimalTemperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('min="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owMinimalTemperatur = xmlAttributeValue.ToFloat();
			}

			!MaximalTemperatur-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('max="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owMaximalTemperatur = xmlAttributeValue.ToFloat();
			}

		}
	}
}



!Parser für svLuftfeuchtigkeit
if(svLuftfeuchtigkeit)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Luftfeuchtigkeit.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Luftfeuchtigkeit);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Luftfeuchtigkeit);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftfeuchtigkeits-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owLuftfeuchtigkeit = xmlAttributeValue.ToFloat();
			}

		}
	}
}


!Parser für svLuftdruck
if(svLuftdruck)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Luftdruck.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Luftdruck);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Luftdruck);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftdruck-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owLuftdruck = xmlAttributeValue.ToFloat();
			}

		}
	}
}


!Parser für owWindGeschwindigkeit
if(svWindGeschwindigkeit)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wind.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wind);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wind);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Sub-Parser Geschwindigkeit
			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
			xmlStartTagLenght = xmlStartTagName_Geschwindigkeit.Length();
			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Geschwindigkeit);
			if (xmlTagStart>=0)
			{
				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Geschwindigkeit);
				if(xmlTagLength>0)
				{
					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Geschwindigkeit-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('value="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owWindGeschwindigkeit = xmlAttributeValue.ToFloat();
					}

				}
			}

		}
	}
}



!Parser für owGradzahl, owWindRichtung
if((svWindRichtung)||(svWindRichtungInt))
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wind.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wind);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wind);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Sub-Parser Windrichtng
			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
			xmlStartTagLenght = xmlStartTagName_Windrichtung.Length();
			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Windrichtung);
			if (xmlTagStart>=0)
			{
				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Windrichtung);
				if(xmlTagLength>0)
				{
					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Gradzahl-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('value="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owGradzahl = xmlAttributeValue.ToInteger();
					}

					!Himmelsrichtung-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('code="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owWindRichtung = xmlAttributeValue.ToString();
					}

				}
				else
				{
					
					!QuickAndDirty fallback if no data
					owGradzahl=-1;
				}
			}
		}
	}
}



!Parser für owWetterstation
if((svWetterstation)||(svSonnenaufgang)||(svSonnenuntergang))
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Stadt.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Stadt);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Stadt);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Stadtname-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('name="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWetterstation = xmlAttributeValue.ToString();
			}

			!Sub-Parser Sonnezeit
			xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;
			xmlStartTagLenght = xmlStartTagName_Sonnenzeit.Length();
			xmlTagStart = xmlTagContent.Find(xmlStartTagName_Sonnenzeit);
			if (xmlTagStart>=0)
			{
				xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght);
				xmlTagLength = xmlTagContent.Find(xmlEndTagName_Sonnenzeit);
				if(xmlTagLength>0)
				{
					xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

					!Sonnenaufgang-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('rise="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owSonnenaufgang = xmlAttributeValue.ToString();
					}

					!Sonnenuntergang-Attribut auslesen
					xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
					xmlAttributeStart=xmlTagContent.Find('set="');
					if (xmlAttributeStart>=0)
					{
						xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+5);
						xmlAttributeLength = xmlAttributeValue.Find('"');
						xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
						owSonnenuntergang = xmlAttributeValue.ToString();
					}

				}
			}
		}
	}
}


!Parser für svWetter
if(svWetter)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wetter.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wetter);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wetter);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Luftfeuchtigkeits-Attribut auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWetter = xmlAttributeValue.ToString();
			}

		}
	}
}


!Parser für owNiederschlag, owNiederschlagTyp  -new
if((svNiederschlag)||(svNiederschlagsart))
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Niederschlag.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Niederschlag);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Niederschlag);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Niederschlagsart auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('mode="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owNiederschlagsart = xmlAttributeValue.ToString();
			}

			!Niederschlag auslesen
			if(owNiederschlagsart=='no')
			{
				owNiederschlag = 0;
			}
			else
			{
				xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
				xmlAttributeStart=xmlTagContent.Find('value="');
				if (xmlAttributeStart>=0)
				{
					xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
					xmlAttributeLength = xmlAttributeValue.Find('"');
					xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
					owNiederschlag = xmlAttributeValue.ToFloat();
				}
			}

		}
	}
}


!Parser für owWolken  -new
if(svWolken)
{
	xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent='';
	xmlStartTagLenght = xmlStartTagName_Wolken.Length();
	xmlTagStart = recXML.Find(xmlStartTagName_Wolken);
	if (xmlTagStart>=0)
	{
		xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght);
		xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wolken);
		if(xmlTagLength>0)
		{
			xmlTagContent = xmlTagContent.Substr(0,xmlTagLength);

			!Wolken auslesen
			xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue='';
			xmlAttributeStart=xmlTagContent.Find('value="');
			if (xmlAttributeStart>=0)
			{
				xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7);
				xmlAttributeLength = xmlAttributeValue.Find('"');
				xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength);
				owWolken = xmlAttributeValue.ToInteger();
			}

		}
	}
}



!Ermittelte Werte in Systemvariable schreiben
!**************************************************
!Wenn (noch) keine Systemvariable(n) vorhanden, diese anlegen.
!Code zum anlegen von Variablen abgeleitet von Esche's IT-Blog https://www.blogging-it.com/code-snippet-homematic-systemvariablen-ueber-ein-script-automatisch-erzeugen/programmierung/homematic-script.html

!Schreiben von svAktualisierung
if(svAktualisierung)
{
	!String bzw. Uhrzeit umformatieren
	genString1='';genTime1=null;genString2='';
	genString1 = owAktualisierung.Substr(0,10)#' '#owAktualisierung.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%d.%m.%Y %H:%M"#" Uhr");
	svObject = dom.GetObject(svAktualisierung);
	!Wenn noch keine Systemvarible vorhanden, diese anlegen
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svAktualisierung);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Aktualisierung');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	!Wenn CUxD-CMD-Device vorhanden und useLOGIT, dann Werte via CUxD loggen
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svAktualisierung#';'#genTime1);}
}



!Schreiben von svSonnenaufgang
if(svSonnenaufgang)
{
	genString1='';genTime1=null;genString2='';
	genString1 = owSonnenaufgang.Substr(0,10)#' '#owSonnenaufgang.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%H:%M"#" Uhr");
	svObject = dom.GetObject(svSonnenaufgang);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svSonnenaufgang);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Sonnenaufgang');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svSonnenaufgang#';'#genTime1);}
}



!Schreiben von svSonnenuntergang
if(svSonnenuntergang)
{
	genString1='';genTime1=null;genString2='';
	genString1 = owSonnenuntergang.Substr(0,10)#' '#owSonnenuntergang.Substr(11);
	integer DST;
	if (system.Date("%F").ToTime().IsDST() ==1) {DST = 7200;}
	else {DST = 3600;}
	genTime1 = genString1.ToTime()+DST;
	genString2 = genTime1.Format("%H:%M"#" Uhr");
	svObject = dom.GetObject(svSonnenuntergang);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svSonnenuntergang);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Sonnenuntergang');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svSonnenuntergang#';'#genTime1);}
}



!Schreiben von svWetterstation
if(svWetterstation)
{
	genString1='';genString2='';genString3='';genInteger1=0;genInteger2=0;
	genInteger1=owWetterstation.Length();
	foreach(genInteger2,genInteger1)
	{
		genString1=owWetterstation.Substr(genInteger2-1,1);
		if(genString1=='Ã')
		{
			genString2=owWetterstation.Substr(genInteger2,1);
			if(genString2=='¼'){genString1='ü';genInteger2=genInteger2+1;}
			if(genString2=='¶'){genString1='ö';genInteger2=genInteger2+1;}
			if(genString2=='¤'){genString1='ä';genInteger2=genInteger2+1;}
		}
		genString3=genString3#genString1;
	}

	svObject = dom.GetObject(svWetterstation);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWetterstation);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Wetterstation');
		svObject.ValueUnit('');
		svObject.State(genString3);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString3);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetterstation#';'#genString3);}
}



!Schreiben von svWindgeschwindigkeit
if(svWindGeschwindigkeit)
{
	svObject = dom.GetObject(svWindGeschwindigkeit);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindGeschwindigkeit);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Windgeschwindigkeit");
		svObject.ValueUnit("km/h");
		svObject.ValueMin(0.0000);
		svObject.ValueMax(500.0000);
		svObject.State(owWindGeschwindigkeit);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State((owWindGeschwindigkeit)*3,6);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindGeschwindigkeit#';'#owWindGeschwindigkeit);}
}



!Schreiben von svLuftdruck
if(svLuftdruck)
{
	svObject = dom.GetObject(svLuftdruck);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svLuftdruck);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Luftdruck");
		svObject.ValueUnit("hPa");
		svObject.ValueMin(500.0000);
		svObject.ValueMax(1100.0000);
		svObject.State(owLuftdruck);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owLuftdruck);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svLuftdruck#';'#owLuftdruck);}
}



!Schreiben von svTemperatur
if(svTemperatur)
{
	svObject = dom.GetObject(svTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svTemperatur#';'#owTemperatur);}
	if(cuxWDS){dom.GetObject(cuxWDSName#'.SET_TEMPERATURE').State(owTemperatur);}
}



!Schreiben von svMinimalTemperatur
if(svMinimalTemperatur)
{
	svObject = dom.GetObject(svMinimalTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svMinimalTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur (min.)");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owMinimalTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owMinimalTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svMinimalTemperatur#';'#owMinimalTemperatur);}
}



!Schreiben von svMaximalTemperatur
if(svMaximalTemperatur)
{
	svObject = dom.GetObject(svMaximalTemperatur);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svMaximalTemperatur);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Temperatur (max.)");
		svObject.ValueUnit("°C");
		svObject.ValueMin(-50.0000);
		svObject.ValueMax(50.0000);
		svObject.State(owMaximalTemperatur);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owMaximalTemperatur);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svMaximalTemperatur#';'#owMaximalTemperatur);}
}



!Schreiben von svLuffeuchtigkeit
if(svLuftfeuchtigkeit)
{
	svObject = dom.GetObject(svLuftfeuchtigkeit);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svLuftfeuchtigkeit);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Luftfeuchtigkeit");
		svObject.ValueUnit("%");
		svObject.ValueMin(0.0000);
		svObject.ValueMax(100.0000);
		svObject.State(owLuftfeuchtigkeit);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owLuftfeuchtigkeit);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svLuftfeuchtigkeit#';'#owLuftfeuchtigkeit);}
	if(cuxWDS){dom.GetObject(cuxWDSName#'.SET_HUMIDITY').State(owLuftfeuchtigkeit);}
}



!Schreiben von svWindrichtung
if(svWindRichtung)
{
	!Englische Windrichtungsangaben übersetzen (z.B. N-W-E in Nord-West-Ost)
	genString1='';genString2='';genString3='';genInteger1=0;
	genString1 = owWindRichtung;
	foreach(genInteger1,genString1.Length())
	{
		genString2=genString1.Substr(genInteger1-1,1);
		if(genString2=='E'){genString3=genString3#'Ost-';}
		if(genString2=='S'){genString3=genString3#'Süd-';}
		if(genString2=='W'){genString3=genString3#'West-';}
		if(genString2=='N'){genString3=genString3#'Nord-';}
	}
	genString1=genString3.Substr(0,genString3.Length()-1);
	if (owGradzahl>=0){genString2=owGradzahl.ToString()#'° '#genString1;}
	
	svObject = dom.GetObject(svWindRichtung);
	if (!svObject)
	{
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindRichtung);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo('OpenWeatherMap - Windrichtung');
		svObject.ValueUnit('');
		svObject.State(genString2);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(genString2);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindRichtung#';'#genString2);}

}



!Schreiben von svWetter
if(svWetter)
{
	genString1='';genString2='';genString3='';genInteger1=0;
	genString1 = owWetter;
	genString2=genString1;

	!WriteLine(genString2);

	if(genString2=='thunderstorm with light rain'){genString3=genString3#'Gewitter mit leichtem Regen';}
	if(genString2=='thunderstorm with rain'){genString3=genString3#'Gewittersturm mit Regen';}
	if(genString2=='thunderstorm with heavy rain'){genString3=genString3#'Gewitter mit heftigem Regen';}
	if(genString2=='light thunderstorm'){genString3=genString3#'leichtes Gewitter';}
	if(genString2=='thunderstorm'){genString3=genString3#'Gewitter';}
	if(genString2=='heavy thunderstorm'){genString3=genString3#'heftiges Gewitter';}
	if(genString2=='ragged thunderstorm'){genString3=genString3#'heftiges Gewitter';}
	if(genString2=='thunderstorm with light drizzle'){genString3=genString3#'Gewitter mit leichtem Nieselregen';}
	if(genString2=='thunderstorm with drizzle'){genString3=genString3#'Gewitter mit Nieselregen';}
	if(genString2=='thunderstorm with heavy drizzle'){genString3=genString3#'Gewitter mit starkem Nieselregen';}
	if(genString2=='light intensity drizzle'){genString3=genString3#'leichter Nieselregen';}
	if(genString2=='drizzle'){genString3=genString3#'Nieselregen';}
	if(genString2=='heavy intensity drizzle'){genString3=genString3#'starker Nieselregen';}
	if(genString2=='light intensity drizzle rain'){genString3=genString3#'leichter Nieselregen';}
	if(genString2=='drizzle rain'){genString3=genString3#'Nieselregen';}
	if(genString2=='heavy intensity drizzle rain'){genString3=genString3#'starker Nieselregen';}
	if(genString2=='shower rain and drizzle'){genString3=genString3#'Regenschauer und Nieselregen';}
	if(genString2=='heavy shower rain and drizzle'){genString3=genString3#'starker Regenschauer und Nieselregen';}
	if(genString2=='shower drizzle'){genString3=genString3#'Regenschauer';}
	if(genString2=='light rain'){genString3=genString3#'leichter Regen';}
	if(genString2=='moderate rain'){genString3=genString3#'mäßiger Regen';}
	if(genString2=='heavy intensity rain'){genString3=genString3#'starker Regen';}
	if(genString2=='very heavy rain'){genString3=genString3#'sehr starker Regen';}
	if(genString2=='extreme rain'){genString3=genString3#'Extremniederschläge';}
	if(genString2=='freezing rain'){genString3=genString3#'Eisregen';}
	if(genString2=='light intensity shower rain'){genString3=genString3#'leichter Regenschauer';}
	if(genString2=='shower rain'){genString3=genString3#'Regenschauer';}
	if(genString2=='heavy intensity shower rain'){genString3=genString3#'starker Regenschauer';}
	if(genString2=='ragged shower rain'){genString3=genString3#'strömender Regen';}
	if(genString2=='light snow'){genString3=genString3#'leichter Schnee';}
	if(genString2=='snow'){genString3=genString3#'Schnee';}
	if(genString2=='heavy snow'){genString3=genString3#'heftiger Schneefall';}
	if(genString2=='sleet'){genString3=genString3#'Graupel';}
	if(genString2=='shower sleet'){genString3=genString3#'Schauer';}
	if(genString2=='light rain and snow'){genString3=genString3#'leichter Regen und Schnee';}
	if(genString2=='rain and snow'){genString3=genString3#'Schneeregen';}
	if(genString2=='light shower snow'){genString3=genString3#'leichter Schneeschauer';}
	if(genString2=='shower snow'){genString3=genString3#'Schneeschauer';}
	if(genString2=='heavy shower snow'){genString3=genString3#'starker Schneeschauer';}
	if(genString2=='mist'){genString3=genString3#'Nebel';}
	if(genString2=='smoke'){genString3=genString3#'Rauch';}
	if(genString2=='haze'){genString3=genString3#'Dunst';}
	if(genString2=='sand, dust whirls'){genString3=genString3#'Sand, Staubwirbel';}
	if(genString2=='fog'){genString3=genString3#'Nebel';}
	if(genString2=='sand'){genString3=genString3#'Sand';}
	if(genString2=='dust'){genString3=genString3#'Staub';}
	if(genString2=='volcanic ash'){genString3=genString3#'Vulkanasche';}
	if(genString2=='squalls'){genString3=genString3#'Sturmböen';}
	if(genString2=='tornado'){genString3=genString3#'Tornado';}
	if(genString2=='clear sky'){genString3=genString3#'klarer Himmel';}
	if(genString2=='few clouds'){genString3=genString3#'vereinzelte Wolken';}
	if(genString2=='scattered clouds'){genString3=genString3#'aufgelockerte Bewölkung';}
	if(genString2=='broken clouds'){genString3=genString3#'durchbrochene Bewölkung';}
	if(genString2=='overcast clouds'){genString3=genString3#'bedeckt';}

	genString1=genString3.Substr(0,genString3.Length());
	genString2=genString1;

	svObject = dom.GetObject(svWetter);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWetter);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istChar8859);
		svObject.DPInfo("OpenWeatherMap - Wetter");
		svObject.ValueUnit('');
		svObject.State(owWetter);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		!if(dom.GetObject("Tageszeit").Value()==0)
		if ((((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())>((0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger()))
		|| (((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())<((0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger())))
		{
			svObject.State(genString2#' ');
		}
		else
		{
			svObject.State(genString2);
		}
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetter#';'#genString2);}
}



!Schreiben von svNiederschlag
if(svNiederschlag)
{
	svObject = dom.GetObject(svNiederschlag);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svNiederschlag);
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Niederschlagsmenge");
		svObject.ValueUnit("mm/h");
		svObject.ValueMin(0.0);
		svObject.ValueMax(100.0);
		svObject.State(owNiederschlag);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owNiederschlag);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlag#';'#owNiederschlag);}
}
!Schreiben von svNiederschlagsart
if(svNiederschlagsart)
{
	if (owNiederschlagsart=='rain'){owNiederschlagsart=1;}
	if (owNiederschlagsart=='snow'){owNiederschlagsart=2;}
	if (owNiederschlagsart=='no'){owNiederschlagsart=0;}

	svObject = dom.GetObject(svNiederschlagsart);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svNiederschlagsart);
		svObject.ValueType(ivtString);
		svObject.ValueSubType(istEnum);
		svObject.ValueList("kein Niederschlag;Regen;Schnee");
		svObject.DPInfo("OpenWeatherMap - Niederschlagsart");
		svObject.ValueUnit("");
		svObject.State(owNiederschlagsart);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owNiederschlagsart);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlagsart#';'#owNiederschlagsart);}
}



!Schreiben von svWolken
if(svWolken)
{
	svObject = dom.GetObject(svWolken);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWolken);
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Bewölkung");
		svObject.ValueUnit("%");
		svObject.ValueMin(0);
		svObject.ValueMax(100);
		svObject.State(owWolken);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owWolken);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWolken#';'#owWolken);}
}



!Schreiben von svWindrichtung
if((svWindRichtungInt)&&(owGradzahl>=0))
{
	svObject = dom.GetObject(svWindRichtungInt);
	if (!svObject){
		svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
		svObject = dom.CreateObject(OT_VARDP);
		svObjectlist.Add(svObject.ID());
		svObject.Name(svWindRichtungInt);
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istGeneric);
		svObject.DPInfo("OpenWeatherMap - Windrichtung Integer");
		svObject.ValueUnit("°");
		svObject.ValueMin(0);
		svObject.ValueMax(360);
		svObject.State(owGradzahl);
		svObject.Internal(false);
		svObject.Visible(true);
		dom.RTUpdate(true);
	} else {
		svObject.State(owGradzahl);
	}
	if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindRichtungInt#';'#owGradzahl);}
}
}
Raspberry Pi 3 Model B Plus Rev 1.3 mit RPI-RF-MOD Funkmodul

mskrause
Beiträge: 167
Registriert: 13.10.2018, 20:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 13 Mal
Danksagung erhalten: 19 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von mskrause » 05.05.2020, 13:24

mbhomie007 hat geschrieben:
04.05.2020, 22:34
Hallo zusammen,

Ich habe im Script nur die ID und die CUxD-Kanäle verändert.
Außerdem habe ich die Systemvariablen umbenannt unter "Systemvariablenbenennung"

Trotzdem bleiben die beiden Systemvariablen leer. :roll:
Hm, da unsere Scripte ja nun fast identisch sind, scheint es daran nicht zu liegen, bleiben mir noch zwei Vorschläge für Dich:

1. Prüf die SV mit einem anderen Ort in den Script-Einstellungen
2. Prüf bitte, ob die Kanalzuordnung in den SV-Einstellungen bei beiden SV korrekt ist

Gruß
Marco

mbhomie007
Beiträge: 347
Registriert: 13.02.2018, 19:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 127 Mal
Danksagung erhalten: 20 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von mbhomie007 » 05.05.2020, 19:10

mskrause hat geschrieben:
05.05.2020, 13:24
mbhomie007 hat geschrieben:
04.05.2020, 22:34
Hallo zusammen,

Ich habe im Script nur die ID und die CUxD-Kanäle verändert.
Außerdem habe ich die Systemvariablen umbenannt unter "Systemvariablenbenennung"

Trotzdem bleiben die beiden Systemvariablen leer. :roll:
Hm, da unsere Scripte ja nun fast identisch sind, scheint es daran nicht zu liegen, bleiben mir noch zwei Vorschläge für Dich:

1. Prüf die SV mit einem anderen Ort in den Script-Einstellungen
2. Prüf bitte, ob die Kanalzuordnung in den SV-Einstellungen bei beiden SV korrekt ist

Gruß
Marco
Hallo Marco,

Zu 1.: Müsste er nicht egal welchen Standort die "Windrichtung Integer" Variable beschreiben?
Die Variable "Windrichtung" wird ja beschrieben...

Für die Systemvariable "Bewölkung" stehen jedenfalls auf der Website OpenWeather (Clouds XX%) die Daten bereit.

Zu 2.: Was meinst du damit genau? Die Systemvariablen stimmen mit den Namen im Skript überein und haben auch alle den gleichen Timestamp. (auch die Variablen "Windrichtung Integer" und "Bewölkung")

P.S. Ich werden es nachher mit einem anderen Standort versuchen.
Raspberry Pi 3 Model B Plus Rev 1.3 mit RPI-RF-MOD Funkmodul

Antworten

Zurück zu „Projektvorstellungen“