HM-Script für virtuelle Wetterstation

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

DimMyPrp
Beiträge: 8
Registriert: 09.02.2017, 19:54
Wohnort: Bayreuth
Danksagung erhalten: 11 Mal
Kontaktdaten:

HM-Script für virtuelle Wetterstation

Beitrag von DimMyPrp » 16.02.2017, 00:14

Angeregt durch den Thread Energiezähler EM1000 simulieren hatte ich den Wunsch, einen virtuellen Homematic Funk-Kombisensor (via CUxD) zu erstellen und per socat und Pseudo-Terminal mit Online-Wetterdaten zu versorgen.
Mein Ziel war es, einen groben Temperatur-Referenzwert für die Heizung (bzw. Ölverbrauch) zu haben, ohne mir teure Außenthermometer anschaffen zu müssen.
00project.jpg
Zweck des Scripts
Der Thread virtuelles Thermometer brachte mich letztendlich auf eine einfachere Lösung und heraus gekommen ist mein hier vorgestelltes Homematic-Script.

Kurzbeschreibung
Anhand der, in der Homematic hinterlegbaren Positionsangaben oder eines alternativ vorgegeben Ortes ruft das Script Wetterdaten von OpenWeatherMap ab und schreibt die erhaltenen Messwerte, wie Temperatur, Luftfeuchtigkeit, Windgeschwindigkeit, usw. in Systemvariablen.
04var.jpg
Systemvariablen mit von OpenWeatherMaps abgerufene Messdaten
Falls das CUx-Deamon Addon installiert ist, kann das Script optional einige Messwerte in virtuelles Thermostat-Gerät (CUxD Universal Wrapper Device) schreiben.
02dev.jpg
CUxD Universal Wrapper Device mit zusätzlich verknüpften Variablen
Falls das CUx-Deamon Addon installiert ist, kann das Script optional die Messwerte per LOGIT aufzeichnen.
05cuxhighcharts.jpg
Per LOGIT aufgezeichnete Messwerte von OpenWeatherMaps
Script-Ablauf
  1. auslesen der in der Homematic unter Einstellungen > Systemsteuerung > Zeit-/Positionseinstellungen hinterlegbaren Positionsangaben (Längengradund Breitengrad). Alternativ kann auch eine Wetterstation vorgegeben werden.
  2. formen einer URL (z.B. http://api.openweathermap.org/data/2.5/ ... =11.492964) zur Abfrage der Wetterdaten
  3. abrufen der Wetterdaten per system.Exec und wget oder (falls das CUx-Deamon Addon installiert ist) per CUxD Command (28) und wget
  4. Messwerte aus dem erhaltenen XML-Strings parsen
  5. Messwerte in Systemvariablen schreiben (falls die Variablen nicht vorhanden sind, diese vorher noch anlegen)
  6. Messwerte per CUxD LOGIT aufzeichnen (falls das CUx-Deamon Addon installiert ist)
  7. Messwerte in CUxD Universal Wrapper Device (90) schreiben (falls das CUx-Deamon Addon und das Device installiert ist)
Verwendung des Scripts
Das Script ist ready-to-use und kann sofort ohne Installation von Addons oder dem manuellen Anlegen von Variablen, etc. eingesetzt werden. Zum Abruf der Wetterdaten von OpenWeatherMaps muss ein API-Key in das Script eingetragen werden. Dieser kann hier kostenlos erstellt werden. Zu Testzwecken ist im Script bereits ein generischer API-Key hinterlegt. Für den täglichen Betrieb sollte der API-Key jedoch durch einen eigenen ersetzt werden.

Script

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='5e604af848492feb2e7e674c8f2431a7';


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


!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';


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

!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)
{
	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);
	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);
	genTime1 = genString1.ToTime();
	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);
	genTime1 = genString1.ToTime();
	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 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);}
}	
Abschließende Hinweise zum Script
Durch das ready-to-use-Konzept, das "Error-Handling", die Kommentare im Code und die fehlende Möglichkeit von Unterprogrammen bzw. Funktionen in HM-Script und die somit mehrfache Verwendung gleichen Codes im Bereich des XML-Parsers (Zeile 165 bis 524) und dem anlegen von Variablen (Zeile 531 bis 869) ist das Script recht groß geworden. Die Kernfunktionen sind im Bereich Zeile 126 bis 154 zu finden.
Dateianhänge
HM-Script_OpenWeatherMap.txt
HM-Script zum abrufen von Wetterdaten von OpenWeatherMap und schreiben in Systemvariablen und optional einer virtuellen Wetterstation (CUxD Universal Wrapper Device)
(30.45 KiB) 2256-mal heruntergeladen

DimMyPrp
Beiträge: 8
Registriert: 09.02.2017, 19:54
Wohnort: Bayreuth
Danksagung erhalten: 11 Mal
Kontaktdaten:

Einfache Verwendung des Scripts (Messwerte nur in Variablen)

Beitrag von DimMyPrp » 16.02.2017, 00:56

Einfache Verwendung des Scripts (ready-to-use). Keine Anpassungen oder Änderungen nötig
  1. Programm anlegen (z.B. zeitgesteuert, alle 12 Stunden)
    1.png
    Programm anlegen (z.B. zeitgesteuert)
  2. Script einfügen und den API-Key im Script ändern
    02 Script einfügen.jpg
    API-Key ändern nicht vergessen!
  3. optional(*): in der CCU unter EInstellungen Längen- und Breitengrad angeben
    02 GPS.jpg
    Positionsangaben in der CCU vornehmen
  4. optional(*): ...und im Script die owCityid Variable auf false ändern
    Cityidfalse.jpg
    Messstation per Positionsangaben ermitteln (im Script owCityid auf false setzen)
  5. optional(*): oder die Wetterstation-Liste von OpenWeatherMap herunterladen, mit einem Texteditor öffnen und eine nahe Messstation heraussuchen
    Liste.jpg
    Messstation bzw. ID anhand des Städtenamens suchen
  6. optional(*): ...und die ID im Script hinterlegen
    CityID.jpg
    Messstation per ID vorgeben (Messstadtion-ID im Script unter owCityid eingeben)
  7. Die abgerufenen Messwerte bzw. Systemvariablen werden bei jeder Programmausführung erstellt bzw. aktualisiert
    03var.jpg
    Messwerte bzw. Variablen werden bei der nächsten Programmausführung erstellt bzw. aktualisiert
(*) Die optionalen Schritte (3 und 4) bis (5 und 6) können übersprungen werden. Wird hier nichts geändert, werden standardmäßig die Wetterdaten von Berlin abgerufen.
Zuletzt geändert von DimMyPrp am 16.02.2017, 01:55, insgesamt 2-mal geändert.

DimMyPrp
Beiträge: 8
Registriert: 09.02.2017, 19:54
Wohnort: Bayreuth
Danksagung erhalten: 11 Mal
Kontaktdaten:

Verwendung des Scripts für virtuelles Thermostat via CUxD

Beitrag von DimMyPrp » 16.02.2017, 01:26

Erweiterte Verwendung des Scripts mit CUX-Deamon als virtuelles Gerät bzw. Thermostat via Universal Wrapper Device (90).
  1. gleiche Schritte, gemäß Einfache Verwendung des Scripts (Messwerte nur in Variablen) durchführen
  2. in CUxD ein Universal Wrapper Device (90) mit der Funktion Thermostat anlegen
    01 CuxD.jpg
    Universal Wrapper Device (90) anlegen
  3. in der CCU das Device im Geräte-Posteingang "abholen"
  4. in den Einstellungen des Device, die Option WEATHER|USE_HMDATAPT auf inaktiv setzen (nicht anhaken)
    03 CuxD.jpg
    WEATHER|USE_HMDATAPT inaktiv setzen
  5. gegebenenfalls den Namen des Universal Wrapper Device (90) im Script abändern
    04 CuXd.jpg
    Universal Wrapper Device (90) Namen im Script ändern
  6. das Device erhält seine Messwerte nun von OpenWeather bzw. durch das Script
    05 CuxD.jpg
    Virtuelles Thermometer, dass seine Messdaten via Script von OpenWeather bezieht
  7. optional in den, vom Script erzeugten Systemvariablen eine Kanalordnung zum Universal Wrapper Device vornehmen
    kanalzuordnung.jpg
    Kanalzuordnung setzen
  8. ...damit weitere Messwerte in der Geräteansicht des Device angezeigt werden
    02dev.jpg
    Weitere Systemvariablen beim Universal Wrapper Device anzeigen

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 » 16.02.2017, 09:13

:D :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
Na vielen Dank.
Das wird heute Abend gleich getestet.
:D :D :D :D :D :D :D :D :D :D :D :D :D
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

dondaik
Beiträge: 12886
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1584 Mal
Danksagung erhalten: 221 Mal

Re: HM-Script für virtuelle Wetterstation

Beitrag von dondaik » 16.02.2017, 09:31

sauber!!
ich denke da werde ich mal copy&paste anwenden müssen und solch eine wetterstation anlegen. kleine einschränkung: der luftdruck ist bei OW nicht auf NN bezogen wie in den meisten / anderen wetterdiensten.

thanks.
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

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 » 16.02.2017, 13:09

Eine Frage hätte ich noch. Warum nur aller 12h neue Daten? Ich würde ja wenigstens stündlich oder aller 30 Minuten machen.
Je nachdem wie oft die Daten auf der Homepage aktualisiert werden.
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

DimMyPrp
Beiträge: 8
Registriert: 09.02.2017, 19:54
Wohnort: Bayreuth
Danksagung erhalten: 11 Mal
Kontaktdaten:

Re: HM-Script für virtuelle Wetterstation

Beitrag von DimMyPrp » 16.02.2017, 13:45

Chemieka hat geschrieben:Warum nur aller 12h neue Daten? Ich würde ja wenigstens stündlich ... machen.
Die 12 Stunden waren nur so als Beispiel. Man könnte das Script ja auch per Bedingung, Wenn, Sonst nur bei bestimmten Ereignissen laufen lassen.
Öfter als einmal pro Stunde würde ich das Script aber nicht laufen zu lassen, weil OpenWeather seine Wetterdaten nur im Stundenrhytmus zu aktualisieren scheint. Öfter abfragen bringt also nichts.

gspit
Beiträge: 10
Registriert: 19.02.2017, 16:02

Re: HM-Script für virtuelle Wetterstation

Beitrag von gspit » 19.02.2017, 16:13

Hallo,

da ich absoluter Neuling in dem Homematic Thema und im speziellen zum Thema Scripte bin habe ich eine für die Profis vielleicht dumme Frage.
Ich wollte das mit der virtuellen Wetterstation ein mal ausprobieren.
Also habe ich ein Programm (zeitgesteuert) erstellt und darin wie in der Beschreibung angegeben das Script eingefügt.
Wenn ich den Text richtig verstanden habe soll das ganze doch dann schon funktionieren, auch wenn ich noch keinen eigenen API-Key von OpenWeather eingegeben habe.
Das dumme ist nur bei mir passiert nichts, auch wenn ich das Programm von Hand starte.
Wenn ich auf der Script bearbeiten Seite auf Fehlerprüfung klicke bekomme ich folgende Meldung:
Error 1 at row 136 col 19 near ^#'&APPID='#owAppid#owLocation;
Kann mir jemand sagen was da falsch ist bzw. was ich falsch mache.

DimMyPrp
Beiträge: 8
Registriert: 09.02.2017, 19:54
Wohnort: Bayreuth
Danksagung erhalten: 11 Mal
Kontaktdaten:

Re: HM-Script für virtuelle Wetterstation

Beitrag von DimMyPrp » 19.02.2017, 18:34

gspit hat geschrieben:Error 1 at row 136 col 19 near ^#'&APPID='#owAppid#owLocation;
So aus dem Bauch raus, würde ich mal tippen, dass Du die Zeile

Code: Alles auswählen

string owAppid='5e604af848492feb2e7e674c8f2431a7';
entfernt hast? Auch wen Du zum testen (noch) keinen eigenen API-Key von OpenWeather eingeben willst, musst Du die Zeile im Script drin lassen. Wenn Du dann später einen eigenen API-Key verwendest, musst Du nur den Teil zwischen den beiden Anführungszeichen ' austauschen - also das 5e604af848492feb2e7e674c8f2431a7 durch deinen eigenen Key ersetzen.

gspit
Beiträge: 10
Registriert: 19.02.2017, 16:02

Re: HM-Script für virtuelle Wetterstation

Beitrag von gspit » 19.02.2017, 20:54

Ich habe nichts entfernt.
Hab das ganze Script kpl. Kopiert und eingefügt und trotzdem kommt diese Meldung.

Antworten

Zurück zu „Projektvorstellungen“