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";
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
Und hier das zugehörige WebUI-Programm:
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. 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