HM-Script für virtuelle Wetterstation

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Schalterrei
Beiträge: 142
Registriert: 05.01.2018, 17:26
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Schalterrei » 21.07.2018, 15:44

Moin zusammen,

ich hab das Script noch um Wetterbedingungen erweitert:
Bild

Dazu eine weitere Variable anlegen:
Bild

.. und im Code hinzufügen:

Code: Alles auswählen

!Variablendeklaration
string svWetter='OpenWeather Wetter';
string xmlStartTagName_Wetter;string xmlEndTagName_Wetter;
string owWetter;

!Suchstrings für XML-Tags von CUxD festlegen
xmlStartTagName_Wetter = 'weather ';
xmlEndTagName_Wetter = '  /weather';

!Suchstrings für XML-Tags von Exec festlegen
xmlStartTagName_Wetter = '<weather ';
xmlEndTagName_Wetter = '>';


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

    genString2=genString1;
	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((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetter#';'#genString2);}
} 
Da ich in meinem Script noch diverse andere Anpassungen vorgenommen habe, sind oben nur die Änderungsdaten angegeben - C&P des gesamtem Codes funktioniert also nicht, man muss es kommentierten Stellen (!) im ursprünglichen Script hinzufügen.

Da es verdammt viele Weather-Conditions gibt, habe ich mich auf die Basis-Nodes beschränkt, kann ja jeder selbst nach belieben erweitern.

edit: Sind nun alle 54 Wetterkonditionen drin, auch wenn ich Vulkanasche und Staubwirbel eher nicht erwarte. Gerade bei den Regenarten ist die Übersetzung nicht ganz trivial. Wenn jemand Korrekturanmerkungen hat, her damit.

Weiter könnte man das Script noch um die Variable clouds, precipitation, speed name und visibility erweitern (das jedenfalls gibt die XML noch her). Es gibt das ganze noch im JSON Format (deutlich ausführlicher, inkl. forecast), aber vielleicht ein anderes mal..

Aktuell gibt das vollständige Script damit folgende Wetterdaten wieder:
Bild

Benutzeravatar
Meyer11
Beiträge: 88
Registriert: 28.11.2017, 11:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Ostfriesland
Hat sich bedankt: 12 Mal
Danksagung erhalten: 3 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Meyer11 » 23.07.2018, 17:11

Moin,

erstmal vielen Dank für das Script.
Läuft hervorragend.
Leider scheitere ich nun beim einbinden der Wetterbedingungen.
Hier werden mir der Variablen nur ??? angezeigt und diese nicht aktualisiert ?
Was habe ich falsch gemacht ?

Code: Alles auswählen

!OpenWeather-CCU-Script, Version 1, 15.02.2017, dimmyprp

!Hier den API-Key von OpenWeather eintragen bzw. den vorhanden Key austauschen.
!Dieser Key wird benötigt, um die Wetterdaten abrufen zu können. 
!Der hier bereits hinterlegte Key funktioniert zwar, es können jedoch nur zeitlich begrenzt Wetterdaten abgerufen werden.
!Erstellung eines eigenen Keys unter http://openweathermap.org/appid

string owAppid='XXXXXXXXXXXXXXX';


!Hier die ID der Wetterstation bzw. Stadt eitragen bzw. austauschen, von der die Wetterdaten abgerufen werden sollen.
!Eine Liste aller Stationen finden Sie unter http://bulk.openweathermap.org/sample/city.list.json.gz
!Die aktuell hinterlegte Station bzw. ID 6556765 gibt das Wetter für Berlin aus.
!Wenn Sie keine ID angeben UND in Ihrer Homematic unter "Einstellungen" > "Zeit-/Positionseinstellungen" unter dem Punkt "Positionsangabe"
!Ihre Koordinaten hinterlegt haben, können Sie von OpenWeather auch eine Wetterstation in Ihrer Nähe suchen lassen und deren Werte abrufen.
!Beispiele
!string owCityid='2950159';		Ruft die Wetterdaten für Berlin ab
!string owCityid='6556765';		Ruft die Wetterdaten für Pegnitz ab
!string owCityid='';			Ruft die Wetterdaten in Ihrer Nähe ab (wenn Positionsangaben in den Einstellungen hinterlegt wurden)
!string owCityid=false;			Ruft die Wetterdaten in Ihrer Nähe ab (wenn Positionsangaben in den Einstellungen hinterlegt wurden)

string owCityid='2937944';


!Optional: Im Folgenden die Namen der Systemvariablen ändern/vorgeben.
!Die abgerufenen Wetterdaten werden in mehreren Systemvariablen gespeichert und angezeigt (sie müssen vorab keine Variablen anlegen. Dies erledigt diese Script gegebenenfalls automatisch).
!Im Folgenden können Sie die Namen der Systemvariablen (so, wie Sie Ihnen in Ihrer Homematic später unter "Status und Bedienung" > "Systemvariable" angezeigt
!werden, ändern. Möchten Sie, dass ein bestimmter Messwert nicht angezeigt bzw. abgerufen wird, lassen Sie den Namen leer ''.
!Beispiele
!string svLuftdruck='ow Luftdruck';		Die Systemvariable für den Luftdruck soll "ow Lufdruck" heißen
!string svLuftdruck='Luftdr.';			Die Systemvariable für den Luftdruck soll "Luftdr." heißen
!string svLuftdruck='';					Es soll überhaupt kein Luftdruck angezeigt bzw. abgerufen werden
!string svLuftdruck=false;				Es soll überhaupt kein Luftdruck angezeigt bzw. abgerufen werden

string svAktualisierung='ow Letzte Aktualisierung';
string svTemperatur='ow Temperatur';
string svMinimalTemperatur='ow Temperatur (min.)';
string svMaximalTemperatur='ow Temperatur (max.)';
string svLuftfeuchtigkeit='ow Luftfeuchte (rel.)';
string svLuftdruck='ow Luftdruck';
string svWindGeschwindigkeit='ow Windgeschwindigkeit';
string svWindRichtung='ow Windrichtung';
string svWetterstation='ow Wetterstation';
string svSonnenaufgang='ow Sonnenaufgang';
string svSonnenuntergang='ow Sonnenuntergang';
string svWetter='OpenWeather Wetter';


!Optionale Experteneinstellungen: OpenWeather-Daten per CUxD abrufen
!Falls Sie in Ihrer Homematic die Software CUX-Daemon installiert haben, setzt dieses Script den wget-Command standardmäßig per
!CUxD "System-Devices" (28) bzw. Device CUxD.CUX2801001:1 ab. Hier gegebenenfalls den Namen des Devices nach dem Schema "CUxD.<Seriennummer>:1" ändern.
!Falls Sie nicht möchten, dass der wget-Gommand per CUxD sondern per system.Exec erfolgt, setzen Sie diese Variable auf false (string cuxCMDName=false;)

string cuxCMDName='CUxD.CUX2801001:1';


!Optionale Experteneinstellungen: OpenWeather-Daten bzw. Systemvariblen per CUxD Logit aufzeichnen
!Falls der CUX-Daemon installiert ist, werden die Messdaten der o.g. Systemvariablen dieses Scripts standardmäßig zusätzlich per CUxD LOGIT aufgezeichnet
!Falls Sie keine Aufzeichnng der Messdaten wünschen, ändern Sie diese Variable auf false (string cuxCMDName=false;)

boolean useLOGIT=true;


!Optionale Experteneinstellungen: OpenWeather-Daten in CUxD Thermostat-Device schreiben
!Falls der CUX-Daemon installiert ist und Sie ein "Universal Wrapper Device" (90) mit der Funktion "Thermostat" angelgt haben, kann dieses Script einige
!der abgerufenen Messwerte direkt in das Device schreiben (das ist der eigentliche Sinn dieses Scripts).
!Wichtig: Damit dies funktioniert, muss in den Einstellungen des Devices, im Kanal 1 die Option "WEATHER|USE_HMDATAPT" deaktiviert sein (nicht angehakt).
!Hier gegebenenfalls den Namen des Devices nach dem Schema "CUxD.<Seriennummer>:1" ändern.
!Falls Sie nicht möchten, dass Messwerte in das Device geschrieben werden, setzen Sie diese Variable auf false (string cuxWDSName=false;)

string cuxWDSName='CUxD.CUX9002001:1';





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

!Variablendeklaration
!***********************
!OpenWeather-Url mit Defaultwerte
string owLocation='&id=2950159';
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;
!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;
!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';
} else {
  !Suchstrings für XML-Tags von Exec festlegen
  xmlStartTagName_Aktualisierung = '<lastupdate ';
  xmlEndTagName_Aktualisierung = '>';
  xmlStartTagName_Temperatur = '<humidity ';
  xmlEndTagName_Temperatur = '>';
  xmlStartTagName_Luftfeuchtigkeit = '<humidity ';
  xmlEndTagName_Luftfeuchtigkeit = '>';
  xmlStartTagName_Luftdruck = '<pressure ';
  xmlEndTagName_Luftdruck = '>';
  xmlStartTagName_Wind = '<wind ';
  xmlEndTagName_Wind = '>';
	xmlStartTagName_Geschwindigkeit = '<speed ';
	xmlEndTagName_Geschwindigkeit = '>';
	xmlStartTagName_Windrichtung = '<direction ';
	xmlEndTagName_Windrichtung = '>';
  xmlStartTagName_Stadt = '<city ';
  xmlEndTagName_Stadt = '>';
	xmlStartTagName_Sonnezeit = '<sun ';
	xmlEndTagName_Sonnenzeit = '>';
	xmlStartTagName_Wetter = '<weather ';
	xmlEndTagName_Wetter = '>';
}

!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()*3.6;
					}	
	
				}
			}
			
		}
	}
}



!Parser für owGradzahl, owWindRichtung
if(svWindRichtung)
{
	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();
					}	
	
				}
			}
		}
	}
}



!Parser für owWetterstation
if(svWetterstation)
{
	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();
					}	
	
				}
			}
		}
	}
}






!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("%d.%m.%Y %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("%d.%m.%Y %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);
	}
	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 svWetter
if(svWetter)
{
   genString1='';genString2='';genString3='';genInteger1=0;
   genString1 = owWetter;

    genString2=genString1;
	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((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetter#';'#genString2);}
} 


!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);
	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);}
}

SysVar.jpg
Zuletzt geändert von alchy am 23.07.2018, 17:13, insgesamt 1-mal geändert.
Grund: APP ID gelöscht
Gruß Frank

Schalterrei
Beiträge: 142
Registriert: 05.01.2018, 17:26
Hat sich bedankt: 2 Mal
Danksagung erhalten: 2 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Schalterrei » 25.07.2018, 22:48

Hallo,

sind die beiden CUxD Devices angelegt?

Ich hänge mal mein vollständiges Script an (AppID und owLocation ergänzen):

Code: Alles auswählen

!OpenWeather-CCU-Script, Version 1, 15.02.2017


string owAppid='INSERT';
string owCityid=false;

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 svWetterstation='OpenWeather Wetterstation';
string svSonnenaufgang='OpenWeather Sonnenaufgang';
string svSonnenuntergang='OpenWeather Sonnenuntergang';
string svWetter='OpenWeather Wetter';


!Optionale Experteneinstellungen: OpenWeather-Daten per CUxD abrufen
!Falls Sie in Ihrer Homematic die Software CUX-Daemon installiert haben, setzt dieses Script den wget-Command standardmäßig per
!CUxD "System-Devices" (28) bzw. Device CUxD.CUX2801001:1 ab. Hier gegebenenfalls den Namen des Devices nach dem Schema "CUxD.<Seriennummer>:1" ändern.
!Falls Sie nicht möchten, dass der wget-Gommand per CUxD sondern per system.Exec erfolgt, setzen Sie diese Variable auf false (string cuxCMDName=false;)

string cuxCMDName='CUxD.CUX2801001:1';


!Optionale Experteneinstellungen: OpenWeather-Daten bzw. Systemvariblen per CUxD Logit aufzeichnen
!Falls der CUX-Daemon installiert ist, werden die Messdaten der o.g. Systemvariablen dieses Scripts standardmäßig zusätzlich per CUxD LOGIT aufgezeichnet
!Falls Sie keine Aufzeichnng der Messdaten wünschen, ändern Sie diese Variable auf false (string cuxCMDName=false;)

boolean useLOGIT=true;


!Optionale Experteneinstellungen: OpenWeather-Daten in CUxD Thermostat-Device schreiben
!Falls der CUX-Daemon installiert ist und Sie ein "Universal Wrapper Device" (90) mit der Funktion "Thermostat" angelgt haben, kann dieses Script einige
!der abgerufenen Messwerte direkt in das Device schreiben (das ist der eigentliche Sinn dieses Scripts).
!Wichtig: Damit dies funktioniert, muss in den Einstellungen des Devices, im Kanal 1 die Option "WEATHER|USE_HMDATAPT" deaktiviert sein (nicht angehakt).
!Hier gegebenenfalls den Namen des Devices nach dem Schema "CUxD.<Seriennummer>:1" ändern.
!Falls Sie nicht möchten, dass Messwerte in das Device geschrieben werden, setzen Sie diese Variable auf false (string cuxWDSName=false;)

string cuxWDSName='CUxD.CUX9002001:1';


!************************************************************
!************************************************************
!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;
!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;
!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';
} 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 = '>';
}

!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()*3.6;
               }   
   
            }
         }
         
      }
   }
}



!Parser für owGradzahl, owWindRichtung
if(svWindRichtung)
{
   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();
               }   
   
            }
         }
      }
   }
}



!Parser für owWetterstation
if(svWetterstation)
{
   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();
         }   
   
      }
   }
}




!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);
   genTime1 = genString1.ToTime();
   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("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 ü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);
   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);}
} 
Sind noch ein paar Anpassungen drin die ggf. ausgebaut werden müssten (ich hab z.B. eine Tag/Nacht Unterscheidung drin, damit ich unterschiedliche Icons verwenden kann und eine Umrechnung der UTC Zeit).

Linnet998
Beiträge: 110
Registriert: 04.07.2018, 21:46
Danksagung erhalten: 2 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Linnet998 » 28.07.2018, 16:18

Funzt super gut danke...

Aber ein Wert fehlt da noch die mir wichtig wäre... die Tages Max Temperatur. Hätte die gern für meine rollos morgens wenn eine gewisse temp erwartet wird sollen se bereits auf hitzeabwehr gehen.

Die max temp die bislang abgefragt wird scheint mir die max temp in der Umgebung aktuell zu sein. Mir zeigt er nämlich grad min 22grad max 25grad an und aktuell 24grad vorhin waren es aber 26grad und auf der openweather Page zeigt er um 17uhr heute 28grad an
Könntet ihr das bitte ebenfalls einbinden und wie schalterei als fertig script hier einfügen?
Danke im voraus

Benutzeravatar
Meyer11
Beiträge: 88
Registriert: 28.11.2017, 11:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Ostfriesland
Hat sich bedankt: 12 Mal
Danksagung erhalten: 3 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Meyer11 » 28.07.2018, 18:06

Schalterrei hat geschrieben:
25.07.2018, 22:48
Hallo,

sind die beiden CUxD Devices angelegt?

Ich hänge mal mein vollständiges Script an (AppID und owLocation ergänzen)
Hi Schalterei,
hab nun endlich die Zeit gefunden dein Script mal einzupflegen.
Dabei habe ich dann auch die CUxD Seriennummern neu reinkopiert.
Nun läuft es ! Vielleicht irgendwo ein Tippfehler bei den CUxD Devices.

Vielen Dank !

P.S. müsste die Einheit der Variable Windgeschwindigkeit nicht km/h sein ?
Gruß Frank

Alexxx2005
Beiträge: 250
Registriert: 17.12.2014, 18:56
Hat sich bedankt: 19 Mal
Danksagung erhalten: 3 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Alexxx2005 » 08.08.2018, 15:01

Hallo DimMyPrp,

wahnsinns Idee gefällt mir, zeigt es dann die Wetterstation im Pocket Control
an wie eine "richtige" Homematic OC3 Wetterstation :?:

Viele Grüße Alex

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Chemieka » 03.10.2018, 18:13

Bräuchte auch die Niederschlagsmenge. Wenn jemand da eine Idee hätte.
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

schonwiederich
Beiträge: 52
Registriert: 07.10.2016, 13:44
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von schonwiederich » 22.11.2018, 09:59

Hallo zusammen,

ich habe nun alles umgesetzt wie es hier im Threat steht. Zwei Punkte vermisse ich nicht / verstehe ich nicht.

1. Neben der Temp ist doch auch immer sehr interessant wie der Niederschlagsmengenforecast aussieht.
Gibt es den Wert und ich hab ihn übersehen ?

2. Die Temperaturwerte.
A. In der 3 Tagesvorschau habe ich herausgelesen, das MIN MAX und AVG sich immer auf den gesamten jeweiligen Tag beziehen.
B. In der 3 Stunden Vorschau wird ausschließlich der Forecastwert für in 3 Studnen ausgegeben (bzw. für das gwünschte Segment.)
C. Die Werte Min und MAx des ersten Scriptes verstehe ich nicht. Was mir hier aussgegeben wird können nicht die Tageswerte Min und MAX sein.
Sind das die Werte der letzten (wie definierten) Zeitspanne? oder was genau sollen MIN und MAX hier aussagen ?

Vielen lieben dank vorab für Eure Hilfe!

VG Schonwiederich

drmaxxi
Beiträge: 85
Registriert: 20.01.2018, 12:30
Hat sich bedankt: 4 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von drmaxxi » 23.11.2018, 08:04

Hallo,

Danke für das tolle Skript- ist auch ohne besondere Kenntnisse einfach einzurichten. Gibt es eine Möglichkeit die Daten mit dem CCU-Historian zu sichern?

Welche Icons benutzt ihr für die grafische Darstellung der aktuellen Wetterlage?

Mit freundlichen Grüßen

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von Chemieka » 23.11.2018, 09:51

Ich nutze das Skript jetzt auch schon sehr lange und läuft auch super.

Aber was ich doch schon auch sehr gerne hätte insofern machbar.

Niederschlagsmengen und zu erwartende Niederschlagsmengen.


Würde das gern mit in meine Bewässerungsstrategie einfliesen lassen wollen.
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

Antworten

Zurück zu „Projektvorstellungen“