Tageszeit in Abschnitte unterteilen

Begonnen von Dragonfly, 17 Februar 2013, 20:16:53

Vorheriges Thema - Nächstes Thema

Dragonfly

Hallo Rudi!

Bevor ich die funktionierende Möglichkeit eines Zusammenarbeitens von FHEM und CCU im HM-Forum bekannt geben, möchte ich auch für nicht Fritz-User (Raspi, Synology) einen Anreiz bieten sich für FHEM zu begeistern.

Viele User haben ein Tageszeiten-Script am Start, welches alle ca 5 Minuten von der CCU aufgerufen wird.
Eine genaue Beschreibung findet man hier:
http://www.homematic-inside.de/tecbase/homematic/scriptlibrary/item/tageszeit-in-abschnitte-unterteilen
Auschnitt:
Das Skript ermittelt zunächst die aktuelle Uhrzeit sowie die von der Zentrale errechneten Zeiten für den Sonnenauf- und untergang (Astrofunktion). Die Mittagszeit wird fest auf 13:00 Uhr definiert. Die nachfolgenden Zeilen füllen nun die Systemvariable Tageszeit mit den entsprechenden Werten.
Skript:
real c_zeit =
 (0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger();
real c_tagesbeginn =
 (0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
real c_tagesende =
 (0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();
real c_mittag =
 13.00; ! Mittagszeit

integer v_tageszeit = 0; ! Nacht

if (c_zeit < c_tagesende + 1) {
 v_tageszeit = 7; ! Abend
}

if (c_zeit < c_tagesende) {
 v_tageszeit = 6; ! Abenddaemmerung
}

if (c_zeit < c_tagesende - 1) {
 v_tageszeit = 5; ! Nachmittag
}

if (c_zeit < c_mittag + 1) {
 v_tageszeit = 4; ! Mittag
}

if (c_zeit < c_mittag - 1) {
 v_tageszeit = 3; ! Vormittag
}

if (c_zeit < c_tagesbeginn) {
 v_tageszeit = 2; ! Morgengrauen
}

if (c_zeit < c_tagesbeginn - 1) {
 v_tageszeit = 1; ! Fruemorgens
}

if (c_zeit < c_tagesbeginn - 2) {
 v_tageszeit = 0; ! Nacht
}


Da ja für FHEM "sunrise" und "sunset" zur Verfügung steht dürfte die Umsetzung eigentlich recht leicht sein - für dich.
Wenn man den CCU-Bereich auskommentiert und die Variablen im Klartext anzeigt, könnte dies doch auch für alle FHEM-Nutzer zu gebrauchen sein?!

Variablen in der CCU:
0 - Nacht
1 - Frühmorgens
2 - Morgengauen
3 - Vormittag
4 - Mittag
5 - Nachmittag
6 - Dämmerung
7 - Abend

# define CCU_IP dummy
# set CCU_IP 192.168.125.70
attr global latitude 5X.XYZ
attr global longitude 6.XYZ

define TAGESABSCHNITT_STATUS dummy
define TAGESABSCHNITT_check at +*00:05:00 trigger Tagesabschnitt_check
define TAGESABSCHNITT_STATUS_set notify (TAGESABSCHNITT_check|global:INITIALIZED) {\
.
.
.
  fhem "set TAGESABSCHNITT_STATUS $v" if($v ne Value("TAGESABSCHNITT_STATUS"));;\
}
# define TAGESABSCHNITT_ntfy notify TAGESABSCHNITT_STATUS {\
#  GetFileFromURL "http://" . Value("CCU_IP") . ":8181/fhem2ccu.exe?Status=dom.GetObject('Tagesabschnitt ').State(" . Value("TAGESABSCHNITT_STATUS") . ")"\
#  }

Könntest du mir bitte hier nochmal die nötigen Codeschnippsel zur Verfügung stellen?

Vielen Dank - Tom

PS: für eine WIKI-Anmeldung habe ich angesucht :)

rudolfkoenig

> könnte dies doch auch für alle FHEM-Nutzer zu gebrauchen sein?!

Unwahrscheinlich, fuer sowas gibts in fhem bessere Funktionen, siehe z.Bsp. http://fhem.de/commandref.html#Twilight


> Könntest du mir bitte hier nochmal die nötigen Codeschnippsel zur Verfügung stellen?

Mit sowas (tcl nach perl Konvertierung) fange ich gar nicht erst an.

Dragonfly

Hallo Rudi,
hast recht, Twilight ist gut.

Leider müßten hier Stati für die CCU zusammengelgt (u.U. verschiebt sich noch ein Status) und umbenannt werden,
sowie 2 Stati eingefügt werden um die bisherigen Programme der CCU gleich weiterzuführen:
twilight STATE                              CCU-Status
      0          - sr_astro    - 05:28:00 -      1 (1)
      1          - sr_naut     - 06:03:32 -      2 (1)
      2          - sr_civil    - 06:39:20 -      2 (2)
      3          - sr          - 07:15:53 -      3 (2)
      4          - sr_indoor   - 07:22:05 -      3 (2)
      5          - sr_weather  - 07:53:48 -      3
                 -             - 12:00    -      4
                 -             - 14:00    -      5
      6          - ss_weather  - 16:56:59 -      6
      7          - ss_indoor   - 17:28:43 -      6
      8          - ss          - 17:34:55 -      6
      9          - ss_civil    - 18:11:28 -      7
     10          - ss_naut     - 18:47:16 -      0
     11          - ss_astro    - 19:22:48 -      0

Wird in WEATHER_HORIZON eigentlich das interne Mapping verwendet?

Ich hoffe du hast noch etwas Nerven mir dabei zu helfen?!

LG - Tom

rudolfkoenig

Kann Dir keine Details nennen, das Modul wurde von unimatrix gebaut. Er hatte auch Erfahrung mit der CCU.

Dragonfly

Könnte es so funktionieren?
define T twilight 54.18258 7.885938 1 709403
 
define TAGESABSCHNITT_STATUS dummy
define TAGESABSCHNITT_check at +*00:05:00 trigger Tagesabschnitt_check
define TAGESABSCHNITT_STATUS_set notify (TAGESABSCHNITT_check|global:INITIALIZED) {\
  my $v=`Tagesabschnitt`;;\
  chomp($v);;\
  fhem "set TAGESABSCHNITT_STATUS $v" if($v ne Value("TAGESABSCHNITT_STATUS"));;\
}
define TAGESABSCHNITT_ntfy notify TAGESABSCHNITT_STATUS {\
  GetFileFromURL "http://" . Value("CCU_IP") . ":8181/fhem2ccu.exe?Status=dom.GetObject('Tagesabschnitt').State(" . Value("TAGESABSCHNITT_STATUS") . ")"\
  }
 


 sub Tagesabschnitt{
  my $t_light=ReadingsVal("T","state");
  if($t_light eq 0){
    fhem "set TAGESABSCHNITT_STATUS 1" ;
  }elsif($t_light eq 1 ||$t_light eq 2){
    fhem "set TAGESABSCHNITT_STATUS 2" ;
  }elsif($t_light eq 3 ||$t_light eq 4 ||$t_light eq 5){
    fhem "set TAGESABSCHNITT_STATUS 3" ;
  }elsif($$hour eq 12){
    fhem "set TAGESABSCHNITT_STATUS 4" ;  
  }
}

usw.