Seite 1 von 6

Howto - zPNP Sturmwarnungen V2.8

Verfasst: 15.01.2017, 14:45
von dtp
Hallo,

da ich noch nicht so ganz zufrieden war mit meinem Sturmmelde-Programm und -Skript, habe ich es etwas modifiziert. Vielleicht ist es ja eine Anregung für den Einen oder Anderen hier. Die letzten Zeilen des Skripts dienen zum Aufruf des zPNP, können aber natürlich recht einfach durch andere Codezeilen ersetzt werden.

Hier der Skriptcode:

Code: Alles auswählen

! Meldung Sturm
! Version 2.8.1, Autor: dtp
 
! Name von Kanal 1 des Funk-Kombisensors
string channel = "DG Dach Wettersensor Daten";

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svWindSpeedPeak = "Haus SV Sturm Höchstwert"; ! Höchstgeschwindigkeit des Windes, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional
 
! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch
 
! Bargraph der Windstärken
real range = 12.0; ! Maximalwert des darzustellenden Bereichs
real bars = 12.0; ! Anzahl Bars innerhalb range
 
! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################
 
! +++++ Deklaration weiterer Variablen +++++
string wind; string windSpeed; string windSpeedDayMax; string windIndex;
string message; string fontColor1 = ""; string fontColor2 = ""; string bargraph = ""; 
string windForceTable = "1\t6\t12\t20\t29\t39\t50\t62\t75\t89\t103\t118"; 
integer windForce = 0; integer windDir = 0; integer prio = 0;
real barIndex = 0.0;
object svObject; object svObjectList;

! +++++ Systemvariable für die Höchstgeschwindigkeit des Windes auslesen und ggf. anlegen +++++
if(!svWindSpeedPeak){svWindSpeedPeak = "Haus SV Sturm Höchstwert";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svWindSpeedPeak);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svWindSpeedPeak); svObject.DPInfo("Höchstgeschwindigkeit des Windes"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit("km/h"); svObject.ValueMin(0); svObject.ValueMax(65000); dom.RTUpdate(true);
}
else{windSpeedDayMax = svObject.Value();}

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State("siren");}

! +++++ Aktuelle Windgeschwindigkeit und -richtung +++++
windSpeed = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_SPEED").Value();
if((dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIR")){
  windDir = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIR").Value();
}
elseif((dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIRECTION")){
  windDir = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("WIND_DIRECTION").Value();
}

! +++++ Nachricht senden, wenn Windgeschwindigkeit zugenommen hat +++++
if(windSpeed > windSpeedDayMax){
  ! ----- Setzen der Höchstgeschwindigkeit des Windes -----
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svWindSpeedPeak)).State(windSpeed);

  ! ----- Umwandlung der Windgechwindigkeit in Windstärke -----
  foreach(windIndex, windForceTable){if(windSpeed >= windIndex){windForce = windForce+1;}}

  ! ----- Erzeugung der Begriffe in Abhängigkeit von der Windstärke -----
  if(windForce == 12){wind = "Orkan"; prio = 2; fontColor1 = "<font color=red>"; fontColor2 = "</font>";}
  elseif(windForce == 11){wind = "orkanartiger Sturm"; prio = 2; fontColor1 = "<font color=red>"; fontColor2 = "</font>";}
  elseif(windForce == 10){wind = "schwerer Sturm"; prio = 1; fontColor1 = "<font color=red>"; fontColor2 = "</font>";}
  elseif(windForce == 9){wind = "Sturm"; prio = 1; fontColor1 = "<font color=orange>"; fontColor2 = "</font>";}
  elseif(windForce >= 7){wind = "Starkwind"; prio = 1; fontColor1 = "<font color=orange>"; fontColor2 = "</font>";}
  else{wind = "Wind"; prio = 0; fontColor1 = ""; fontColor2 = "";}

  ! ----- Umwandlung der Windrichtung in Himmelsrichtung -----
  if((windDir < 22.5) || (windDir >= 337.5)){windDir = "Nord";}
  elseif(windDir < 67.5){windDir = "Nordost";}
  elseif(windDir < 112.5){windDir = "Ost";}
  elseif(windDir < 157.5){windDir = "Südost";}
  elseif(windDir < 202.5){windDir = "Süd";}
  elseif(windDir < 247.5){windDir = "Südwest";}
  elseif(windDir < 292.5){windDir = "West";}
  elseif(windDir < 337.5){windDir = "Nordwest";}

  ! ----- Berechnung des Bargraphs -----
  while((barIndex < windForce) && (barIndex <= (range - range/bars))){
    bargraph = bargraph#"|";
    barIndex = barIndex + range/bars;
  }

  ! +++++ Setzen der Priorität für die Push-Nachricht +++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State(prio);

  ! +++++ Erzeugen der Nachricht +++++
  message = fontColor1#"Achtung, "#wind#" aus "#windDir#"!"#fontColor2#"\n"#bargraph#" Windstärke "#windForce#" ("#windSpeed.ToString(2)#" km/h)";
 
  ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen ++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}

In der Zeile

Code: Alles auswählen

string channel = "DG Dach Wettersensor Daten";
einfach den Namen von Kanal 1 eures Wettersensors eintragen. Ich selbst nutze das Skript in Verbindung mit einem HmIP-SWO-PR.

Zudem legt das Skript automatisch mit dem ersten Aufruf eine Systemvariable für die Windhöchstgeschwindigkeit an. Deren Namen könnt ihr einfach in die Codezeile

Code: Alles auswählen

string svWindSpeedPeak = "Haus SV Sturm Höchstwert"; ! Höchstgeschwindigkeit des Windes, obligatorisch
eingeben. Falls ihr hier mit svWindSpeedPeak = "" keinen Namen vergebt, wird die Systemvariable mit dem Namen "Haus SV Sturm Höchstwert" angelegt.

Und hier das zugehörige WebUI-Programm:
Haus SV Sturm.png
Achtung: Vor dem ersten Aufruf des Programms existiert die Systemvariable "Haus SV Sturm Höchstwert" noch nicht. Daher lasst ihr die rot umrandete Zeile im Dann-Zweig erst mal weg. Nachdem das Programm das erste Mal ausgeführt wurde (dazu am besten die Auslöseschwelle größer 0 km/h setzen), müsst ihr diese Zeile dann einfach hinzufügen, damit der Höchstwert regelmäßig auf null gesetzt wird.

Für den Regelbetrieb empfiehlt sich, die Auslöseschwelle auf 50 km/h entsprechend Windstärke 6 zu setzen. Ihr könnt aber natürlich auch jeden beliebigen anderen Wert einsetzen.

So sehen die Push-Nachrichten aus, die das Programm dank Strumtief Sabine unter Pushover erzeugt.
Pushover_Sturm.png
Es erfolgt eine Meldung mit der Art des Windes in Abhängigkeit von der Windstärke und mit der Windrichtung. Die Windgeschwindigkeit wird in die entsprechende Windstärke umgerechnet und zusäztlich als Bargraph angezeigt. Der Bargraph zeigt pro Windstärke ein Segment an, kann aber durch Änderung der Werte "range" und "bars" entsprechend angepasst werden, was aber im vorliegenden Fall nicht sehr viel Sinn machen dürfte.

Zur Vermeidung von zu häufigen Meldungen, habe ich das Skript so programmiert, dass eine Push-Nachricht nur dann abgesendet wird, wenn sich die Windgeschwindigkeit gegenüber dem bisherigen Tageshöchstwert weiter erhöht hat. Jeweils um 0:00 Uhr wird der Tageshöchstwert dann wieder auf null gesetzt. Wenn ihr diesen Reset häufiger haben möchtet (z.B. jede halbe Stunde), dann müsst ihr einfach nur das Zeitmodul entsprechend anpassen.

Viel Spaß beim Anwenden.

Gruß,

Thorsten

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 23.09.2018, 09:00
von DiJe
Hallo Thorsten,
bin zufällig auf dein Script gestossen.
Ich nutze ja schon dein Stromscript.
Auch dieses hier läuft, wie gewohnt bei dir , super.
Danke für dein teilen mit uns.
Gruß Dieter

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 23.09.2018, 20:38
von duralis
Ich hatte bisher auch nur ein Programm ohne Script, habe aber nun mal dein Script eingebaut.

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 26.09.2018, 16:50
von dtp
Ich habe da noch was überarbeitet, da wir am letzten Samstag mit Sturmmeldungen überschüttet wurden.

Das Skript fängt zwar ab, dass man jedes Mal bei Überschreiten der Schwelle eine Meldung erhält, indem es den aktuellen mit dem vorherigen Wert vergleicht, aber das hilft nur bedingt. Der Kombisensor schickt ja ca. alle drei Minuten einen Messwert raus. Somit kann es im Worst Case passieren, dass man alle sechs Minuten eine Push-Nachricht mit einer Sturmwarnung erhält, wenn es stark böig ist.

Die Änderung sieht nun eine Art Peak-Hold-Funktion vor. Dazu wird bei Überschreiten des Schwellwerts eine Systemvariable mit dem bisherigen Tageshöchstwert beschrieben und nur noch dann eine Push-Nachricht gesendet, wenn der aktuelle Messwert über diesem Tageshöchstwert liegt. Um 00:00 Uhr wird die Systemvariable dann wieder genullt.

Skript und Programm folgen.

Bis dann,

Thorsten

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 11.03.2019, 03:58
von Micha121
Hi dtp,

ich wollte Dich mal fragen, ob Du bei dem Projekt weitergearbeitet hast? Weil Du geschrieben hast:
dtp hat geschrieben:
26.09.2018, 16:50
Skript und Programm folgen.

Bis dann,

Thorsten
Nachtrag: Funktioniert dies auch mit dem HM-IP-SWO-PL, also der Wetterstation von HM IP? Falls nicht - könntest Du das zugehörige Skript ggf. auch zur Verfügung stellen?


Viele Grüße

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 11.03.2019, 07:21
von dtp
Das ist schon im Ausgangsposting mit Version 2.5 des Skripts enthalten gewesen. Hatte das zwischenzeitlich aktualisiert. Gab jetzt noch ein paar kleinere kosmetische Änderungen in der Version 2.5.2.

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 11.03.2019, 14:03
von Andronid
Hallo Thorsten,
bei mir kommt im Test des Programms (Fehlerprüfung) folgende Meldung:
" Error 1 at row 68 col 59 near ^)).ProgramExecute();
}
Error 1 at row 68 col 59 near ^)).ProgramExecute();
}
Parse following code failed: "
Allerdings nutze ich die Wetterdaten von Netatmo, habe aber ansonsten alles so angegeben, wie in deinem Howto. Vielleicht kannst du helfen?

Gruß Reinhard

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 11.03.2019, 14:21
von dtp
Hallo Reinhard,

da war ein Umbruch nicht in Ordnung. Hab's gefixt. Nun sollte es gehen.

Gruß,

Thorsten

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 12.03.2019, 14:02
von Andronid
Hallo Thorsten,
vielen Dank. Hat funktioniert. Nun wird kein Fehler angezeigt. Jetzt will ich hoffen, dass ich auch die richtigen Variablen aus der Netatmo abgreife. Gerade ist es mal wieder etwas windstill.

Gruß Reinhard

Re: Howto - kleines Skript zur Sturmmeldung

Verfasst: 12.03.2019, 14:16
von dtp
Nun ja, wenn's um die Einbindung der Netatmo geht, kann ich dich nur hier drauf verweisen.