HM-Script für virtuelle Wetterstation

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Chombo01
Beiträge: 3
Registriert: 03.01.2017, 16:22

Re: HM-Script für virtuelle Wetterstation

Beitrag von Chombo01 » 14.03.2017, 10:39

Bei mir läuft das Skript nur wenn ich das Programm von hand starte. Ich hab mal im syslog geschaut und diese Fehlermeldung gefunden:

Code: Alles auswählen

Mar 14 08:00:01 homematic-ccu2 cron.info crond[94]: crond: USER root pid 9285 cmd /usr/local/addons/hm-watchdog/bin/hm-watchdog.sh 2>&1 >/dev/null
Stündlich wiederkehrend.
Könnte​ es daran liegen?


Gesendet von meinem PLK-L01 mit Tapatalk
Zuletzt geändert von alchy am 14.03.2017, 10:44, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

alchy
Beiträge: 7720
Registriert: 24.02.2011, 01:34

Re: HM-Script für virtuelle Wetterstation

Beitrag von alchy » 14.03.2017, 10:44

nein

Alchy

.................... Full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

TomFD
Beiträge: 3
Registriert: 16.11.2016, 09:55

Re: HM-Script für virtuelle Wetterstation

Beitrag von TomFD » 20.03.2017, 15:41

Gibt vielleicht eine Möglichkeit die virtuelle Wetterstation in PocketControlHM so anzeigen zu lassen wie im Screenshot zu sehen?
Bei mir wird leider nur die Temperatur angezeigt.

Tom
Dateianhänge
HM.jpg

Thorsten14
Beiträge: 1
Registriert: 10.03.2017, 16:29

Re: HM-Script für virtuelle Wetterstation

Beitrag von Thorsten14 » 23.03.2017, 08:46

Hallo zusammen,

das würde mich auch interessieren. Wie bekomme ich die Daten Windrichtung, Wetterbedingung(Wolkensymbol) und Windbedingung in PocketControlHM dargestellt, wenn ich "nur" eine virtuelle Wetterstation per CUxD eingerichtet habe?

Gruß
Thorsten

MartinBr
Beiträge: 160
Registriert: 25.01.2017, 10:51
Wohnort: Bei Berlin

Re: HM-Script für virtuelle Wetterstation

Beitrag von MartinBr » 25.03.2017, 08:42

Hallo,
sehr interessante Lösung. Meines Erachtens fehlt zu einer Wetterstation die Regenmessung. Lässt sich das nachliefern? Liefert Open Weather auch Niederschlagsmengen?
Gruß MartinBr
RaspberryMatic 3.41.11.20181124 auf TinderBoard S, CUxD 2.10, XML-1.19, ioBroker unter Debian 9, Alexa mit ioBroker, VitoComfort 200

Kleini
Beiträge: 3
Registriert: 12.05.2017, 09:02

HM Wetter Wind und Luftfeuchte

Beitrag von Kleini » 12.05.2017, 09:09

Hallo,
funktioniert super gut. Ich möchte aber die Windrichtung, Geschwindigkeit und Luftfeuchte gerne in der Pcket Control HM anzeigen lassen.
Hat einer eine Idee. Die Daten liegen momentan nur als Systemvariable vor.

Mike42
Beiträge: 35
Registriert: 31.12.2013, 13:48
Wohnort: Lauf an der Pegnitz

Re: HM-Script für virtuelle Wetterstation

Beitrag von Mike42 » 20.05.2017, 10:36

Hi,

inspiriert von dimmyprp's OpenWeather-CCU-Script habe ich mich mit den Forecast-Daten von OpenWeatherMaps auseinander gesetzt, da mich die Vorhersage der Temperaturen für die nächsten Tage interessiert hat.
Für die nächsten 3 Tage sollen die Min-, Max- und Durchschnittswerte der Temperatur ermittelt werden.

Dabei herausgekommen ist folgendes Skript:

Code: Alles auswählen

! Temperaturvorhersage (min, max, Durchschnitt) 3 Tage über OpenWeatherMap, Mike42, 20.05.2017
! Abfrage der Daten über CUxD
! Das Skript sollte höchstens alle 3 Stunden laufen, da OpenWeathermaps den Forecast in 3 Stunden Intervalle aufteilt
! verwendet Skript-Fragmente von OpenWeather-CCU-Script, Version 1, 15.02.2017, von dimmyprp

! ******************************************************************************************
! Deklarationen und Initialisierungen
! in "func" bitte unter "&id=" die Ortskennung und unter "&APPID=" den API-Schlüssel eintragen
! CUxD "System-Devices" (28) muss installiert sein
! in "CUXD_Device bitte die Kennung des Gerätes eintragen

string func = "wget -q -O - 'http://api.openweathermap.org/data/2.5/forecast?mode=xml&units=metric&id=xxxxxxx&APPID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'";
string CUXD_Device = "CUxD.CUX2801001:1";

! Suchstrings und Offset-Werte zum extrahieren der Temperaturwerte
string xmlTimeStart               = "time from=";
string xmlTimeEnd                 = " to=";
integer xmlTimeStartOffset        = 11;
integer xmlTimeEndOffset          = 21;
string xmlTemperatureStart        = "temperature unit=";
string xmlTemperatureEnd          = "min=";
integer xmlTemperatureStartOffset = 34;
integer xmlTemperatureEndOffset   = 36;
integer xmlSkip                   = 100;

! XML-Antwort von OpenWeatherMaps
string recXML;

! Arbeitsvariablen
string wert1;
string wert2;
time zeit;

! Datumswerte
string Day0;
string Day1;
string Day2;
string Day3;

! Diese Variablen enthalten am Schluss die Ergebnisse
real Day1_avg=0.0;     ! Durchschnittswert für morgen
real Day1_min=100.0;   ! Min-Wert für morgen
real Day1_max=-100.0;  ! Max-Wert für morgen
real Day2_avg=0.0;
real Day2_min=100.0;
real Day2_max=-100.0;
real Day3_avg=0.0;
real Day3_min=100.0;
real Day3_max=-100.0;


! ENDE Deklarationen und Initialisierungen
! ******************************************************************************************

! Datum als String für die nächsten 3 Tage zum suchen 
Day0 = system.Date("%F");     !Day0 = heute, wird im Skript nicht ausgewertet
zeit = Day0.ToTime()+24*3600;
Day1= zeit.Format("%F");      !Day1 = Datumsstring für morgen
zeit = zeit+24*3600;
Day2= zeit.Format("%F");      !Day2 = Datumsstring für übermorgen
zeit = zeit+24*3600;
Day3= zeit.Format("%F");      !Day3 = Datumsstring für überübermorgen :o)

! Abruf der Daten
dom.GetObject(CUXD_Device#".CMD_SETS").State(func);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
recXML = dom.GetObject(CUXD_Device#".CMD_RETS").State();
if(!recXML){quit;}

! Temperaturwerte ausfiltern
while (recXML.Find(xmlTemperatureStart)>=0){
  wert1 =  recXML.Substr(recXML.Find(xmlTimeStart)+xmlTimeStartOffset, recXML.Find(xmlTimeEnd)-recXML.Find(xmlTimeStart)+xmlTimeEndOffset);
  wert2 =  recXML.Substr(recXML.Find(xmlTemperatureStart)+xmlTemperatureStartOffset,recXML.Find(xmlTemperatureEnd)-recXML.Find

(xmlTemperatureStart)+xmlTemperatureEndOffset);
  if (wert1==Day1) {
    Day1_avg = Day1_avg + wert2.ToFloat();
    if (Day1_min>wert2.ToFloat()) {Day1_min=wert2.ToFloat();}
    if (Day1_max<wert2.ToFloat()) {Day1_max=wert2.ToFloat();}
  }
  if (wert1==Day2) {
    Day2_avg = Day2_avg + wert2.ToFloat();
    if (Day2_min>wert2.ToFloat()) {Day2_min=wert2.ToFloat();}
    if (Day2_max<wert2.ToFloat()) {Day2_max=wert2.ToFloat();}
  }
  if (wert1==Day3) {
    Day3_avg = Day3_avg + wert2.ToFloat();
    if (Day3_min>wert2.ToFloat()) {Day3_min=wert2.ToFloat();}
    if (Day3_max<wert2.ToFloat()) {Day3_max=wert2.ToFloat();}
  }
  recXML=recXML.Substr(recXML.Find(xmlTemperatureStart)+xmlSkip,recXML.Length());
}

! Durchschnitt errechnen
Day1_avg=Day1_avg/8;
Day2_avg=Day2_avg/8;
Day3_avg=Day3_avg/8;


! Hier nur als Beispiel die Ausgabe der Ergebniswerte
! Die Werte von Interesse kann man nun in eine Systemvariable schreiben
WriteLine(Day1#": min "#Day1_min.ToString(2)#" / max "#Day1_max.ToString(2)#" / avg "#Day1_avg.ToString(2));
WriteLine(Day2#": min "#Day2_min.ToString(2)#" / max "#Day2_max.ToString(2)#" / avg "#Day2_avg.ToString(2));
WriteLine(Day3#": min "#Day3_min.ToString(2)#" / max "#Day3_max.ToString(2)#" / avg "#Day3_avg.ToString(2));

! ******************************************************************************************
Man muss nur die Orts-ID und den API-Schlüssel von OpenWeatherMaps eintragen und die CUxD-Kennung des System-Exec-Geräts ggf. anpassen.
Wenn man das Skript testet, dann werden die Ergebnisse angezeigt.
Die Ergebnisvariablen kann man dann in Systemvariablen schreiben - der Teil ist nicht im Skript enthalten, sollte aber einfach zu ergänzen sein.

Grüße

Mika

Kurzschlusselektriker
Beiträge: 68
Registriert: 22.09.2014, 15:58

Re: HM-Script für virtuelle Wetterstation

Beitrag von Kurzschlusselektriker » 29.05.2017, 12:33

Hallo Mike42,

vielen Dank Dir und den anderen Teilnehmern die sich an das Thema virtuelle Wetterstation gemacht haben.
Das passt perfekt in mein grade laufendes Projekt, ich habe zu dem Forecast-Script noch zwei Fragen:

Wenn ich das richtig gesehen habe, müsste ich meine variablen in der CCU mit dem Namen "Day1_avg", etc. anlegen? Leider werden diese nicht befüllt. Hat jemand eine Idee wo ich wie nachschauen kann was da los ist? Das "Live-Daten-Script" von Seite 1 klappt 1a.

Wenn ich den Forcast für den aktuellen Tag auch haben wöllte, müsste ich im Script die Variablen um Day0 ergänzen, oder?

Ich würde gerne, jetzt wo es wieder so heiß ist, die Wettervorhersage nutzen, um unsere Rollos an der Sonnenseite proaktiv herunterfahren wenn eine bestimmte Temperatur für den tag erwartet wird damit sich die Aufheizung des Hauses im Rahmen hält...

Vielen Dank schon mal
Kurzschlusselektriker

Mike42
Beiträge: 35
Registriert: 31.12.2013, 13:48
Wohnort: Lauf an der Pegnitz

Re: HM-Script für virtuelle Wetterstation

Beitrag von Mike42 » 30.05.2017, 10:50

Hi,
Wenn ich das richtig gesehen habe, müsste ich meine variablen in der CCU mit dem Namen "Day1_avg", etc. anlegen? Leider werden diese nicht befüllt.
Du kannst eine beliebige Systemvariable im Skript heranziehen:
--> so deklarieren: var SysVar_Temp = dom.GetObject("AussenTemp_Forecast"); (oder wie auch immer die du in deinem System nennen willst)
--> so befüllen: SysVar_Temp.State(wert);
Ich würde gerne, jetzt wo es wieder so heiß ist, die Wettervorhersage nutzen, um unsere Rollos an der Sonnenseite proaktiv herunterfahren wenn eine bestimmte Temperatur für den tag erwartet
Welchen Wert willst du dann als Auslöser nehmen? Das Maximum des aktuellen Tages? Oder vielleicht die Temperatur, die in 3 Stunden erwartet wird?

Ich habe das Skript kurz umgestrickt - nun wirft es die erwartete Temperatur in 3 Stunden aus. Mit dem Parameter "TimeAdder" kann man einstellen, ob ein "angebrochenes" 3-Stunden Segment angezeigt werden soll oder erst das nächste ganze.
Beispiel: aktuelle Uhrzeit 10.05, somit liegt diese Zeit im 3h-Segment 09.00-12.00
TimeAdder = 0 --> das nächste Segment ab 12.00 wird ausgewertet
TimeAdder = 5400 --> das 09.00 Segment wird ausgewertet solange es nicht später als 10.30 ist (5400 Sekunden = 1,5 Stunden)
TimeAdder = 10800 --> das 09.00 Segment wird ausgewertet, solange es noch nicht 12.00 ist

Code: Alles auswählen

! Temperaturvorhersage 3 Stunden über OpenWeatherMap, Mika, 30.05.2017
! Abfrage der Daten über CUXD
! Das Skript sollte höchstens alle 3 Stunden laufen, da OpenWeathermaps den Forecast in 3 Stunden Intervalle aufteilt
! verwendet Skript-Fragmente von OpenWeather-CCU-Script, Version 1, 15.02.2017, von dimmyprp

! ******************************************************************************************
! Deklarationen und Initialisierungen
! in "func" bitte unter "&id=" die Ortskennung und unter "&APPID=" den API-Schlüssel eintragen
! CUxD "System-Devices" (28) muss installiert sein
! in "CUXD_Device bitte die Kennung des Gerätes eintragen

! hier Systemvariable deklarieren (Typ Zahl)
! var SysVar_Temp = dom.GetObject("AussenTemp_Forecast"); ! oder einen eigenen Namen verwenden


string func = "wget -q -O - 'http://api.openweathermap.org/data/2.5/forecast?mode=xml&units=metric&id=xxxxxx&APPID=xxxxxxxxxxxxxxxxx'";
string CUXD_Device = "CUxD.CUX2801001:1";

! Suchstrings und Offset-Werte zum extrahieren der Temperaturwerte
string xmlTimeStart               = "time from=";
string xmlTimeEnd                 = " to=";
integer xmlTimeStartOffset        = 11;
integer xmlTimeEndOffset          = 11;
string xmlTemperatureStart        = "temperature unit=";
string xmlTemperatureEnd          = "min=";
integer xmlTemperatureStartOffset = 34;
integer xmlTemperatureEndOffset   = 36;
integer xmlSkip                   = 100;

! TimeAdder:
!   0... angebrochenes 3h-Segment wird nicht berücksichtigt
!   5400... 3h-Segment wird berücksichtigt, wenn es zu weniger als der Hälfte abgelaufen ist
!   10800... angebrochenes 3h-Segment wird berücksichtigt
integer TimeAdder = 0; 

! XML-Antwort von OpenWeatherMaps
string recXML;

! Arbeitsvariablen
string wert1;
string wert2;
time jetzt;
integer counter = 1;


! ENDE Deklarationen und Initialisierungen
! ******************************************************************************************

jetzt = system.Date("%F %X");

! Abruf der Daten
dom.GetObject(CUXD_Device#".CMD_SETS").State(func);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
recXML = dom.GetObject(CUXD_Device#".CMD_RETS").State();
if(!recXML){quit;}

! Temperaturwerte ausfiltern
while (counter<2){
  wert1 =  recXML.Substr(recXML.Find(xmlTimeStart)+xmlTimeStartOffset, recXML.Find(xmlTimeEnd)-recXML.Find
(xmlTimeStart)+xmlTimeEndOffset);
  wert2 =  recXML.Substr(recXML.Find(xmlTemperatureStart)+xmlTemperatureStartOffset,recXML.Find(xmlTemperatureEnd)-recXML.Find
(xmlTemperatureStart)+xmlTemperatureEndOffset);
  wert1=wert1.Substr(0,10)#" "#wert1.Substr(11,8);
  if ((wert1.ToTime()+TimeAdder)>jetzt) {
    WriteLine(wert1#"   " # wert2);
    counter = counter + 1;
  }
  recXML=recXML.Substr(recXML.Find(xmlTemperatureStart)+xmlSkip,recXML.Length());
}

! wert2 enthält die Temperatur im nächsten 3h-Segment
! Systemvariable schreiben:
! SysVar_Temp.State(wert2.ToFloat());
Grüße

Mika

Kurzschlusselektriker
Beiträge: 68
Registriert: 22.09.2014, 15:58

Re: HM-Script für virtuelle Wetterstation

Beitrag von Kurzschlusselektriker » 30.05.2017, 11:47

Hallo Mike42,
klasse - Danke für das Update, probiere ich heute Abend gleich mal aus.
Momentan habe ich aber noch ein anderes, gravierenderes, Problem. Das Script läuft nur zuverlässig wenn man es per Hand startet. Programmgesteuert wie in Deinem ersten Post lief es nur einmal zur ersten Startzeit (6.00 Uhr) bzw. dann zwei-dreimal nach manuellen Programmstart.
Hatte einer schon das Problem gehabt, ich meine Seite zwei oder drei von dem Thread, aber auch keine Lösung gepostet...

Grüße
Kurzschlusselektriker

Antworten

Zurück zu „Projektvorstellungen“