neues Attribut: uiTable - DOIF User Interface, neues Attribut: DOIF_Readings

Begonnen von Damian, 07 Oktober 2017, 23:29:48

Vorheriges Thema - Nächstes Thema

Ellert

Zitat von: Pete37 am 18 Februar 2019, 01:11:38
Sehr schönes Script - kann ich mir die Daten auch irgendwie in die UserReadings meines DOIFs oder eines Dummys importieren?

Im Prinzip ja.
Welche Daten und mit welchem Ziel? Würdest Du das näher erläutern?

Pete37

Zitat von: Ellert am 18 Februar 2019, 09:08:44
Im Prinzip ja.
Welche Daten und mit welchem Ziel? Würdest Du das näher erläutern?
Ja, klar: Ich suche immer noch nach einer eleganten und ressourcenschonenden Variante meine Uhrdarstellung im FLOORPLAN mit frischer Zeit zu füllen. Ich benutze Text für Datum und Uhrzeit und Graphikelemente für Wochentag und Sekunden. Ich kann also nicht so einfach die uiTable-Darstellung verwenden.

Dein Skript scheint keine sonderliche Belastung für mein Fhem darzustellen, obwohl es jede Sekunde aktualisiert. Das erscheint mir vielversprechend! Ich brauche eine Art Sekundenzeiger (derzeit bei mir im 3-Sekunden-Takt), als Lebenszähler und zur Anzeige, dass das System noch läuft und insbesondere die Displays nicht schon wieder stehen geblieben sind.

Alternativ experimentiere ich grad mit dem für mich neu entdeckten Perl-Modus der DOIFs rum, um ein Uhr-DOIF-Modul zu erstellen, was hoffentlich ähnlich ressourcenschonend ist.
Fhem auf Raspberry Pi3 mit Fritzbox inkl. Steckdosen, Philips Hue inkl. Orsam Lightify-Lampen, eq-3 Max!, SONOS, Rollotron Rolläden, Asus ZenPad, Samsung Galaxy xCover 3

Ellert

Das Uhrenscript läuft im Browser, deshalb wird FHEM nicht belastet und nur dann, wenn  der Browser geöffnet ist, also nur wenn z.B. der Floorplan angezeigt wird.
Falls der Browser immer aktiv ist könnte man das ein Javascript schreiben, dass über FW_cmd alle 3 Sekunden mit einem setreading-Befehl ein Reading gesetzt wird, dann überwachst Du, ob das Script im Browser läuft, ob dadurch auch überwacht wird, dass die Anzeige nicht eingefroren ist, müsstest Du ausprobieren.
Im Florplan muss fhemweb.js und das Javascript geladen werden.
https://wiki.fhem.de/wiki/DevelopmentFHEMWEB-API#FW_cmd


Ellert

Mit dem anliegenden Script hast Du einen Startpunkt und kannst testen, ob eine eingefrorene Anzeige auch das Script einfrieren lässt.

Du müsstest einen Dummy anlegen.
defmod device_alive dummy
devicealive.js in dem entsprechenden Floorplanordner speichern
Den Dummy in Floorplan einbinden.
Die Scripte devicealive.js und fhemweb.js in Floorplan einbinden, oder FW_cmd im Floorplan verfügbar machen.

Alternativ zu Floorplan zum Testen, devicealive.js in einer FHEMWEB-Instanz einbinden und devicealive.js vorher nach pgm2 kopieren.
attr WEB JavaScripts pgm2/devicealive.js
und den Dummy im Tablet anzeigen. Wenn die Anzeige einfriert und der Dummy nicht mehr alle 3 Sekunden aktualisiert, könntest Du dieses Prinzip als watchdog verwenden.

Pete37

Interessant! Muss ich mir in Ruhe ansehen - danke schon mal!!
Fhem auf Raspberry Pi3 mit Fritzbox inkl. Steckdosen, Philips Hue inkl. Orsam Lightify-Lampen, eq-3 Max!, SONOS, Rollotron Rolläden, Asus ZenPad, Samsung Galaxy xCover 3

Ellert

Ich bekomme Warnungen beim Auslösen von event_Readings
Zitat2019.04.28 16:29:03.022 1: PERL WARNING: Use of uninitialized value $dev in string eq at ./FHEM/98_DOIF.pm line 914, <GEN10> line 11.
2019.04.28 16:29:03.023 3: etvR: warning in event_Readings: test

Das kann ich nachstellen mit
defmod etvR DOIF {# bla}
attr etvR event_Readings test:{[bla:"x\d+"]?"on":"off"}

defmod bla dummy

setstate bla 2019-04-28 16:25:38 x123 999


Die erste Warnung erscheint einmal, die Zweite bei jedem Auslösen des Readings, z.B. mit dem Befehl
setreading bla x123 9

Damian

Zitat von: Ellert am 28 April 2019, 16:38:44
Ich bekomme Warnungen beim Auslösen von event_Readings
Das kann ich nachstellen mit
defmod etvR DOIF {# bla}
attr etvR event_Readings test:{[bla:"x\d+"]?"on":"off"}

defmod bla dummy

setstate bla 2019-04-28 16:25:38 x123 999


Die erste Warnung erscheint einmal, die Zweite bei jedem Auslösen des Readings, z.B. mit dem Befehl
setreading bla x123 9

Ich habe die aktuelle Version gepatcht.  Ich habe es in meinem produktiven System getestet. Teste es auch mal bei dir.

Zu bedenken ist, dass DOIF_Readings bzw. event_Readings, beim Definieren dieser Attribute schon ausgewertet werden, ebenso bei defmod des DOIF-Gerätes im laufenden Betrieb. In diesen Fällen gibt es natürlich keine FHEM-Events, die Abfrage ist nicht wahr, in deinem Beispiel wird dann das definiertes Reading "test" auf off gesetzt.




Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert


Damian

Zitat von: Ellert am 28 April 2019, 19:42:08
Sieht gut aus, bisher sind keine Warnungen aufgetaucht.
Ok. Ich lasse es bei mir im Live-System zur Sicherheit noch einen Tag laufen, bis ich es einchecke.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Neue korrigierte Version wurde eingecheckt.

Ich habe auch das Inhaltsverzeichnis im Perl-Modus mit Links überarbeitet:

ZitatInhaltsübersicht Perl-Modus

Eigene Funktionen - subs-Block
Eigene Funktionen mit Parametern
Eigener_Namensraum
Spezifische Perl-Funktionen im Perl-Modus:  fhem_set  set_Event  set_State  get_State  set_Reading  get_Reading  set_Reading_Update
Ausführungstimer:  set_Exec  get_Exec  del_Exec
Initialisierung - init-Block
Device-Variablen
Blockierende Funktionsaufrufe
Attribute im Perl-Modus
Anwendungsbeispiele im Perl-Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich habe die Möglichkeiten der Definition einer uiTable erweitert.

Es ist jetzt möglich mit gekapselten Perl-Funktionen für die Definition des Layouts zu arbeiten (eigenes package). Man ist nicht mehr an bestimmte Namensgebung von Funktionen (bisher FUNC_...) gebunden. Die Angabe der Funktion STY kann wegfallen. Die genutzte Perlfunktion für die formatierte Ausgabe kann ein oder zwei Elemente zurückgeben. Der erste Rückgabewert ist der anzuzeigender Wert selbst, der zweite optionale Wert ist das dazugehörige Style (wie bei STY).

Bsp: Farbige Anzeige von Temperatur und Feuchtigkeit mit Hilfe der importierten Perlfunktionen: temp(<temperatur>,<größe>) und hum(<feuchtigkeit>,<größe>)

defmod temperature DOIF ##
attr temperature uiTable {\
package $SELF;;\
$TC{0}="align='center'";;\
}\
\
## Hier werden die benötigten Perlfunktionen importiert\
IMPORT contrib/DOIF/temp_hum.tpl\
\
## Definition der ui-Tabelle\
temp([Aussensensor:temperature],36),hum([Aussensensor:humidity],18)\



Der Inhalt von temp_hum.tpl mit der Definition von temp und hum sieht so aus:

{
package $SELF;
sub temp
{
   my ($temp,$size)=@_;
   return(::FW_makeImage('temp_temperature').$temp."°C","font-weight:bold;font-size:".$size."pt;".temp_style($temp));
}

sub temp_style
{
     my ($temp)=@_;
     if ($temp >=30) {
   return ("color:".::DOIF_hsv ($temp,30,50,20,0,90,95));
     } elsif ($temp >= 10) {
       return ("color:".::DOIF_hsv ($temp,10,30,73,20,80,95)); 
} elsif ($temp >= 0) {
   return ("color:".::DOIF_hsv ($temp,0,10,211,73,60,95));
} elsif ($temp >= -20) {
   return ("color:".::DOIF_hsv ($temp,-20,0,277,211,50,95));
}
}

sub hum
{
    my ($hum,$size)=@_;
    return(::FW_makeImage('temperature_humidity').$hum." %","font-weight:bold;font-size:".$size."pt;color:".::DOIF_hsv ($hum,30,100,30,260,60,90));
}
}



Die Farbgebung orientiert sich am Wert der Temperatur bzw. der Feuchtigkeit, als zweiter Übergabeparameter von temp und hum wird hier im Beispiel die Größe der Anzeige angegeben.

Im Anhang: Anzeige der obigen Definition, neue DOIF-Version zum Testen - sie ist abwärtskompatibel zur bisherigen,und die Definitionsdatei der beiden benutzten Funktionen temp und hum.

Edit: Version eingecheckt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Hier ein Beispiel wie man mit der neuen DOIF-Version die Definition einer farbig anpassbaren Feuchtigkeitsanzeige vereinfachen kann:

bisher:

defmod humidity DOIF ##
attr humidity uiTable {\
sub FUNC_hum\
{\
    my ($hum)=@_;;\
    return ("font-weight:bold;;font-size:12pt;;color:".::DOIF_hsv ($hum,30,100,30,260,60,90));;\
}\
}\
## Anzeige der Feuchtigkeit\
\
STY([TH_DG_HM:humidity]." %",FUNC_hum([TH_DG_HM:humidity]))


Die Vereinfachung der Ausgabe könnte man ggf. nur über ein zusätzliches Template bewerkstelligen.

neu:

defmod humidity DOIF ##
attr humidity uiTable {\
package $SELF;;\
sub hum\
{\
    my ($hum)=@_;;\
    return ($hum." %","font-weight:bold;;font-size:12pt;;color:".::DOIF_hsv ($hum,30,100,30,260,60,90));;\
}\
}\
## Anzeige der Feuchtigkeit \
\
hum([TH_DG_HM:humidity])


Jetzt lässt sich die Ausgabe der formatierten Feuchtigkeit vereinfacht direkt mit Hilfe einer Perlfunktion angeben, hier mit hum(<Feuchtigkeit-Reading>)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Version v0.2 im Post #176 kann nun neben Styles (STY) auch Widgets (WID) über Perlfunktionen abbilden. Dadurch lässt sich die Definitionen von uiTable weiter vereinfachen. Der Einsteiger kann nun vordefinierte Perlfunktionen mit seinem Reading aufrufen, um bedienbare Elemente anzuzeigen. Das dürfte die Hemmschwelle der Nutzung von FHEM-Widgets in uiTable reduzieren.

In der angehängten Datei uiTable.tpl sind folgende Funktionen definiert:

hum (<reading>,<größe>)
temp (<reading>,<größe>)
knob (<reading>)
shutter (<reading>)
switch(<reading>,<icon>)
label (<reading>,<icon>);


Es handelt sich um reine Perlfunktionen ohne spezielle DOIF-Syntax. Sie lassen sich für eigene Bedürfnisse abändern bzw. erweitern. Sie werden über den IMPORT-Befehl importiert und sind innerhalb des benutzten DOIF-Devices in einem package gekapselt. Dadurch kann die Namensgebung der Funktionen kurz gehalten werden, da sie nicht mit anderen Perlfunktionen in FHEM kollidieren können.

Nutzung der obigen Perl-Funktionen in uiTable:

defmod uiTest DOIF ##
attr uiTest room Test
attr uiTest uiTable IMPORT contrib/DOIF/uiTable.tpl\
\
"Feuchtigkeit (dynamische Farbgebung)",hum([TH_DG_HM:humidity],14)\
"Temperatur (dynamische Farbgebung)",temp([TH_DG_HM:measured-temp],24)\
"Temperaturvorgabe (knob - schaltbar)",knob([TH_DG_HM:desired-temp])\
"R_Keller (shutter - schaltbar)",shutter([R_Keller:pct])\
"Aussenbeleuchtung (switch - schaltbar)",switch ([Aussenbeleuchtung],"light_wall_2")\
"Garage (label - nur Anzeige)",label([Garage],"fts_garage_door")\

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Mit der neuen DOIF-Version lässt sich die Rollladensteuerung inkl. GUI (Zustand der Rollläden und manuelles Schalten) recht simpel erstellen. So sieht meine Version z. Zt. aus:

defmod DI_Rollladen DOIF (([Dunkelheit] eq "off" and [06:25-09:00|8]) or [09:00|7]) \
  ((set R_W_S,R_W_W[1-3] on))\
DOELSEIF ([Dunkelheit] eq "on")\
  ##((set R_W_S,R_W_W[1-3] off))
attr DI_Rollladen cmdState oben|unten
attr DI_Rollladen devStateIcon unten:status_night oben:scene_day
attr DI_Rollladen icon fts_shutter_automatic
attr DI_Rollladen uiTable IMPORT contrib/DOIF/uiTable.tpl\
\
"Dachgeschoss"|""\
"R_Dachboden"|shutter([R_Dachboden])\
"erstes Geschoss"|""\
"R_Bad"|shutter([R_Bad:pct])\
"R_Kinderzimmer1_O"|shutter([R_Kinderzimmer1_O:pct])\
"R_Kinderzimmer1_S"|shutter([R_Kinderzimmer1_S:pct])\
"R_Kinderzimmer2_S"|shutter ([R_Kinderzimmer2_S:pct])\
"R_Kinderzimmer2_W1"|shutter ([R_Kinderzimmer2_W1:pct])\
"R_Kinderzimmer2_W2"|shutter ([R_Kinderzimmer2_W2:pct])\
"Erdgeschoss"|""\
"R_Kueche"|shutter([R_Kueche:pct])\
"R_W_S"|shutter([R_W_S:pct])\
"R_W_W1"|shutter([R_W_W1:pct])\
"R_W_W2"|shutter ([R_W_W2:pct])\
"R_W_W3"|shutter ([R_W_W3:pct])\
"Keller"|""\
"R_Keller"|shutter ([R_Keller:pct])



Im Anhang das Ergebnis.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Die vorbereitete uiTable.tpl ist eine schöne Vereinfachung für die Benutzer von DOIF. Hier als Anregung eine verdichtete Anzeige meiner Raumregler, der die Farbgebung nutzt für eine schnelle Info. Abweichend verwende ich den HKnob aus dem FTUI-Projekt.

Beisteuern könnte ich eine Anpassung für einen hochpräzisen CO2-Sensor, mit dem ich im Abluftstrom die notwendige Luftmenge unserer kontrollierten Gebäudelüftung steuere. Sie passt sich dann automatisch der Personenzahl an...

sub FUNC_CO2 {return ("font-weight:bold;font-size:11pt;color:".DOIF_hsv ($_[0],600,1000,122,0,60,90));

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB