OC3 Wetterdaten verarbeiten 1. Ein Gewerk mit dem Namen Logging anlegen und der Wetterstation zuweisen 2. Folgende Systemvariablen anlegen und der Wetterstation zuordnen Gestern Luftfeuchte Max Maximalwert: 100% Gestern Luftfeuchte Min Maximalwert: 100% Gestern Regen Maximalwert: 65000mm Gestern Temp Max Minimalwert: -40 Maximalwert: 80 Celsius Gestern Temp Min Minimalwert: -40 Maximalwert: 80 Celsius Gestern Wind Max Maximalwert: 200 km/h Helligkeit gefiltert Maximalwert: 65000
Heute Luftfeuchte Max Maximalwert: 100% Heute Luftfeuchte Min Maximalwert: 100% Heute Regen Maximalwert: 65000mm Heute Temp Max Minimalwert: -40 Maximalwert: 80 Celsius Heute Temp Min Minimalwert: -40 Maximalwert: 80 Celsius Heute Wind Max Maximalwert: 200km/h 3. Speicherort und SSH Virtuelles Gerät über CUxD Bitte sicherstellen, dass eine SD-Karte in der CCU2 initialisieret wurde. Zudem den SSH Zugang für die SFTP Übertragung aktivieren und evtl. ein eigenes Passwort erstellen. Das default Passwort für den CCU SFTP Zugang Lautet User/PASS root/muzhlo9n%8!g Zum Verbinden benutze ich die freie Software FileZilla. Ein Virtuelles Gerät sollte über CUxD eingebunden werden um die Skripte auszuführen.
4. Skriptdateien Nun erstellen wir 3 Skriptdateien und Speichern diese auf der SD-Karte unter /media/sd-mmcblk0/ Das erste File heißt "writefile.tcl" und ist dafür da um alle 15 Minuten die aktuellen Wetterdaten in eine Tabelle zu schreiben: #!/bin/tclsh set filename "/media/sd-mmcblk0/wetter.csv" set args [join $argv " "] set fileid [open $filename "a+"] puts $fileid $args close $fileid Das zweite heißt "writefile_wetterpool.tcl" und dieses schreibt alle 5 Minuten die aktuellen Wetterdaten in eine Tabelle. Beim nächsten Schreibbefehl werden die Daten dann wieder überschrieben, sodass immer nur die aktuellen Daten in dieser Tabelle stehen: #!/bin/tclsh set filename "/media/sd-mmcblk0/wetterpool.csv" set args [join $argv " "] set fileid [open $filename "w"] puts $fileid $args close $fileid Das dritte heißt "writefile_auswertung.tcl" und ist dafür da um jeden Tag um 23:56Uhr die Tages max. und min. Werte in eine Tabelle zu schreiben. Hiermit erstelle ich dann später Tabellen. #!/bin/tclsh set filename "/media/sd-mmcblk0/wetterauswertung.csv" set args [join $argv " "] set fileid [open $filename "a+"] puts $fileid $args close $fileid
5. Programme auf der CCU2 erstellen Programm berechnet die Min Max Werte Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen -Zeitpunkt 0:00 -Täglich; Jeden Tag ODER Lufttemperatur Größer -40 C Zugehöriges Script: string wds_name = dom.getobject("$src$").name(); object prg=dom.getobject($this$); object dp_tmp=dom.getobject(prg.rule().rulecondition(1).cndsinglecondition(0).leftval()); object dp_wds_channel=dom.getobject(dp_tmp.channel()); object dp_temp_max_today=dom.getobject('heute Temp Max'); object dp_temp_min_today=dom.getobject('heute Temp Min'); object dp_hum_max_today=dom.getobject('heute Luftfeuchte Max'); object dp_hum_min_today=dom.getobject('heute Luftfeuchte Min'); object dp_wind_max_today=dom.getobject('heute Wind Max'); object dp_rain_today=dom.getobject('heute Regen'); object dp_bright_avg=dom.getobject('helligkeit gefiltert'); var pos1 = wds_name.find("temperature"); real temp = dp_wds_channel.dpbyhssdp("temperature").value(); real wind = dp_wds_channel.dpbyhssdp("wind_speed").value(); real bright = dp_wds_channel.dpbyhssdp("brightness").value(); integer humidity = dp_wds_channel.dpbyhssdp("humidity").value(); if(pos1!= -1) var diff = dp_wds_channel.dpbyhssdp("rain_counter").value()- dp_wds_channel.dpbyhssdp("rain_counter").lastvalue(); if ( (1.0*diff) < 0.0 ) diff = (1.0*diff) + dp_wds_channel.dpbyhssdp("rain_counter").valuemax(); dp_rain_today.state(1.0*(dp_rain_today.value()) + diff);
if(temp > dp_temp_max_today.value()) dp_temp_max_today.state(temp); if(temp < dp_temp_min_today.value()) dp_temp_min_today.state(temp); if(wind > dp_wind_max_today.value()) dp_wind_max_today.state(wind); dp_bright_avg.state(((7.0*dp_bright_avg.value())+(1.0*bright))/8); if(humidity > dp_hum_max_today.value()) dp_hum_max_today.state(humidity); if(humidity < dp_hum_min_today.value()) dp_hum_min_today.state(humidity); else var x = dom.getobject('gestern Temp Max').State(dp_temp_max_today.Value()); x = dom.getobject('gestern Temp Min').State(dp_temp_min_today.Value()); x = dom.getobject('gestern Luftfeuchte Max').State(dp_hum_max_today.Value()); x = dom.getobject('gestern Luftfeuchte Min').State(dp_hum_min_today.Value()); x = dom.getobject('gestern Wind Max').State(dp_wind_max_today.Value()); x = dom.getobject('gestern Regen').State(dp_rain_today.Value()); dp_temp_max_today.state(temp); dp_temp_min_today.state(temp); dp_hum_max_today.state(humidity); dp_hum_min_today.state(humidity); dp_wind_max_today.state(wind); dp_rain_today.state(0);
Programm schreibt die Wetterdaten alle 15 Minuten in die Tabelle wetter.csv Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen -Ganztägig -Zeitintervall alle 15 Minuten (die Zeit kann natärlich auch verändert werden) Als Dann Bedingung erstellt man ein Script mit folgendem Inhalt: Zugehöriges Script: var myassembly = dom.getobject("logging"); string itemid; string out; string err; string Raum; string Raum1 = ""; string Temperatur; string Temperatur1=""; integer StellePunkt = 0; string Humidity; string Wind_Speed; string Wind_Speed1=""; integer StellePunkt = 0; string Wind_Direction; string loggingtext = ""; string vdatum = system.date("%d.%m.%y").tostring(); string vuhrzeit = system.date("%h:%m").tostring(); foreach(itemid, myassembly.enumusedids()) var item = dom.getobject(itemid); var device = dom.getobject(item.device()); var interface = dom.getobject(item.interface()); string interface_name = interface.name(); string device_address = device.address(); device_address = device_address.strvaluebyindex(":", 0); string channel_name = interface_name # "." # device_address # ":1.TEMPERATURE"; Temperatur = (dom.getobject(channel_name).value()).tostring();
!---- Punkt im der Temperatur durch ein Komma ersetzen ----------------- StellePunkt = Temperatur.Find("."); Temperatur1 = Temperatur.Substr(0, StellePunkt); Temperatur1 = Temperatur1 + "," + Temperatur.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.HUMIDITY"; Humidity = (dom.getobject(channel_name).value()).tostring(); string channel_name = interface_name # "." # device_address # ":1.WIND_SPEED"; Wind_Speed = (dom.getobject(channel_name).value()).tostring();!---- Punkt im der Wind Speed durch ein Komma ersetzen ----------------- StellePunkt = Wind_Speed.Find("."); Wind_Speed1 = Wind_Speed.Substr(0, StellePunkt); Wind_Speed1 = Wind_Speed1 + "," + Wind_Speed.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.WIND_DIRECTION"; Wind_Direction = (dom.getobject(channel_name).value()).tostring(); string Heute_Regen = dom.getobject("heute Regen").Value().ToString(1); Raum = item.name(); Raum1 = Raum.Substr(0, Raum.Length() - 2); loggingtext = vdatum + ";" + vuhrzeit + ";" + Temperatur1 + "; C;" + Humidity + ";%;" + Wind_Speed1 + ";m/s;" + Wind_Direction + "; ;" + Heute_Regen + ";mm;"; dom.getobject("cuxd.cux2801001:1.cmd_exec").state("tclsh /usr/local/etc/config/writefile.tcl '"#loggingtext#"'"); Programm schreibt die Wetterdaten alle 5 Minuten in die Tabelle wetterpool.csv Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen -Ganztägig -Zeitintervall alle 5 Minuten
Zugehöriges Script: var myassembly = dom.getobject("logging"); string itemid; string out; string err; string Raum; string Raum1 = ""; string Temperatur; string Temperatur1=""; integer StellePunkt = 0; string Humidity; string Wind_Speed; string Wind_Speed1=""; integer StellePunkt = 0; string Wind_Direction; string loggingtext = ""; string vdatum = system.date("%d.%m.%y").tostring(); string vuhrzeit = system.date("%h:%m").tostring(); foreach(itemid, myassembly.enumusedids()) var item = dom.getobject(itemid); var device = dom.getobject(item.device()); var interface = dom.getobject(item.interface()); string interface_name = interface.name(); string device_address = device.address(); device_address = device_address.strvaluebyindex(":", 0); string channel_name = interface_name # "." # device_address # ":1.TEMPERATURE"; Temperatur = (dom.getobject(channel_name).value()).tostring();!---- Punkt im der Temperatur durch ein Komma ersetzen ----------------- StellePunkt = Temperatur.Find("."); Temperatur1 = Temperatur.Substr(0, StellePunkt); Temperatur1 = Temperatur1 + "," + Temperatur.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.HUMIDITY"; Humidity = (dom.getobject(channel_name).value()).tostring(); string channel_name = interface_name # "." # device_address # ":1.WIND_SPEED"; Wind_Speed = (dom.getobject(channel_name).value()).tostring();!---- Punkt im der Wind Speed durch ein Komma ersetzen ----------------- StellePunkt = Wind_Speed.Find("."); Wind_Speed1 = Wind_Speed.Substr(0, StellePunkt); Wind_Speed1 = Wind_Speed1 + "," + Wind_Speed.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.WIND_DIRECTION"; Wind_Direction = (dom.getobject(channel_name).value()).tostring();
string Heute_Regen = dom.getobject("heute Regen").Value().ToString(1); string Gestern_Regen = dom.getobject("gestern Regen").Value().ToString(1); string Temperatur2 = dom.getobject("heute Temp Max").Value().ToString(1); string Temperatur3 = dom.getobject("heute Temp Min").Value().ToString(1); string Humidity2 = dom.getobject("heute Luftfeuchte Max").Value().ToString(1); string Humidity3 = dom.getobject("heute Luftfeuchte Min").Value().ToString(1); string Wind_Speed1 = dom.getobject("heute Wind Max").Value().ToString(1); string Temperatur4 = dom.getobject("gestern Temp Max").Value().ToString(1); string Temperatur5 = dom.getobject("gestern Temp Min").Value().ToString(1); string Humidity4 = dom.getobject("gestern Luftfeuchte Max").Value().ToString(1); string Humidity5 = dom.getobject("gestern Luftfeuchte Min").Value().ToString(1); string Wind_Speed2 = dom.getobject("gestern Wind Max").Value().ToString(1); Raum = item.name(); Raum1 = Raum.Substr(0, Raum.Length() - 2); loggingtext = vdatum + ";" + vuhrzeit + ";" + Temperatur1 + "; C;" + Humidity + ";%;" + Wind_Speed + ";m/s;" + Wind_Direction + "; ;" + Heute_Regen + ";mm;" + Gestern_Regen + ";mm;" + Temperatur2 + "; C;" + Temperatur3 + "; C;" + Humidity2 + ";%;" + Humidity3 + ";%;" + Wind_Speed1 + ";m/s;" + Temperatur4 + "; C;" + Temperatur5 + "; C;" + Humidity4 + ";%;" + Humidity5 + ";%;" + Wind_Speed2 + ";m/s;"; system.exec("tclsh /usr/local/etc/config/writefile_wetterpool.tcl " + loggingtext,&out, &err);
Programm lädt die wetterpool.csv auf den Webserver Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen -Ganztägig -Zeitintervall alle 5 Minuten Zugehöriges Script: dom.getobject("cuxd.cux2801001:1.cmd_exec").state("ld_library_path=/usr/local/addons/cux d/ /usr/local/addons/cuxd/curl -T /media/sd-mmcblk0/wetterpool.csv ftp://server.de/httpdocs/wetter/ --user benutzer:passwort"); Programm schreibt die Wetterdaten um 23:57 in die wetterauswertung.csv Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen -Zeitpunkt 23:57Uhr -Täglich
Zugehöriges Script: var myassembly = dom.getobject("logging"); string itemid; string out; string err; string Raum; string Raum1 = ""; string Temperatur; string Temperatur1=""; integer StellePunkt = 0; string Humidity; string Wind_Speed; string Wind_Speed1=""; integer StellePunkt = 0; string Wind_Direction; string loggingtext = ""; string vdatum = system.date("%d.%m.%y").tostring(); foreach(itemid, myassembly.enumusedids()) var item = dom.getobject(itemid); var device = dom.getobject(item.device()); var interface = dom.getobject(item.interface()); string interface_name = interface.name(); string device_address = device.address(); device_address = device_address.strvaluebyindex(":", 0); string channel_name = interface_name # "." # device_address # ":1.TEMPERATURE"; Temperatur = (dom.getobject(channel_name).value()).tostring();!---- Punkt im der Temperatur durch ein Komma ersetzen ----------------- StellePunkt = Temperatur.Find("."); Temperatur1 = Temperatur.Substr(0, StellePunkt); Temperatur1 = Temperatur1 + "," + Temperatur.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.HUMIDITY"; Humidity = (dom.getobject(channel_name).value()).tostring(); string channel_name = interface_name # "." # device_address # ":1.WIND_SPEED"; Wind_Speed = (dom.getobject(channel_name).value()).tostring();!---- Punkt im der Wind Speed durch ein Komma ersetzen ----------------- StellePunkt = Wind_Speed.Find("."); Wind_Speed1 = Wind_Speed.Substr(0, StellePunkt); Wind_Speed1 = Wind_Speed1 + "," + Wind_Speed.Substr(StellePunkt + 1, 10); string channel_name = interface_name # "." # device_address # ":1.WIND_DIRECTION"; Wind_Direction = (dom.getobject(channel_name).value()).tostring(); string Heute_Regen = dom.getobject("heute Regen").Value().ToString(1);
string Temperatur2 = dom.getobject("heute Temp Max").Value().ToString(1); string Temperatur3 = dom.getobject("heute Temp Min").Value().ToString(1); string Humidity2 = dom.getobject("heute Luftfeuchte Max").Value().ToString(1); string Humidity3 = dom.getobject("heute Luftfeuchte Min").Value().ToString(1); string Wind_Speed1 = dom.getobject("heute Wind Max").Value().ToString(1); string Temperatur4 = dom.getobject("gestern Temp Max").Value().ToString(1); string Temperatur5 = dom.getobject("gestern Temp Min").Value().ToString(1); string Humidity4 = dom.getobject("gestern Luftfeuchte Max").Value().ToString(1); string Humidity5 = dom.getobject("gestern Luftfeuchte Min").Value().ToString(1); string Wind_Speed2 = dom.getobject("gestern Wind Max").Value().ToString(1); Raum = item.name(); Raum1 = Raum.Substr(0, Raum.Length() - 2); loggingtext = vdatum + ";" + Heute_Regen + ";mm;" + Temperatur2 + "; C;" + Temperatur3 + "; C;" + Humidity2 + ";%;" + Humidity3 + ";%;" + Wind_Speed1 + ";km/h;"; dom.getobject("cuxd.cux2801001:1.cmd_exec").state("tclsh /usr/local/etc/config/writefile_auswertung.tcl '"#loggingtext#"'"); Die erzeugten Dateien sammeln die Wetterdaten in den CSV Dateien und können nun beliebig weiter verarbeitet werden.
Als Beispiel habe ich die Datei aktuell.php erstellt und über ein <?php include("aktuell.php");?> Auf den Webspace eingebunden. Inhalt aktuell.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type" /> <title>aktuelle Werte</title> </head> <?php echo '<table border="1">'; $zeilen = file ("wetterpool.csv"); foreach($zeilen AS $zeile) echo "<tr>"; echo "<th>zeitpunkt</th>"; echo "<th>temperatur</th>"; echo "<th>luftfeuchtigkeit</th>"; echo "<th>windgeschwindigkeit</th>"; echo "<th>windrichtung in Grad</th>"; echo "<tr>"; echo '<tr>'; $teile = str_getcsv($zeile, ';', '"'); echo '<td>'. $teile[0]. ' '. $teile[1]. '</td>'; echo '<td>'. $teile[2]. ' '. $teile[3]. '</td>'; echo '<td>'. $teile[4]. ' '. $teile[5]. '</td>'; echo '<td>'. $teile[6]. ' '. $teile[7]. '</td>'; echo '<td>'. $teile[8]. ' '. $teile[9]. '</td>'; echo '</tr>'; echo "<tr>"; echo "<th>heute Regen</th>"; echo "<th>heute Temperatur Maximum</th>"; echo "<th>heute Temperatur Minimum</th>"; echo "<th>heute Luftfeuchtigkeit Maximum</th>"; echo "<th>heute Luftfeuchtigkeit Minimum</th>"; echo "<th>heute Wind Maximum</th>"; echo "<tr>"; echo '</tr>'; echo '<td>'. $teile[10]. ' '. $teile[11]. '</td>'; echo '<td>'. $teile[14]. ' '. $teile[15]. '</td>'; echo '<td>'. $teile[16]. ' '. $teile[17]. '</td>'; echo '<td>'. $teile[18]. ' '. $teile[19]. '</td>'; echo '<td>'. $teile[20]. ' '. $teile[21]. '</td>';
echo '<td>'. $teile[22]. ' '. $teile[23]. '</td>'; echo '</tr>'; echo "<tr>"; echo "<th>gestern Regen</th>"; echo "<th>gestern Temperatur Maiximum</th>"; echo "<th>gestern Temperatur Minimum</th>"; echo "<th>gestern Luftfeuchtigkeit Maiximum</th>"; echo "<th>gestern Luftfeuchtigkeit Minimum</th>"; echo "<th>gestern Wind Maximum</th>"; echo "</tr>"; echo '</tr>'; echo '<td>'. $teile[12]. ' '. $teile[13]. '</td>'; echo '<td>'. $teile[24]. ' '. $teile[25]. '</td>'; echo '<td>'. $teile[26]. ' '. $teile[27]. '</td>'; echo '<td>'. $teile[28]. ' '. $teile[29]. '</td>'; echo '<td>'. $teile[30]. ' '. $teile[31]. '</td>'; echo '<td>'. $teile[32]. ' '. $teile[33]. '</td>'; # echo '<td>'. $teile[34]. ' '. $teile[35]. '</td>'; echo '</tr>'; echo '</table>';