HM-Script für virtuelle Wetterstation
Moderator: Co-Administratoren
-
- Beiträge: 10194
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 733 Mal
- Danksagung erhalten: 1754 Mal
Re: HM-Script für virtuelle Wetterstation
Ich glaube der TO ist hier nicht mehr aktiv. Und wegen solcher Flüchtigkeitsfehler ist das auch so ein Mega-Thread geworden, weil immer irgendwas hackt.
Aber es gibt ja funktionierende Alternativen (siehe Signatur )
Aber es gibt ja funktionierende Alternativen (siehe Signatur )
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
-
- Beiträge: 7
- Registriert: 15.03.2021, 03:44
- System: CCU und Access Point
- Wohnort: Lebach
- Hat sich bedankt: 1 Mal
Re: HM-Script für virtuelle Wetterstation
Hallo zusammen,
kann mir jemand den Zusammenhang erklären warum man in Cux den CUxD Gerätetyp: (28) Sytem Funktion Exec genau braucht; braucht man hierbei die 19 Taster Funktionen?
Warum kann man nicht den Wetter Kombisensor CUxD Gerätetyp: (90) Universal Wrapper Divice nutzen ???
Wie sind hier genau die Zusammenhänge in Bezug auf das Script von Seite 35 ???
Das Script läuft und das Standardprogramm von Seite 1 wird genutzt.
Soweit läuft alles auch; nur warum brauche ich noch ein CUxD Gerätetyp: (28) Sytem ???
Wie kann man die Tagestemperatur loggen und grafisch anzeigen lassen ?
Sorry, bin noch ein Greenhorn in Raspberrymatic.
Danke mal allen für Ihre Mühe bisher zu diesem Thema.
Greetz
Joachim
--= kaum macht man's richtig, läuft es =--
-
- Beiträge: 26
- Registriert: 27.09.2015, 01:59
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
Re: HM-Script für virtuelle Wetterstation
Danke @Baxxy für die Arbeit. Super Sache.Baxxy hat geschrieben: ↑09.05.2020, 10:59Danke für die Aufklärung. Hatte mich bloß gewundert das es im "Script testen" direkt auf der CCU gut 20-30s braucht (wie Alchy auch schrieb) und im SDV sind es tatsächlich nur ~0,7s.
Ich habe mal, die aus meiner Sicht unwichtigen, SV's (OpenWeatherMap Letzte Aktualisierung, OpenWeatherMap Wetterstation, OpenWeatherMap Sonnenaufgang, OpenWeatherMap Sonnenuntergang) aus dem Script entfernt. Desweiteren wird die SV OpenWeatherMap Windgeschwindigkeit jetzt in km/h angelegt und ausgegeben.Vielleicht kann das wer gebrauchen.Code: Alles auswählen
!OpenWeather-CCU-Script, edited by regedit V1.2, 2019-08-31 !Stripped Version by Baxxy !Verwendetes Original: DimMyPrp V1, 2017-02-15, edited by Schalterrei, 2018-07-25 !https://homematic-forum.de/forum/viewtopic.php?f=18&t=35702&start=190#p580737 !Edited by Alchy 05-05-2020 !Edited by Baxxy 09-05-2020 SV's OpenWeatherMap Letzte Aktualisierung, OpenWeatherMap Wetterstation, OpenWeatherMap Sonnenaufgang, OpenWeatherMap Sonnenuntergang entfernt; Windgeschwindigkeit in km/h !Edited by Baxxy 09-07-2020 Timeout von 10s beim wget-Zugriff über system.Exec hinzugefügt !Hier EIGENE OpenWeatherAppID eintragen string owAppid='1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9'; !Optionale Experteneinstellungen: Angabe der Stadt (über https://openweathermap.org/city/) anstatt Geocoords (=false) string owCityid=false; !Optionale Experteneinstellungen: wget-Command per CUxD oder system.Exec (cuxCMDName='CUxD.<Seriennummer>:1'/false) sowie CUxD logging (true/false) string cuxCMDName=false; boolean useLOGIT=false; !Optionale Experteneinstellungen: OpenWeather-Daten in CUxD Thermostat-Device schreiben (cuxWDSName='CUxD.<Seriennummer>:1'/false) !Achtung: Gerät=("Universal Wrapper Device" (90) als "Thermostat" / Option "WEATHER|USE_HMDATAPT" muss auf false) string cuxWDSName=false; !Systemvariablenbenennung string svTemperatur='OWM Temperatur'; string svMinimalTemperatur='OWM Temperatur (min.)'; string svMaximalTemperatur='OWM Temperatur (max.)'; string svLuftfeuchtigkeit='OWM Luftfeuchte (rel.)'; string svLuftdruck='OWM Luftdruck'; string svWindGeschwindigkeit='OWM Windgeschwindigkeit'; string svWindRichtung='OWM Windrichtung'; string svWindRichtungInt='OWM Windrichtung (Int)'; string svWetter='OWM Wetterlage'; string svNiederschlag='OWM Niederschlag Stunde'; string svNiederschlagsart='OWM Niederschlagsart'; string svWolken='OWM Bewölkung'; !************************************************************ !************************************************************ !BEGIN DES SCRIPTS !************************************************************ !************************************************************ !Variablendeklaration !*********************** !OpenWeather-Url mit Defaultwerte string owLocation='&id=INSERT'; string owUrl='http://api.openweathermap.org/data/2.5/weather?mode=xml&units=metric'; !CUxD/Exec und Rückgabe-Variablen (Programmablauf) mit Defaultwerte boolean cuxCMD=false; boolean cuxWDS=false;string recXML; !XML-Parser (Tagnamen) string xmlStartTagName_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_Wetter;string xmlEndTagName_Wetter; string xmlStartTagName_Niederschlag;string xmlEndTagName_Niederschlag; string xmlStartTagName_Wolken;string xmlEndTagName_Wolken; !XML-Parser (Programmablauf) integer xmlStartTagLenght; integer xmlTagStart;integer xmlTagLength; integer xmlAttributeStart;integer xmlAttributeLength; string xmlTagContent; string xmlAttributeValue; !Zurückgemeldete und aus der XML extrahierte Werte von OpenWeather real owTemperatur;real owMinimalTemperatur;real owMaximalTemperatur; real owLuftfeuchtigkeit; real owLuftdruck; real owWindGeschwindigkeit;real owGradzahl;string owWindRichtung; string owWetter; real owNiederschlag;string owNiederschlagsart; integer owWolken; !Objekte für Systemvariablen (Programmablauf) object svObject; object svObjectlist; !Generische Variablen (Mehrfachverwendung) string genString1;string genString2;string genString3; integer genInteger1;integer genInteger2; !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 --timeout=10 -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_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_Wetter = 'weather '; xmlEndTagName_Wetter = ' /weather'; xmlStartTagName_Niederschlag = 'precipitation '; xmlEndTagName_Niederschlag = ' /precipitation'; xmlStartTagName_Wolken = 'clouds '; xmlEndTagName_Wolken = ' /clouds'; } else { !Suchstrings für XML-Tags von Exec festlegen xmlStartTagName_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_Wetter = '<weather '; xmlEndTagName_Wetter = '>'; xmlStartTagName_Niederschlag = '<precipitation '; xmlEndTagName_Niederschlag = '>'; xmlStartTagName_Wolken = '<clouds '; xmlEndTagName_Wolken = '>'; } !Geholten XML-String parsen !****************************** !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)||(svWindRichtungInt)) { xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent=''; xmlStartTagLenght = xmlStartTagName_Wind.Length(); xmlTagStart = recXML.Find(xmlStartTagName_Wind); if (xmlTagStart>=0) { xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght); xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wind); if(xmlTagLength>0) { xmlTagContent = xmlTagContent.Substr(0,xmlTagLength); !Sub-Parser Windrichtng xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0; xmlStartTagLenght = xmlStartTagName_Windrichtung.Length(); xmlTagStart = xmlTagContent.Find(xmlStartTagName_Windrichtung); if (xmlTagStart>=0) { xmlTagContent = xmlTagContent.Substr(xmlTagStart+xmlStartTagLenght); xmlTagLength = xmlTagContent.Find(xmlEndTagName_Windrichtung); if(xmlTagLength>0) { xmlTagContent = xmlTagContent.Substr(0,xmlTagLength); !Gradzahl-Attribut auslesen xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('value="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owGradzahl = xmlAttributeValue.ToInteger(); } !Himmelsrichtung-Attribut auslesen xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('code="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owWindRichtung = xmlAttributeValue.ToString(); } } else { !QuickAndDirty fallback if no data owGradzahl=-1; } } } } } !Parser für svWetter if(svWetter) { xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent=''; xmlStartTagLenght = xmlStartTagName_Wetter.Length(); xmlTagStart = recXML.Find(xmlStartTagName_Wetter); if (xmlTagStart>=0) { xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght); xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wetter); if(xmlTagLength>0) { xmlTagContent = xmlTagContent.Substr(0,xmlTagLength); !Luftfeuchtigkeits-Attribut auslesen xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('value="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owWetter = xmlAttributeValue.ToString(); } } } } !Parser für owNiederschlag, owNiederschlagTyp -new if((svNiederschlag)||(svNiederschlagsart)) { xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent=''; xmlStartTagLenght = xmlStartTagName_Niederschlag.Length(); xmlTagStart = recXML.Find(xmlStartTagName_Niederschlag); if (xmlTagStart>=0) { xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght); xmlTagLength = xmlTagContent.Find(xmlEndTagName_Niederschlag); if(xmlTagLength>0) { xmlTagContent = xmlTagContent.Substr(0,xmlTagLength); !Niederschlagsart auslesen xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('mode="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+6); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owNiederschlagsart = xmlAttributeValue.ToString(); } !Niederschlag auslesen if(owNiederschlagsart=='no') { owNiederschlag = 0; } else { xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('value="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owNiederschlag = xmlAttributeValue.ToFloat(); } } } } } !Parser für owWolken -new if(svWolken) { xmlStartTagLenght=0;xmlTagStart=0;xmlTagLength=0;xmlTagContent=''; xmlStartTagLenght = xmlStartTagName_Wolken.Length(); xmlTagStart = recXML.Find(xmlStartTagName_Wolken); if (xmlTagStart>=0) { xmlTagContent = recXML.Substr(xmlTagStart+xmlStartTagLenght); xmlTagLength = xmlTagContent.Find(xmlEndTagName_Wolken); if(xmlTagLength>0) { xmlTagContent = xmlTagContent.Substr(0,xmlTagLength); !Wolken auslesen xmlAttributeStart=0;xmlAttributeLength=0;xmlAttributeValue=''; xmlAttributeStart=xmlTagContent.Find('value="'); if (xmlAttributeStart>=0) { xmlAttributeValue = xmlTagContent.Substr(xmlAttributeStart+7); xmlAttributeLength = xmlAttributeValue.Find('"'); xmlAttributeValue = xmlAttributeValue.Substr(0,xmlAttributeLength); owWolken = xmlAttributeValue.ToInteger(); } } } } !Ermittelte Werte in Systemvariable schreiben !************************************************** !Wenn (noch) keine Systemvariable(n) vorhanden, diese anlegen. !Code zum anlegen von Variablen abgeleitet von Esche's IT-Blog https://www.blogging-it.com/code-snippet-homematic-systemvariablen-ueber-ein-script-automatisch-erzeugen/programmierung/homematic-script.html !Schreiben von 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(200.0000); svObject.State(owWindGeschwindigkeit); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); } 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(0); } 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(0); } 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(0); } 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(0); } 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(0); } else { svObject.State(owLuftfeuchtigkeit); } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svLuftfeuchtigkeit#';'#owLuftfeuchtigkeit);} if(cuxWDS){dom.GetObject(cuxWDSName#'.SET_HUMIDITY').State(owLuftfeuchtigkeit);} } !Schreiben von svWindrichtung if(svWindRichtung) { !Englische Windrichtungsangaben übersetzen (z.B. N-W-E in Nord-West-Ost) genString1='';genString2='';genString3='';genInteger1=0; genString1 = owWindRichtung; foreach(genInteger1,genString1.Length()) { genString2=genString1.Substr(genInteger1-1,1); if(genString2=='E'){genString3=genString3#'Ost-';} if(genString2=='S'){genString3=genString3#'Süd-';} if(genString2=='W'){genString3=genString3#'West-';} if(genString2=='N'){genString3=genString3#'Nord-';} } genString1=genString3.Substr(0,genString3.Length()-1); if (owGradzahl>=0){genString2=owGradzahl.ToString()#'° '#genString1;} svObject = dom.GetObject(svWindRichtung); if (!svObject) { svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectlist.Add(svObject.ID()); svObject.Name(svWindRichtung); svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.DPInfo('OpenWeatherMap - Windrichtung'); svObject.ValueUnit(''); svObject.State(genString2); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); } 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(0); } else { !if(dom.GetObject("Tageszeit").Value()==0) if ((((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())>((0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger())) || (((0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger())<((0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger()))) { svObject.State(genString2#' '); } else { svObject.State(genString2); } } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWetter#';'#genString2);} } !Schreiben von svNiederschlag if(svNiederschlag) { svObject = dom.GetObject(svNiederschlag); if (!svObject){ svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectlist.Add(svObject.ID()); svObject.Name(svNiederschlag); svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.DPInfo("OpenWeatherMap - Niederschlagsmenge"); svObject.ValueUnit("mm/h"); svObject.ValueMin(0.0); svObject.ValueMax(100.0); svObject.State(owNiederschlag); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); } else { svObject.State(owNiederschlag); } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlag#';'#owNiederschlag);} } !Schreiben von svNiederschlagsart if(svNiederschlagsart) { if (owNiederschlagsart=='rain'){owNiederschlagsart=1;} if (owNiederschlagsart=='snow'){owNiederschlagsart=2;} if (owNiederschlagsart=='no'){owNiederschlagsart=0;} svObject = dom.GetObject(svNiederschlagsart); if (!svObject){ svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectlist.Add(svObject.ID()); svObject.Name(svNiederschlagsart); svObject.ValueType(ivtInteger); svObject.ValueSubType(istEnum); svObject.ValueList("kein Niederschlag;Regen;Schnee"); svObject.DPInfo("OpenWeatherMap - Niederschlagsart"); svObject.ValueUnit(""); svObject.State(owNiederschlagsart); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); } else { svObject.State(owNiederschlagsart); } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svNiederschlagsart#';'#owNiederschlagsart);} } !Schreiben von svWolken if(svWolken) { svObject = dom.GetObject(svWolken); if (!svObject){ svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectlist.Add(svObject.ID()); svObject.Name(svWolken); svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.DPInfo("OpenWeatherMap - Bewölkung"); svObject.ValueUnit("%"); svObject.ValueMin(0); svObject.ValueMax(100); svObject.State(owWolken); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); } else { svObject.State(owWolken); } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWolken#';'#owWolken);} } !Schreiben von svWindrichtung if((svWindRichtungInt)&&(owGradzahl>=0)) { svObject = dom.GetObject(svWindRichtungInt); if (!svObject) { svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectlist.Add(svObject.ID()); svObject.Name(svWindRichtungInt); svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.DPInfo("OpenWeatherMap - Windrichtung Integer"); svObject.ValueUnit("°"); svObject.ValueMin(0); svObject.ValueMax(360); svObject.State(owGradzahl); svObject.Internal(false); svObject.Visible(true); dom.RTUpdate(0); WriteLine("Variable erzeugen und schreiben! Windrichtung: "#owGradzahl #" in: " #svObject.Name()); } else { svObject.State(owGradzahl); WriteLine("Variable nicht erzeugen nur schreiben! Windrichtung: "#owGradzahl #" in: " #svObject.Name()); } if((cuxCMD)&&(useLOGIT)){dom.GetObject(cuxCMDName#'.LOGIT').State(svWindRichtungInt#';'#owGradzahl);} } WriteLine("Script ganz durch");
Grüße
Baxxy
Edit 27.05.20: SV Niederschlagsart sollte nun auch ordnungsgemäß erzeugt werden. Thx @mskrause
Edit 09.07.20: Bei Benutzung von system.Exec wird ein Timeout von 10s gesetzt, um bei Problemen das System nicht länger zu blockieren
Kann mir jemand erklären warum mir das CUxD 90 Gerät (als Thermostat) angelegt nur so wenige Daten anzeigt. Hätte gerne alle Daten in das Gerät geschrieben, welche das Script erarbeitet.
Besten Dank im Voraus.
- Baxxy
- Beiträge: 11680
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 688 Mal
- Danksagung erhalten: 2483 Mal
Re: HM-Script für virtuelle Wetterstation
Das Gerät selbst kann nur mit Temperatur und Feuchte beschrieben werden.gamehunter hat geschrieben: ↑17.11.2023, 12:10warum mir das CUxD 90 Gerät (als Thermostat) angelegt nur so wenige Daten anzeigt.
Taupunkt und abs.Feuchte errechnet es selbst.
Alle anderen Daten landen in Systemvariablen deren Name im Abschnitt "!Systemvariablenbenennung" steht/gesetzt wird.
Diese musst du dem Kanal der CUxD-Wetterstation (> Einstellungen > Systemvariablen > Bearbeiten) zuordnen.
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen
-
- Beiträge: 26
- Registriert: 27.09.2015, 01:59
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
Re: HM-Script für virtuelle Wetterstation
Hey Baxxy,
da hätte ich auch selbst drauf kommen können.
Danke
da hätte ich auch selbst drauf kommen können.
Danke
Re: HM-Script für virtuelle Wetterstation
Hallo zusammen,
ich hatte mich immer gewundert, dass die Wingeschwindigkeit überhaupt nicht passte.
Meine Erwartung war in km/h, die von OW ist aber in m/s.
Irgendwie tue ich mich mit dieser Scriptsprache sehr schwer.
Welche Variable muss ich mit 3.6 multiplizieren um eine Angabe in km/h zu bekommen?
Danke
ItsMe57
ich hatte mich immer gewundert, dass die Wingeschwindigkeit überhaupt nicht passte.
Meine Erwartung war in km/h, die von OW ist aber in m/s.
Irgendwie tue ich mich mit dieser Scriptsprache sehr schwer.
Welche Variable muss ich mit 3.6 multiplizieren um eine Angabe in km/h zu bekommen?
Danke
ItsMe57
------------------------------------------------------------------------------------------------
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
Re: HM-Script für virtuelle Wetterstation
Erledigt.
------------------------------------------------------------------------------------------------
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
- Baxxy
- Beiträge: 11680
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 688 Mal
- Danksagung erhalten: 2483 Mal
Re: HM-Script für virtuelle Wetterstation
Sehr gut...
Ein Hinweis für zukünftige Leser (die eventuell vor dem selben Problem stehen) war wohl nicht drin.
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen
Re: HM-Script für virtuelle Wetterstation
Aehm, sorry ...
Die Lösung habe ich in diesem Thread gefunden.
Ich hatte ein älteres Script im Einsatz.
Die Lösung habe ich in diesem Thread gefunden.
Ich hatte ein älteres Script im Einsatz.
------------------------------------------------------------------------------------------------
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
CCU2
------------------------------------------------------------------------------------------------
9x HM-CC-RT-DN
1x HM-LC-Sw1-Pl-2
2x HM-Sec-SC
2x HM-Sec-SC-2
1x HM-LC-Bl1-FM
-
- Beiträge: 667
- Registriert: 03.01.2017, 17:39
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 12 Mal
Re: HM-Script für virtuelle Wetterstation
Hallo
Ich hätte auch eine Bitte zu diesem Skript.
Wenn man die Abfrage startet wird unter anderem auch ein Icon Wert zurückgegeben aber nicht in eine Variable gespeichert.
Genau diesen Wert icon="04d" bräuchte ich allerdings. Könnte mich da jemand unterstützen wie das Skript von Seite 1 angepasst werden müsste?
Herzlichen Dank.
Ich hätte auch eine Bitte zu diesem Skript.
Wenn man die Abfrage startet wird unter anderem auch ein Icon Wert zurückgegeben aber nicht in eine Variable gespeichert.
Code: Alles auswählen
<current>
<city id="2803588" name="Zwenkau">
<coord lon="12.3167" lat="51.2167"/>
<country>DE</country>
<timezone>7200</timezone>
<sun rise="2024-05-19T03:14:11" set="2024-05-19T19:00:31"/>
</city>
<temperature value="19.09" min="17.01" max="21.52" unit="celsius"/>
<feels_like value="18.8" unit="celsius"/>
<humidity value="67" unit="%"/>
<pressure value="1010" unit="hPa"/>
<wind>
<speed value="1.79" unit="m/s" name="Light breeze"/>
<gusts value="3.58"/>
<direction value="178" code="S" name="South"/>
</wind>
<clouds value="100" name="overcast clouds"/>
<visibility value="7333"/>
<precipitation mode="no"/>
<weather number="804" value="overcast clouds" icon="04d"/>
<lastupdate value="2024-05-19T11:32:05"/>
</current>
Herzlichen Dank.
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