Kindernachtlicht mit sunrise/sunset und FTUI Darstellung

Begonnen von Dracolein, 03 Januar 2020, 23:17:20

Vorheriges Thema - Nächstes Thema

Dracolein

Hallo zusammen,

ich habe ein kleines Nachtlicht für den Flur unserer Kinder mithilfe einer Osram Smart Plug Steckdose gebastelt.

define Nachtlicht_2OG_Ein at *{sunset(0,"19:00","22:00")} set HUEDevice3 on
define Nachtlicht_2OG_Aus at *{sunrise(0,"05:30","8:00")} set HUEDevice3 off


Das zweite Device sieht nun so aus:

Internals:
   CFGFN     
   COMMAND    set HUEDevice3 off
   DEF        *{sunrise(0,"05:30","8:00")} set HUEDevice3 off
   FUUID      5e0fb33a-f33f-4dec-c624-c4f3ee69d62ce4a9
   NAME       Nachtlicht_2OG_Aus
   NR         259
   NTM        07:53:22
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 07:53:22
   TIMESPEC   {sunrise(0,"05:30","8:00")}
   TRIGGERTIME 1578120802
   TRIGGERTIME_FMT 2020-01-04 07:53:22
   TYPE       at
   READINGS:
     2020-01-03 22:47:15   state           Next: 07:53:22
Attributes:
   room       Befehle

So wie ich es sehe, wird FHEM das Nachtlicht um 07:53 morgen früh abschalten. An sich erstmal okay, aber ich nutze auf meinem Dashboard ebenfalls eine Darstellung für Sonnenaufgang und Untergang und bemerke eine erhebliche Abweichung. Neugierig, wie ich bin, interessiert mich hier die Ursache.


Internals:
   COMMAND    {}
   DEF        *{sunrise("REAL",0,"4:00","09:00")} {}
   FUUID      5de17c70-f33f-4dec-0ad2-e5133fe5591dc147
   NAME       Sonnenaufgang
   NR         28
   NTM        08:39:37
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 08:39:37
   TIMESPEC   {sunrise("REAL",0,"4:00","09:00")}
   TRIGGERTIME 1578123577
   TRIGGERTIME_FMT 2020-01-04 08:39:37
   TYPE       at
   READINGS:
     2019-11-29 21:33:15   e_state         Next:
     2020-01-03 20:49:37   state           Next: 08:39:37
Attributes:
   room       Kalender


Dazu steht im Wiki mitunter:
ZitatDiese Funktionen können jeweils mit einem speziellen und drei weiteren (optionalen) Parametern aufgerufen werden:

...(offset,min,max)
mit der Bedeutung
Horizont; nur einer der Werte REAL, CIVIL, NAUTIC, ASTRONOMIC (in genau dieser Schreibweise) bzw. HORIZON= ist erlaubt
Aber was wird den defaultmäßig zur Zeitberechnung genutzt, wenn nicht z.B. explizit "REAL" eingetragen wurde?

Weiterhin eine Schönheitsfrage zur Integration in FTUI:
Dort schmückt ein Statussymbol des Nachtlichts das Display, woran ich erkennen kann, ob es ein- oder ausgeschaltet ist und es auch manuell schalten kann.
Gern würde ich darunter einen Texteintrag sehen, in dem die Uhrzeit der nächsten Aktivität stehen wird. Also z.B. wann das Nachtlicht demnächst eingeschaltet wird oder wann es bald abgeschaltet wird - jeweils entsprechend zum aktuellen Zeitpunkt. Jetzt ist es 23:14, ich würde gern dort ablesen, wann es morgen früh ausgeschaltet wird. Und morgen Mittag z.B. würde ich gern ablesen können, wann es sich abends einschalten wird.
Beide at-Devices haben ja bereits auf dem Parameter "NTM" oder "State" die Uhrzeit der nächsten Aktivität stehen.

Aber wie kann ich diesen Wert auf eine separate Variable übertragen, die jeweils nur den nächst gültigen Zeitpunkt angibt, abhängig von der aktuellen Uhrzeit? Würde mich freuen, wenn mir jmd. dafür behilflich wäre.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

OdfFhem

@Dracolein / FTUI

Wenn die separate Variable nur für FTUI verwendet würde, bräuchte man diese eigentlich nicht.

Stattdessen könnte man das FTUI-Widget "classchanger" verwenden, um eine zustandsabhängige Darstellung umzusetzen.

Dann könnte man z.B. bei ausgeschaltetem Nachtlicht eine grün eingefärbte Einschaltzeit und bei eingeschaltetem Nachtlicht eine rot eingefärbte Ausschaltzeit darstellen ...

Nobbynews

#2
Die unterschiedlichen Zeiten ergeben sich aus den beiden nicht identischen Definitionen.

DEF        *{sunrise(0,"05:30","8:00")} set HUEDevice3 off
bzw.
DEF        *{sunrise("REAL",0,"4:00","09:00")}

Lt Wiki https://wiki.fhem.de/wiki/SUNRISE_EL wird standardmäßig mit dem Parameter "CIVIL" entsprechend "HORIZON=-6.0" gerechnet.
ZitatIm FHEM-Standard wird der sogenannte bürgerliche Sonnenuntergang/-aufgang genutzt, der als Sonnenstand 6 Grad unter der Horizontalen definiert ist (entspricht HORIZON=-6.0).

Die Angabe von "REAL" entspricht "HORIZON=0.0".
Daher die beiden unterschiedlichen Zeitangaben.

Norbert

Dracolein

#3
Zitat von: OdfFhem am 04 Januar 2020, 03:01:40
@Dracolein / FTUI

Wenn die separate Variable nur für FTUI verwendet würde, bräuchte man diese eigentlich nicht.

Stattdessen könnte man das FTUI-Widget "classchanger" verwenden, um eine zustandsabhängige Darstellung umzusetzen.

Dann könnte man z.B. bei ausgeschaltetem Nachtlicht eine grün eingefärbte Einschaltzeit und bei eingeschaltetem Nachtlicht eine rot eingefärbte Ausschaltzeit darstellen ...
Ja, wird ausschließlich für FTUI benötigt. Danke für den Tip, das werde ich recherchieren.

edit:
Habe das Widget mal gegoogelt und versucht, seine Möglichkeiten für mein Vorhaben nachzuvollziehen. Soweit ich sehe, kann ich lediglich 1 Device definieren und davon 1 Reading definieren, was ich auslesen möchte. Aber ich bäruchte eigentlich die Möglichkeit 2 verschiedene Readings aus 2 unterschiedlichen Devices auszulesen und diese Info Zustandsabhängig darzustellen. Oder habe ich einen Denkfehler?

Klar ist mir, dass ich die Darstellung abhängig vo, Schaltzustand der Steckdose machen kann (State = on / off). Wenn steckdose=on kann ich eine eigene CSS-Klasse definieren, ebenso für steckdose=off. Aber dort kann ich imho lediglich CSS Styles festlegen, jedoch keinen veränderlichen Inhalt wie die Uhrzeit des nächst geplanten Schaltvorgangs?




Zitat von: Nobbynews am 04 Januar 2020, 06:38:42
Die unterschiedlichen Zeiten ergeben sich aus den beiden nicht identischen Definitionen.

DEF        *{sunrise(0,"05:30","8:00")} set HUEDevice3 off
bzw.
DEF        *{sunrise("REAL",0,"4:00","09:00")}

Lt Wiki https://wiki.fhem.de/wiki/SUNRISE_EL wird standardmäßig mit dem Parameter "CIVIL" entsprechend "HORIZON=-6.0" gerechnet.
Die Angabe von "REAL" entspricht "HORIZON=0.0".
Daher die beiden unterschiedlichen Zeitangaben.

Norbert

Ebenfalls danke Norbert. Das von Dir erwähnte Zitat hatte ich nicht gesehen.
Das bedeutet, ich müsste beim Nachtlicht einfach die Definition modifizieren in
*{sunrise("REAL",0,"05:30","8:00")} set HUEDevice3 off
und die Schaltzeit müsste identisch zur FTUI-Sonnenaufgangszeit sein.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

OdfFhem

@Dracolein / FTUI

Meine Idee war folgende:

Ich definiere jeweils ein z.B. label-Widget für Einschalt- bzw. Ausschaltzeit.

Jedes dieser label-Widgets wird von einem classchanger-Widget (device entspricht Nachtlicht) umgeben. Abhängig vom Schaltzustand wird die hide-Klasse gesetzt.

Zu sehen sollte dann nur eine der beiden Zeiten sein.

Nobbynews

Das sollte so passen.
Stimmen denn die Zeiten jetzt überein??

Dracolein

Moin zusammen, ja die Zeiten stimmen jetzt überein.
Ich werde mich nun mal an die Idee von @OdfFhem machen
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Leider scheitere ich irgendwo mit dem Paratemer "hide", aber ich weiß trotz Fehlersuche und Recherche nicht so wirklich warum. Zwei Varianten habe ich zu Testzwecken erstellt.

Variante 1 mit classchanger Widget um ein späteres Label Widget:


        <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="1" data-get-off="0" data-on-class="border-red" data-off-class="border-yellow">
        <div data-type="label">eingeschaltet</div>
        </div>
       
        <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="0" data-get-off="1" data-on-class="border-blue" data-off-class="border-green">
        <div data-type="label">ausgeschaltet</div>
        </div>

Die farbigen Rahmen sind zu Testzwecken drin und hier funktioniert die Farbumschaltung bei Änderung des Readings perfekt.
Wenn ich jedoch bei data-off-class="autohide" reinschreibe, wird nichts versteckt, sondern weiterhin angezeigt.

Die zweite Variante fand ich im Forum, dass man den Data-type="label" auch dafür nutzen können sollte.

<div data-type="label" data-device="HUEDevice3" data-get="onoff" data-hide="onoff" data-hide-on="1" data-hide-off="0">eingeschaltet</div>
<div data-type="label" data-device="HUEDevice3" data-get="onoff" data-hide="onoff" data-hide-on="0" data-hide-off="1">ausgeschaltet</div>

Hier jedoch wird in FTUI gar nicht mein Text zwischen den div-Elementen dargestellt, sondern lediglich 1:1 der Wert des Readings, d.h. entweder sehe ich an der Stelle eine "1" oder eine "0".
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

OdfFhem

@Dracolein

Folgendes liefert bei mir das "gewünschte" Ergebnis:

    <div data-type="classchanger" data-device="ftuitest" data-get="logi4test" data-get-on="1" data-off-class="hide">
      <div data-type="label">eingeschaltet</div>
    </div>
    <div data-type="classchanger" data-device="ftuitest" data-get="logi4test" data-get-on="1" data-on-class="hide">
      <div data-type="label">ausgeschaltet</div>
    </div>


class autohide
Zitat... versteckt das Element, wenn das angegebene Reading ungültig ist ...

class hide
Zitat... Zeigt das Element nicht an und reserviert auch keinen Platz dafür ...

OdfFhem

@Dracolein

Die reine label-Variante würdest Du ja vermutlich sowieso eher auf diese Art verwenden, oder?

    <div data-type="label" data-device="myMqttGenericBridge" data-get="outgoing-count" data-color="green" data-hide="ftuitest:logi4test" data-hide-on="0" data-hide-off="1">
    </div>
    <div data-type="label" data-device="myMqttGenericBridge" data-get="outgoing-count" data-color="red" data-hide="ftuitest:logi4test" data-hide-on="1" data-hide-off="0">
    </div>

Dracolein

Ich habs hinbekommen mit weniger definierten Paratemern, analog Deinem Beispiel:


       <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="1"  data-on-class="hide">
        <div data-type="label">ausgeschaltet</div>
        </div>
       
        <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="0" data-on-class="hide">
        <div data-type="label">eingeschaltet</div>
        </div>


Damit sehe ich entweder den Text "eingeschaltet" oder den Text "ausgeschaltet" in Abhängigkeit des Device-Status. So war es gewünscht, cool.
Jetzt kann ich die Text-Platzhalter dekorieren
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Nachtrag:

siehe Screenshot, so schaut es nun aus.  8)
Die dargestellte Uhrzeit wechselt entsprechend zwischen Aus- und Einschaltzeit, je nach Zustand der Steckdose.


            <div data-type="label" class="bottom-space small darker">Nächste Schaltzeit:</div>
            <!-- Nachtlicht Zeitanzeige --> 
            <!-- wird angezeigt wenn Nachtlicht an ist -->
            <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="1"  data-on-class="hide">
            <div data-type="label" data-device="Nachtlicht_2OG_Ein" data-get="NTM" data-unit="Uhr" data-substitution="toString().substr(0,5)" class="darker big"></div>
            </div>
            <!-- wird angezeigt wenn Nachtlicht aus ist -->
            <div data-type="classchanger" data-device="HUEDevice3" data-get="onoff" data-get-on="0" data-on-class="hide">
            <div data-type="label" data-device="Nachtlicht_2OG_Aus" data-get="NTM" data-unit="Uhr" data-substitution="toString().substr(0,5)" class="darker big"></div>
            </div>             


Vielen Dank in die Runde
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Ich möchte mich nochmal melden und hätte eine weitere Frage zu diesem Thema. Und zwar möchte ich in Touch UI einen Switch einbauen, mit dem ich die hier gebastelte Nachtlicht-Automatik aktivieren oder deaktivieren kann. Der Switch ist da und schaltet zunächst ein Dummy-Device namens "Automatikschalter".

Aber wie verknüpfe ich nun diese beiden Dinge miteinander? Umgangssprachlich weiß ich was zu tun wäre: Es braucht zum Einschalten des Nachtlichtes neben der passenden Uhrzeit eine Bedingung, wo abgefragt wird, ob der state des Dummy = on ist sozusagen.

Ich bin auf das DOIF Modul aufmerksam geworden, also zum Beispiel als erster Gedanke sowas hier:

define Nachtlichtautomatik_ON DOIF ([Automatikschalter:"on"]) and (???) (set HUEDevice3 on)

Neben sicherlich diversen Syntax-Fehlern stellen mich die 3 Fragezeichen vor mein gedankliches Hauptproblem. Was ist die zweite Bedingung, also die besagte Einschaltuhrzeit, die sich täglich neu errechnet? Im Moment wird das Nachtlicht durch je 1 at-Device aktiviert bzw. deaktiviert, das at zum einschalten sieht so aus:

Internals:
   COMMAND    set HUEDevice3 on
   DEF        *{sunset("REAL",0,"19:00","22:00")} set HUEDevice3 on
   FUUID      5e0fb298-f33f-4dec-3cc3-549642ac1dec174b
   NAME       Nachtlicht_2OG_Ein
   NR         62
   NTM        19:00:00
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 19:00:00
   TIMESPEC   {sunset("REAL",0,"19:00","22:00")}
   TRIGGERTIME 1581098400
   TRIGGERTIME_FMT 2020-02-07 19:00:00
   TYPE       at
   READINGS:
     2020-02-06 19:00:00   state           Next: 19:00:00
Attributes:
   room       Befehle



Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;