Homestatus und Tag/Nacht Automation

Begonnen von dt2510, 16 Februar 2017, 11:52:49

Vorheriges Thema - Nächstes Thema

dt2510

Ich habe mein FHEM/TABLETUI schon rudimentär mit einer Tag/Nacht Automation in Verbindung mit dem Homestatus ausgestattet, allerdings gibt es immer mal wieder unvorhergesehene Schaltungen, vor Allem wenn ich zu Hause (Status: Home) bin. Da macht man schon eher mal eine Lampe an und eine andere aus, weil man sie nicht braucht usw.
Jetzt hab' ich mir überlegt eine Art Konfigurationsseite zu bauen, in der ich für jede Lampe und jeden Rolladen Parameter angeben kann, wann wie geschaltet wird. Die Frage ist jetzt, wie mache ich das am sinnvollsten ? Hier mal ein Paar Werte die mir in den Sinn kamen:

(Default) Zustand Tagsüber
- Home: an/aus, dim, pct
- Away: an/aus, dim, pct
- Bed: an/aus, dim, pct
- Holiday: an/aus, dim, pct

(Default) Zustand Nachts
- Home: an/aus, dim, pct
- Away: an/aus, dim, pct
- Bed: an/aus, dim, pct
- Holiday: an/aus, dim, pct

Automatisch schalten
- Home: ja/nein
- Away: ja/nein
- Bed: ja/nein
- Holiday: ja/nein

Beim Wechsel von Tag auf Nacht/Nacht auf Tag würde der jeweilige Default Wert gesetzt werden wenn "Automatisch schalten" JA ist
Beim aktivieren eines Homestatus würde IMMER der jeweilige Default Wert in Abhängigkeit von Tag/Nacht gesetzt.

Auf diese Art müsste ich für JEDEN Aktor (in dem Beispiel nur Licht und Rolläden) 12 Werte auf der Konfigurationsseite anzeigen und in einer Variable als Attribute speichern.

Gibt es da eine einfachere Lösung bzw. mach' ich es mir unnötig kompliziert ?

Zudem könnte man sich noch Steuerungen nur an bestimmten Tagen oder Zufallsschaltungen bei Abwesenheit usw. vorstellen, aber ich denke das würde den Rahmen sprengen.

n4rrOx


Familienpapi

Das wäre mir zu Allgemein. Ich habe mir das ganze selbst gebaut:

in fhem.cfg:
define Timer at +*00:15:00 {TimerControl()}
attr Timer alignTime 00:00:01
attr Timer group Timer
attr Timer room zConfig

define R14_Light1_Timer1_Aktiv dummy
attr R14_Light1_Timer1_Aktiv alias Licht1 Timer1 Aktiv
attr R14_Light1_Timer1_Aktiv devStateIcon Aus:ios-off An:ios-on-for-timer-green
attr R14_Light1_Timer1_Aktiv group zLicht1_Timer1
attr R14_Light1_Timer1_Aktiv icon icoUhr
attr R14_Light1_Timer1_Aktiv room Wohnen
attr R14_Light1_Timer1_Aktiv setList state:uzsuSelectRadio,Aus,An
attr R14_Light1_Timer1_Aktiv sortby R14_Timer11
attr R14_Light1_Timer1_Aktiv webCmd state

define R14_Light1_Timer1_Tag dummy
attr R14_Light1_Timer1_Tag alias Licht1 Timer1 Tag
attr R14_Light1_Timer1_Tag group zLicht1_Timer1
attr R14_Light1_Timer1_Tag icon icoUhr
attr R14_Light1_Timer1_Tag room Wohnen
attr R14_Light1_Timer1_Tag setList state:uzsuSelectRadio,Mo,Di,Mi,Do,Fr,Sa,So,FT,WT,WE,AL
attr R14_Light1_Timer1_Tag sortby R14_Timer12
attr R14_Light1_Timer1_Tag webCmd state

define R14_Light1_Timer1_Zeit dummy
attr R14_Light1_Timer1_Zeit alias Licht1 Timer1 Zeit
attr R14_Light1_Timer1_Zeit group zLicht1_Timer1
attr R14_Light1_Timer1_Zeit icon icoUhr
attr R14_Light1_Timer1_Zeit room Wohnen
attr R14_Light1_Timer1_Zeit setList state:uzsuSelectRadio,Normal,Sonnenaufgang,Sonnenuntergang
attr R14_Light1_Timer1_Zeit sortby R14_Timer13
attr R14_Light1_Timer1_Zeit webCmd state

define R14_Light1_Timer1_Stunde dummy
attr R14_Light1_Timer1_Stunde alias Licht1 Timer1 Stunde
attr R14_Light1_Timer1_Stunde group zLicht1_Timer1
attr R14_Light1_Timer1_Stunde icon icoUhr
attr R14_Light1_Timer1_Stunde room Wohnen
attr R14_Light1_Timer1_Stunde setList state:slider,0,1,24
attr R14_Light1_Timer1_Stunde sortby R14_Timer14
attr R14_Light1_Timer1_Stunde webCmd state

define R14_Light1_Timer1_Minute dummy
attr R14_Light1_Timer1_Minute alias Licht1 Timer1 Minute
attr R14_Light1_Timer1_Minute group zLicht1_Timer1
attr R14_Light1_Timer1_Minute icon icoUhr
attr R14_Light1_Timer1_Minute room Wohnen
attr R14_Light1_Timer1_Minute setList state:slider,0,15,45
attr R14_Light1_Timer1_Minute sortby R14_Timer15
attr R14_Light1_Timer1_Minute webCmd state

define R14_Light1_Timer1_Set dummy
attr R14_Light1_Timer1_Set alias Licht1 Timer1 Helligkeit in %
attr R14_Light1_Timer1_Set group zLicht1_Timer1
attr R14_Light1_Timer1_Set icon icoUhr
attr R14_Light1_Timer1_Set devStateIcon ^([0-5])$:FS20.off ^([6-9]|1[0-1])$:dim06% ^(1[2-7])$:dim12% ^(1[8-9]|2[0-4])$:dim18% ^(2[5-9]|30)$:dim25% ^(3[1-6])$:dim31% ^(3[7-9]|4[0-2])$:dim37% ^(4[3-9])$:dim43% ^(5[0-5])$:dim50% ^(5[6-9]|6[0-1])$:dim56% ^(6[2-7])$:dim62% ^(6[8-9]|7[0-4])$:dim68% ^(7[5-9]|80)$:dim75% ^(8[1-6])$:dim81% ^(8[7-9]|9[0-2])$:dim87% ^(9[3-9])$:dim93% 100:dim100%
attr R14_Light1_Timer1_Set room Wohnen
attr R14_Light1_Timer1_Set setList state:slider,0,1,100
attr R14_Light1_Timer1_Set sortby R14_Timer16
attr R14_Light1_Timer1_Set webCmd state

define R14_Light1_Timer1_Dim dummy
attr R14_Light1_Timer1_Dim alias Licht1 Timer1 Dimmer Geschwindigkeit
attr R14_Light1_Timer1_Dim group zLicht1_Timer1
attr R14_Light1_Timer1_Dim icon icoUhr
attr R14_Light1_Timer1_Dim devStateIcon Normal:control_arrow_rightward@green Langsam:hourglass@red
attr R14_Light1_Timer1_Dim room Wohnen
attr R14_Light1_Timer1_Dim setList state:uzsuSelectRadio,Normal,Langsam
attr R14_Light1_Timer1_Dim sortby R14_Timer17
attr R14_Light1_Timer1_Dim webCmd state


in  99_myUtils.pm:
sub
TimerControl {
## help variables
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
  my @days = ("So","Mo","Di","Mi","Do","Fr","Sa");
  my $day = $days[$wday];
  my $ft = 0;
  my $fe = 0;
  my $hourSA = int(substr(Value("Sonnenaufgang"),0,2));
  my $minSA = int(substr(Value("Sonnenaufgang"),3,2));
  my $hourSU = int(substr(Value("Sonnenuntergang"),0,2));
  my $minSU = int(substr(Value("Sonnenuntergang"),3,2));
  if ($minSA>45) {
    $hourSA++;
$minSA = 0;
  } elsif ($minSA>30) {
    $minSA = 45;
  } elsif ($minSA>15) {
    $minSA = 30;
  } else {
    $minSA = 15;
  }
  if ($minSU>45) {
    $hourSU++;
$minSU = 0;
  } elsif ($minSU>30) {
    $minSU = 45;
  } elsif ($minSU>15) {
    $minSU = 30;
  } else {
    $minSU = 15;
  }
  if (Value("FeierTag") ne "keiner") {
    $ft = 1;
  }
  if (Value("FerienTag") ne "keiner") {
    $fe = 1;
  }
  if (Value("R14_Light1_Timer1_Aktiv") eq "An") {
    if ((Value("R14_Light1_Timer1_Zeit") eq "Normal") && (Value("R14_Light1_Timer1_Stunde") eq $hour && Value("R14_Light1_Timer1_Minute") eq $min)
     || (Value("R14_Light1_Timer1_Zeit") eq "Sonnenaufgang") && ($hour==$hourSA) && ($min==$minSA)
     || (Value("R14_Light1_Timer1_Zeit") eq "Sonnenuntergang") && ($hour==$hourSU) && ($min==$minSU)) {
      if ((Value("R14_Light1_Timer1_Tag") eq $day)
       || (Value("R14_Light1_Timer1_Tag") eq "AL")
       || ((Value("R14_Light1_Timer1_Tag") eq "WT") && ($wday>0) && ($wday<6))
       || ((Value("R14_Light1_Timer1_Tag") eq "WE") && (($wday==0) || ($wday==6)))
       || ((Value("R14_Light1_Timer1_Tag") eq "FT") && ($ft==1))
       || ((Value("R14_Light1_Timer1_Tag") eq "FE") && ($fe==1))) {
        if (Value("R14_Light1_Timer1_AusAn") eq "An") {
        fhem "set R14_Light1 on";
        } else {
      fhem "set R14_Light1 off";
        }
      }
    }
  }


Wie man sieht habe ich noch Ferientage, Feiertage, Sonnenaufgang und Sonnenuntergang berücksichtigt, die über Google Kalender bzw. entspr. Funktionen an anderer Stelle als dummies gesetzt werden.

In der TabletUI habe ich den Code:
<li data-row="2" data-col="3" data-sizex="4" data-sizey="2">
  <header>
    <div class="large">Licht 1 - Timer 1</div>
  </header>
  <table width="100%">
    <tr>
      <td rowspan="2">
        <div data-type="switch"
         data-device="R14_Light1_Timer1_Aktiv"
         data-get-on="An"
         data-get-off="Aus"
         data-icon="fa-power-off"
         data-on-color="#ff0000"
         data-off-color="#5599ff"
         class="inline">
        </div>
      </td>
      <td colspan="2">
        <div data-type="select"
         data-device="R14_Light1_Timer1_Tag"
         data-get="state"
         data-set=" "
         data-items='["Mo",    "Di",      "Mi",      "Do",        "Fr",     "Sa",     "So",     "FT",      "WT",     "WE",      "FE",       "AL"]'
         data-alias='["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag","Feiertag","Werktag","Wochende","Ferientag","alle Tage"]'
         data-list=" "
         class="inline">
        </div>
        <div data-type="select"
         data-device="R14_Light1_Timer1_Stunde"
         data-items='["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"]'
         data-list=" "
         data-get="state"
         data-set=" "
         class="inline">
        </div>
        <div data-type="select"
         data-device="R14_Light1_Timer1_Minute"
         data-get="state"
         data-set=" "
         data-items='["0","15","30","45"]'
         data-list=" "
         class="inline">
        </div>
     </td>
   </tr>
   <tr>
     <td colspan="2">
        <div data-type="select"
         data-device="R14_Light1_Timer1_Zeit"
         data-get="state"
         data-set=" "
         data-items='["Normal","Sonnenaufgang","Sonnenuntergang"]'
         data-alias='["Normal","Sonnenaufgang","Sonnenuntergang"]'
         data-list=" "
         class="inline">
        </div>
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <div data-type="volume"
         data-device="R14_Light1_Timer1_Set"
         data-get="state"
         data-min="0"
         data-max="100"
         data-tickstep="1"
         class="inline mini top-space">
        </div>
      </td>
      <td>
        <div data-type="select"
         data-device="R14_Light1_Timer1_Dim"
         data-get="state"
         data-set=" "
         data-items='["Normal","Langsam"]'
         data-alias='["Normal","Langsam"]'
         data-list="inline"
         class="">
        </div>
      </td>
    </tr>
  </table>
</li>


Pro TabletUI Seite bringe ich bei meinem 7-Zoll Tablet sechs Timer mit Hauptmenü links unter.
Geplant ist noch ein Button mit aut. Zufallssteuerung bei Urlaub (mein Homestatus kennt nur "Normal" und "Urlaub").
FHEM@RPi4, piVCCU3@RPi3 (nur Homematic IP), boot via USB NVME SSD, keine SDs,
FTUI 3, HMCCU, MQTT(Mosquitto), MobileAlerts, JeelinkV3c868 (LaCrosse), ZWAVE(+), TelegramBot, eigene Heizungssteuerung, Configurable Firmata
ESP8266 MQTT mit eigener Firmware / Framework

dt2510

Zitat von: n4rrOx am 16 Februar 2017, 12:54:04
Hi,

ggf. könnte das Modul Homemode dafür in Frage kommen? https://forum.fhem.de/index.php/topic,64317.0.html

Ich hab' es mal kurz überflogen, aber bin noch nicht wirklich durchgestiegen und auch nicht sicher ob das wirklich die Lösung für mich ist. Zudem ist das RESIDENTS Modul bei mir eigentlich unnötig - außer meinem Hund und mir wohnt eh' keiner im Haus :)

dt2510

Zitat von: Familienpapi am 16 Februar 2017, 13:10:49
Das wäre mir zu Allgemein. Ich habe mir das ganze selbst gebaut:

Also ein ähnlicher Ansatz wie meiner - über Dummys - nur mit etwas anderem Schwerpunkt.
Der (Programmier-)Aufwand dahinter erscheint mir auch sehr hoch ... arbeitest du nicht mit Parametern und Subroutinen, sondern hast die Befehle für jedes Rxx_Licht kopiert ?

Vielleicht gibt es ja noch andere Ansätze ...

Familienpapi

Zitat von: dt2510 am 16 Februar 2017, 15:29:22
arbeitest du nicht mit Parametern und Subroutinen, sondern hast die Befehle für jedes Rxx_Licht kopiert ?
Vielleicht gibt es ja noch andere Ansätze ...

Ich hatte ursprünglich den Ansatz, alles in einen Dummy mit readingList zu bauen, habe es aber nicht geschafft, auf der Standard-FHEM-Oberfläche jedes einzelne Reading unterschiedlich darzustellen. Jetzt mit der TabletUI bin ich am überlegen, ob ich das neu programmiere und für alle 12 Timer pro Licht nur noch einen dummy mit entsprechend vielen readings verwende.

Den Aufwand dahinter sehe ich als gering, da es einfach nur copy&paste ist. Einmal ausprogrammiert und ausgiebig getestet, kann ich das für alle Lichter verwenden - im übrigen auch für Steckdosen und Heizungen.

Die Zeitsteuerung von FHEM kann mir zu wenig. Vielleicht hat sich da aber auch in der Zwischenzeit etwas getan. Meine Timerprogrammierung ist ca. 1,5 Jahre alt.
FHEM@RPi4, piVCCU3@RPi3 (nur Homematic IP), boot via USB NVME SSD, keine SDs,
FTUI 3, HMCCU, MQTT(Mosquitto), MobileAlerts, JeelinkV3c868 (LaCrosse), ZWAVE(+), TelegramBot, eigene Heizungssteuerung, Configurable Firmata
ESP8266 MQTT mit eigener Firmware / Framework

dt2510

Mir reicht die Tag/Nacht Unterscheidung erst einmal. Mir fällt momentan nichts ein, was zu anderen Zeiten geschaltet werden müsste...