Konfiguration

Ich möchte beschreiben wie ich die Wetterdaten von meinem OC3 Sensor logge und auf meiner Homepage zur VerfĂŒgung stelle.


Als erstes muss natĂŒrlich der Wettersensor an die CCU angelernt werden.



Danach wird ein Gerwerk mit dem Namen "Logging" angelegt, und der Wettersensor diesem zugeordnet.


Danach mĂŒssen folgende Systemvariablen erstellt werden:



Gestern Luftfeuchte Max
Zahl
Minimalwert: 0
Maximalwert: 100%

Gestern Luftfeuchte Min
Zahl
Minimalwert: 0
Maximalwert: 100%

Gestern Regen
Zahl
Minimalwert: 0
Maximalwert: 65000mm

Gestern Temp Max
Zahl
Minimalwert: -40
Maximalwert: 80 Celsius

Gestern Temp Min
Zahl
Minimalwert: -40
Maximalwert: 80 Celsius

Gestern Wind Max
Zahl
Minimalwert: 0
Maximalwert: 200 km/h

Helligkeit gefiltert
Zahl
Minimalwert: 0
Maximalwert: 65000

Heute Luftfeuchte Max
Zahl
Minimalwert: 0
Maximalwert: 100%

Heute Luftfeuchte Min
Zahl
Minimalwert: 0
Maximalwert: 100%

Heute Regen
Zahl
Minimalwert: 0
Maximalwert: 65000mm

Heute Temp Max
Zahl
Minimalwert: -40
Maximalwert: 80 Celsius

Heute Temp Min
Zahl
Minimalwert: -40
Maximalwert: 80 Celsius

Heute Wind Max
Zahl
Minimalwert: 0
Maximalwert: 200km/h

Jeder dieser Variablen muss dann mit dem Kombisensor verknĂŒpft werden.


Als nÀchstes bindet man den USB Stick in die CCU ein. Das mache ich mit dem Programm CUxD.
In der Anleitung ist beschrieben wie ein Mount und Unmount funktioniert.




Um auf die gespeicherten Tabellen zugreifen zu können benötigt man noch einen ftp Zugang. Dazu wird die Zusatzsoftware http://www.homematic-inside.de/software/addons/item/ftp benötigt.
Außerdem das Program Total Commander http://www.chip.de/downloads/Total-Commander_12992663.html. Hier gibt es auch noch zahlreiche andere Programme, allerdings gefĂ€llt mir dieses ziemlich gut.

So nun sind wir fertig mit der Vorbereitung und dem Installieren aller Software. Jetzt geht es ans programmieren.


Als erstes erstellen wir ein paar Textfiles mit dem standartmĂ€ĂŸigen Windows Editor
welche wir dann im Anschluss mit dem Total Commander auf unsere CCU ĂŒbertragen.

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 30 Minuten die aktullen 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

Diese drei Textfiles werden in der CCU unter usr/local/etc/config abgespeichert. Dazu verbinden wir uns mit dem Program FileZilla mit der CCU. Dort können wir dann bequem die Datien verschieben.



Jetzt gehen wir in den Webbrowser und verbinden uns mit der WeboberflÀche der CCU.


Als erstes erzeugt man die max und min Werte. Dazu erstellt man im WebUI ein Programm unter dem Namen "Max Min".


Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen
-Zeitpunkt 0:00
-TĂ€glich; Jeden Tag
ODER
Lufttemperatur GrĂ¶ĂŸer -40°C

Als Dann Bedingung erstellt man ein Script mit folgendem Inhalt:
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);
}

Als zweites erstellt man nun im WebUI ein Programm mit dem Namen "Logging". Hierbei werden alle 15 Minuten die aktuellen Wetterdaten in eine Tabelle geschrieben.



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:
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 /etc/config/writefile.tcl '"#loggingtext#"'");


Das dritte Programm schreibt alle halbe Stunde die Wetterdaten inkl. min und max Werte in eine Tabelle. Diese wird dann nachher auf der Website angezeigt. Bei mir heißt dieses Program "Homepage"



Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen
-GanztÀgig
-Zeitintervall alle 30 Minuten
Als Dann Bedingung erstellt man ein Script mit folgendem Inhalt:
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 /etc/config/writefile_auswertung.tcl '"#loggingtext#"'");


Das vierte Programm lĂ€dt die Datei "wetterpool.csv" auf die Homepage hoch und heißt bei mir "upload".



Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen
-GanztÀgig
-Zeitintervall alle 1810 Sekunden (damit zuerst die Tabelle mit den Wetterdaten erstellt wird und danach erst hochgeladen wird)
Als Dann Bedingung erstellt man ein Script mit folgendem Inhalt:
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd/ /usr/local/addons/cuxd/curl -T /media/sd-mmcblk0/Dateiname.xxx ftp://Servername/--user User:Passwort");


Das fĂŒnfte Programm fĂŒgt um 23:56Uhr der Tabelle wetterauswertung.csv die min und max Temperaturen des Tages hinzu.



Das ganze besitzt als Wenn Bedingung eine Zeitfunktion mit den Einstellungen
-Zeitpunkt 23:57Uhr
-TĂ€glich
Als Dann Bedingung erstellt man ein Script mit folgendem Inhalt:
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 /etc/config/writefile_auswertung.tcl '"#loggingtext#"'");

Nun werden die Daten in zwei verschiedene Tabellen gespeichert und können von dort aus weiter verarbeitet werden.