Autor Thema: Tageszeit in Abschnitte unterteilen  (Gelesen 5859 mal)

Offline Dragonfly

  • Full Member
  • ***
  • Beiträge: 116
    • CCU-RemotePC - auch FHEM-Befehle unter Windows senden und empfangen
Tageszeit in Abschnitte unterteilen
« am: 17 Februar 2013, 20:16:53 »
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 :)

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25621
Aw: Tageszeit in Abschnitte unterteilen
« Antwort #1 am: 18 Februar 2013, 19:54:42 »
> 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.

Offline Dragonfly

  • Full Member
  • ***
  • Beiträge: 116
    • CCU-RemotePC - auch FHEM-Befehle unter Windows senden und empfangen
Aw: Tageszeit in Abschnitte unterteilen
« Antwort #2 am: 19 Februar 2013, 16:13:39 »
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

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25621
Aw: Tageszeit in Abschnitte unterteilen
« Antwort #3 am: 19 Februar 2013, 16:57:07 »
Kann Dir keine Details nennen, das Modul wurde von unimatrix gebaut. Er hatte auch Erfahrung mit der CCU.

Offline Dragonfly

  • Full Member
  • ***
  • Beiträge: 116
    • CCU-RemotePC - auch FHEM-Befehle unter Windows senden und empfangen
Aw: Tageszeit in Abschnitte unterteilen
« Antwort #4 am: 19 Februar 2013, 19:47:06 »
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.