ReadingsGroup: Unterschied zwischen den Versionen

Aus FHEMWiki
Zeile 545: Zeile 545:


*code für unterschiedliche readings kann man auch im mapping schon aufteilen:
*code für unterschiedliche readings kann man auch im mapping schon aufteilen:
  <code>attr <name> valueStyle { SuperE5 => {perl code}, Diesel => {perl code} }</code>
  <code>attr <name> valueStyle { SuperE5 => '{perl code}', Diesel => '{perl code}' }</code>


*Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:
*Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:

Version vom 23. Juli 2014, 08:29 Uhr


readingsGroup
Zweck / Funktion
Einfache zusammenfassende Darstellung von Informationen über mehrere Geräte
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Modulname 33_readingsGroup.pm
Ersteller Andre / justme1968
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Das Fhem-Hilfsmodul readingsGroup bietet eine einfache Möglichkeit, readings und internal values von einem oder mehreren Devices darzustellen und flexibel zu formatieren.

Hier soll eine Sammlung von Beispielen zur Verwendung der readingsGroup mitsamt der zugehörigen Screenshots entstehen.

Definition

Siehe commandref.

Attribute

Weitergehende Erläuterungen zu einzelnen Attributen:

noheading

ReadingsGroup: rechts mit "noheading" Attribut, links der anklickbare Titel

Das Attribut noheading führt dazu, dass der Alias der ReadingsGroup nicht mehr als Titel angezeigt wird. Das kann wünschenswert sein, wenn die ReadingsGroup auf einer Dashboard-Seite angezeigt werden soll, hat allerdings den Nachteil, dass die Detail-Ansicht der ReadingsGroup nicht mehr über einen Klick auf den Titel aufgerufen werden kann. Der Einstellungsdialog der ReadingsGroup ist dann nur noch (z. B.) über

  • einen "Probably associated with"-Link eines anderen Objekts oder über
  • manuelle Modifikation der URL eines anderen Objekts (http:.../fhem?detail=<objektname>)

erreichbar.

Beispiele

Achtung: Die Beispiele enthalten keine Maskierungen oder Verdoppelungen für ; und Zeilenende, sondern sind so angegeben, wie sie in Fhemweb, in der command box oder nach Klick auf DEF eingegeben werden. Beim manuellen Einfügen in eine Konfigurationsdatei sind diese Maskierungen oder Verdoppelungen natürlich vorzunehmen.

Einfache Auswahl über Reading-Namen

Definition Erläuterungen Aussehen
define battStatus readingsGroup .*:[Bb]attery Alle readings mit Namen Battery oder battery von allen Devices.
RgBattery.png
attr battStatus alias FHT Batteriestatus Der Alias wird als Zeilentitel verwendet
attr battStatus mapping %ROOM Mapping %ROOM führt dazu, dass der Raumname als Zeilentitel angezeigt wird.

Auswahl über Reading-Namen, Status als Symbol dargestellt

Definition Erläuterungen Aussehen
define rg_battery readingsGroup .*:battery Alle readings mit Namen battery von allen Devices.
RgBattery2.png
attr rg_battery alias Batteriestatus Der Alias wird als Überschrift verwendet
attr rg_battery valueIcon {'battery.ok' => 'batterie', 'battery.low' => 'batterie@red'} Statt der reading Werte "ok" und "low" soll ein Icon angezeigt werden.
attr rg_battery commands { "battery.low" => "set %DEVICE replaceBatteryForSec 60" } Für LaCrosse devices kann man beim Klick auf ein rotes "battery low icon" direkt replaceBatteryForSec setzen.

Reading-Werte zuordnen (Icon / Text)

Definition Erläuterungen Aussehen
define rg readingsGroup Contact.Dachboden_gross:sensed.* Alle sensedreadings des Contact.Dachboden_gross device.
RgFenster.png
attr rg mapping { 'sensed.A' => 'links', 'sensed.B' => 'rechts' } Die Zuordnung rechts/links
attr rg valueFormat {($VALUE eq '1')?"fts_window_roof":"fts_window_roof_open_2"} Die Zuordnung von reading Wert zu Icon Namen.
attr rg_battery valueIcon %VALUE Statt des reading Werts soll ein Icon angezeigt werden.

Formatvorgabe für Ausgabewerte

Definition Erläuterungen Aussehen
define TempHygro readingsGroup TYPE=CUL_WS:temperature,humidity,dewpoint Alle readings mit Namen temperature, humidity, dewpoint von allen Devices des Typs CUL_WS
S300TH-Werte in einer readingsGroup
attr TempHygro alias Temperatur / rel. Feuchte / Taupunkt Der Alias der readingsGroup wird als Überschrift verwendet
attr TempHygro mapping %ALIAS Mapping %ALIAS führt dazu, dass der Alias des Geräts als Zeilentitel angezeigt wird.
attr TempHygro valueFormat { temperature => "%.1f&deg;C", humidity => "%.1f %%", dewpoint => "%.1f&deg;C"} Formatierung der Ausgabewerte. Achtung: "%" die in der Ausgabe erscheinen sollen, müssen verdoppelt werden!

Ausgabestil (hier rechtsbündig)

Definition Erläuterungen Aussehen
define Wetter readingsGroup WetterXXX:<%temp_temperature>,<Temperatur>,temperature WetterXXX:<%weather_humidity>,<Luftfeuchte>,humidity WetterXXX:<%weather_baraometric_pressure>,<Luftdruck>,pressure

Die readings mit Namen temperature, humidity und pressure vom Device WetterXXX jeweils mit einem Icon und einem Label davor.
RgWetter.png
attr Wetter valueFormat { temperature => '%1.f &deg;C', humidity => '%1.f %%', pressure => '%i mbar' } Die Formatierung der Readingswerte
attr Wetter valueStyle style="text-align:right" Die Readings sollen rechtsbündig dargestellt werden.

Internal Value ausgeben

Diese Beispiel könnte entfallen (nächstes Beispiel ist sehr ähnlich; es wird lediglich ein weiterer Wert ausgegeben).

Definition Erläuterungen Aussehen
define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI Den cul_RSSI Wert aller Devices die einen solchen haben anzeigen.
Achtung: "internal values" werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.
RgculRSSI.png

Internal Values ausgeben

Definition Erläuterungen Aussehen
define culRSSI readingsGroup cul_RSSI=.*:+cul_RSSI,+cul_TIME Den cul_RSSI Wert mit der zugehörigen Zeit aller Devices die einen solchen haben anzeigen.
Achtung: "internal values" werden nicht per longpoll aktualisiert, sondern nur beim Seitenaufbau.
"Internal Values" werden durch das vorangestellte + (Pluszeichen) identifiziert.
RgculRSSI2.png

Alle Readings eines Gerätes, mit Ausnahme von...

Definition Erläuterungen Aussehen
define Systemstatus readingsGroup sysstat Alle readings des sysstat Device
RgSysstat.png
attr Systemstatus nostate 1 Ohne state
attr Systemstatus notime 1 Ohne readings timestamp
attr Systemstatus mapping {'load' => 'Systemauslastung', 'temperature' => 'Systemtemperatur in &deg;C'} Die Zuordnung der reading Namen zu den Zeilentiteln

Anzeige auf einem Floorplan

Definition Erläuterungen Aussehen
define Heizung readingsGroup t(1|2|3):temperature Die Temperatur readings der Devices t1, t2 und t3
RgHeizung.png
attr Heizung mapping {'t1.temperature' => 'Vorlauf', 't2.temperature' => 'R&ücklauf', 't3.temperature' => 'Zirkulation'} Die Zuordnung der reading Namen zu den Zeilentiteln
attr Heizung nameStyle style="text-align:left" Zeilentitel linksbündig wegen floorplan
attr Heizung style style="font-size:20px;color:lightgray" Großer Font und Farbe passend für den floorplan
attr Heizung notime 1 Ohne readings timestamp
attr Heizung valueFormat : %.1f &deg;C Doppelpunkt zwischen Zeilentitel und Wert, eine Nachkommastelle plus Einheit

Schriftgrößen, Farben, Icons

Definition Erläuterungen
Schriftgröße, Farbe, Icons...
define Verbrauch readingsGroup TYPE=PCA301:state,power,consumption Die readings state, power und consumption aller PCA301 Devices mit einer Zeile pro Device.
attr Verbrauch mapping %ROOM %ALIAS Der Raumname und der Alias werden als Zeilentitel verwendet
attr Verbrauch nameStyle style="font-weight:bold" Der Zeilentitel soll fett sein
attr Verbrauch style style="font-size:20px" Alles in einem größeren Font
attr Verbrauch valueFormat {power => "%.1f W", consumption => "%.2f kWh"} Die Formatierung für die power und consumption readings: eine Nachkommastelle plus Einheit.
attr Verbrauch valueIcon { state => '%devStateIcon' } Für die Dosen, die schaltbar sind, soll das anklickbare device icon gezeigt werden.
attr Verbrauch valueStyle {($READING eq "power" && $VALUE > 40)?'style="color:red"':'style="color:green"'} Wenn das power reading >40 ist, soll es in rot angezeigt werden, alle anderen Werte und readings in grün

Wertabhängige Farbgebung

Definition Erläuterungen
Wertabhängige Farben
Andere Werte - andere Farben
define wzTemperaturenRG readingsGroup Aussen:,<Temperatur>,temperature,<Luftfeuchte>,humidity Wohnzimmer:,<Temperatur>,temperature,<Luftfeuchte>,humidity Kasten_E_Geraete:,<Temperatur>,temperature,<Luftfeuchte>,humidity Die readings temperatur und humidity der Devices Aussen, Wohnzimmer und Kasten_E_Geraete in einer Zeile pro Device.
attr wzTemperaturenRG group 3. Temperaturen Die readingsGroup kommt in eine Gruppe
attr wzTemperaturenRG noheading 1 noheading
attr wzTemperaturenRG nostate 1 nostate
attr wzTemperaturenRG notime 1 notime
attr wzTemperaturenRG valueFormat {temperature => "%.1f °C", humidity =>"%.1f %%" } Die Formatierung für die temperatur und humidity readings: eine Nachkommastelle plus Einheit.
attr wzTemperaturenRG valueStyle { if($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE > 30) { 'style="color:red"'}elsif($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE > 20) { 'style="color:orange"'}elsif($DEVICE eq "Aussen" && $READING eq "temperature" && $VALUE < 5) { 'style="color:blue"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE > 23) { 'style="color:red"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE > 21) { 'style="color:orange"'}elsif($DEVICE eq "Wohnzimmer" && $READING eq "temperature" && $VALUE < 20) { 'style="color:blue"'}elsif($DEVICE eq "Kasten_E_Geraete" && $READING eq "temperature" && $VALUE > 30) { 'style="color:red"'}elsif($DEVICE eq "Kasten_E_Geraete" && $READING eq "temperature" && $VALUE > 28) { 'style="color:orange"'}elsif($READING eq "humidity" && $VALUE > 65) { 'style="color:red"'}elsif($READING eq "humidity" && $VALUE > 60) { 'style="color:orange"'}else{'style="color:green"'} } Diverse Farbkombinationen sind möglich

Enigma Receiver

Definition Erläuterungen
Wertabhängige Farben
Wertabhängige Farben
define wzReceiverRG readingsGroup wzReceiver:,<Aktuell>,eventtitle,<Rest>,eventremaining_hr,<Dauer>,eventduration_hr wzReceiver:<Beschreibung>,eventdescription wzReceiver:,<Nächste>,eventtitle_next,<Start>,eventstart_next_hr,<Dauer>,eventduration_next_hr wzReceiver:,<HDD Kapazität>,hdd1_capacity,<Frei>,wzReceiver:hdd1_free wzReceiver:,<Lautstärke>,volume,<HDD>,hdd1_capacity,<Frei>,hdd1_free Mehrere readings des Device wzReceiver in mehreren Zeilen. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke, mute angezeigt. Farbige Anzeige des freien Speicherplatzes

Benötigt: ENIGMA2 Receiver, 70_ENIGMA2.pm - Siehe: Enigma2 Receiver (Dreambox, VUplus etc.) steuern

attr wzReceiverRG group Fernseher Receiver Die readingsGroup kommt in eine Gruppe
attr wzReceiverRG mapping &nbsp; mapping wird auf &nbsp; (Leerzeichen) gesetzt, damit der Device Name nicht angezeigt wird
attr wzReceiverRG noheading 1 noheading
attr wzReceiverRG nostate 1 nostate
attr wzReceiverRG notime 1 notime
attr wzReceiverRG valueColumns { eventdescription => 'colspan="4"' } Die Beschreibung soll über 4 Spalten gehen
attr wzReceiverRG valueFormat { wzReceiverRGvalueFormat($DEVICE,$READING,$VALUE);; } Die Formatierung wird in die 99_myUtils.pm ausgelagert. Siehe: 99 myUtils anlegen
attr wzReceiverRG valueStyle { if($READING eq "hdd1_free" && $VALUE < 200){ 'style="color:red"' }elsif( $READING eq "hdd1_free" && $VALUE < 500 ){ 'style="color:orange"' }elsif( $READING eq "volume" && ReadingsVal($DEVICE, "mute", "") eq "on" ){ 'style="color:red"' }else{ 'style="color:green"' } } Diverse Farbkombinationen sind möglich. Wenn der Receiver auf mute ist, wird anstatt der Lautstärke mute angezeigt.
sub wzReceiverRGvalueFormat($$$)
{
  my ($DEVICE,$READING,$VALUE) = @_;

  if($READING eq 'hdd1_capacity') { 
    return "%.2f MB";
  } elsif( $READING eq 'hdd1_free') {
    return "%.2f MB";
  } elsif( $READING eq 'volume' ) {
    if( ReadingsVal($DEVICE, "mute", "") eq "on") {
      return "mute";
    } else {
      return "%i %%";
    }
  }
}
Dieser Teil kommt in die 99_myUtils.pm

Heizungswerte inklusive Batterie- und Fensterstatus

Definition Erläuterungen
Heizungswerte inklusive Batterie- und Fensterstatus
define Heizungswerte readingsGroup <%sani_heating>,< >,<Act>,<Soll>,<Ist> TYPE=FHT:actuator,desired-temp,measured-temp,<%18>,<%20>,<%22>,window,battery Diverse readings aller Devices des Typs FHT.
attr Heizungswerte commands { 'Heizungswerte.18' => 'set $DEVICE desired-temp 18', 'Heizungswerte.20' => 'set $DEVICE desired-temp 20', 'Heizungswerte.22' => 'set $DEVICE desired-temp 22' } Die Links/Kommandos die hinter den 18, 20 und 22 liegen sollen.
attr Heizungswerte nameStyle style="color:yellow;font-weight:bold" Die Überschriften sollen gelb sein.
attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'} Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.

Heizungswerte inklusive Ventilposition

Definition Erläuterungen
Heizungswerte inklusive Statusinformationen (MAX!)
define Heizungswerte readingsGroup <%sani_heating>,<Ventil>,<Soll>,<Ist>,<MaxV>,<GID>,<Mode>,<Batterie> type=CUL_HM:ValvePosition,desired-tempe,measured-temp,R-valveMaxPos,groupid,mode,battery Diverse readings aller Devices des Typs MAX.
attr Heizungswerte mapping %ROOM Die Raumnamen werden angezeigt.
attr Heizungswerte nameStyle style="color:yellow;font-weight:bold" Die Überschriften sollen gelb (fett) sein.
attr Heizungswerte room Heizung Die "readingsgroup" wird dem Ruam "Heizung" zugeordnet.
attr Heizungswerte valueFormat {temperature => "%.0f °C", desiredTemperature => "%.0f °C", valveposition =>"%.0f %%",maxValveSetting =>"%.0f %%" } Es wird noch die Einheit °C hinter den Temperaturwerten angezeigt.
attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red'} Für den Batterzustand werden Icons anstatt Klartextwerte genommen!
attr Heizungswerte valueStyle { if($READING eq "temperature" && $VALUE > 20){ 'style="color:green;;font-weight:bold"' }elsif( $READING eq "temperature" && $VALUE <= 20 ){ 'style="color:blue"' }elsif( $READING eq "temperature" && $VALUE > 23 ){ 'style="color:red"' }else{ 'style="color:gray"' } } Die Temperaturwerte werden abhängig vom Wert farbig dargestellt.
attr Heizungswerte valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'} Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.


Heizungswerte, Status und Regelmöglichkeit

Definition Erläuterungen
Anzeige + Regelmöglichkeit
define Heizungswerte2 readingsGroup <%sani_heating>,< >,<Act>,<Soll>,<Ist> TYPE=FHT:actuator,desired-temp,measured-temp,<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-temp>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-temp>,window,battery Diverse readings aller Devices des Typs FHT.
attr Heizungswerte2 nameStyle style="color:yellow;font-weight:bold" Die Überschriften sollen gelb sein.
attr Heizungswerte2 valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red', 'window.closed' => 'fts_window_1w@lightgreen', 'window.open' => 'fts_window_1w_open@red'} Für den Batteriestand und den Zustand der Fenster sollen jeweils Icons angezeigt werden.
attr Heizungswerte2 valueStyle {($VALUE eq "00")?'style="visibility:hidden"':} Nach dem Einstellen den Wert wieder ausblenden.
#Heizung regeln in readingsGroup
sub
myUtils_HeizungUpDown($$)
{
  my($DEVICE,$CMD) = @_;
 
  my $icon = $CMD;
  my $VALUE = ReadingsVal($DEVICE,"desired-new","20" );
  $VALUE = ReadingsVal($DEVICE,"desired-temp","20" )
     if( !$VALUE || $VALUE == 0 );
  my $link;
 
  if( $CMD eq "up" ) {
    $icon = "control_arrow_upward";
    $VALUE += 1;
 
    if( $VALUE <= 24 ) {
      $icon .= "\@red";
      $link = "setreading $DEVICE desired-new $VALUE";
    }
  } elsif( $CMD eq "down" ) {
    $icon = "control_arrow_downward";
    $VALUE -= 1;
 
    if( $VALUE >= 18 ) {
      $icon .= "\@blue";
      $link = "setreading $DEVICE desired-new $VALUE";
    }
  }
 
  my $notify = "notifyHeizungUpDown";
  if( !defined($defs{$notify}) ) {
    CommandDefine(undef,
                   "$notify notify .*:desired-new.* "
                   ."{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }" );
  }
 
  my $ret = "%$icon";
  $ret .= "%$link" if( $link );
 
  return $ret;
}
sub
myUtils_HeizungUpDownNotify($$)
{
  my($DEVICE,$VALUE) = @_;
 
  return if( $VALUE == 0 );
 
  my $at = "triggerHeizungUpDown_$DEVICE";
  CommandDelete(undef, $at) if( defined($defs{$at}) );
  CommandDefine(undef,
                 "$at at +00:00:03 "
                 ."{my \$v = ReadingsVal(\"$DEVICE\",\"desired-new\",undef);"
                 ."fhem(\"set $DEVICE desired-temp \$v\") if( \$v );"
                 ."fhem(\"setreading $DEVICE desired-new 00\");}" );
 
  return undef;
}

Dieser Teil kommt in die 99_myUtils.pm: Hiermit werden die Icons zum Ändern der gewünschten Temperatur dargestellt und im Bereich >=18 und <= 24 Grad anklickbar gemacht. Zwischen den Pfeilen wird der gerade eingestellte Wert angezeigt. Wenn dieser drei Sekunden nicht mehr geändert wurde wird die desired-temp auf diesen Wert gesetzt und die Anzeige zwischen den Pfeilen ausgeblendet.

Readings aus zusätzlichen Devices

Im folgenden Beispiel wird gezeigt wie sich Readings zusätzlicher Devices zu einer Zeile mit mehreren Readings hinzufügen lassen. Diese zusätzlichen Devices können z.b. die unterschiedlichen Channel eines HomeMatic Gerätes sein. Im folgenden Beispiel wird der Name des zugehörigen Geräts dynamisch bestimmt.

Definition Erläuterungen
Anzeige + Regelmöglichkeit
define myTemp readingsGroup <Raum>,<Tist>,<Tsoll>,<Mode>,<Tnight>,<Tday>,<Hum>,<BatTC>,<Vist>,<Vsoll>,<Verr>,<BatVD> Thermostat.(WZ|OZ|AZ|Bad|Kueche|SZ|GZ|Bad.OG):measured-temp,desired-temp,controlMode,night-temp,day-temp,humidity,battery,ValvePosition@{valveOfDevice($DEVICE)},ValveDesired@{valveOfDevice($DEVICE)},R-valveErrorPos@{valveOfDevice($DEVICE)},battery@{valveOfDevice($DEVICE)} Broetje:ToutIst Diverse Readings aller Thermostat Devices und des jeweils zugehörigen Ventilanriebs.
attr myTemp mapping { 'Broetje' => 'Garten','Thermostat.AZ' => 'EG Arbeitszimmer','Thermostat.SZ' => 'OG Schlafzimmer','Thermostat.WZ'=>'EG Wohnzimmer','Thermostat.Kueche' => 'EG Küche','Thermostat.GZ' => 'OG Gästezimmer','Thermostat.Bad' => 'EG Bad','Thermostat.Bad.OG' => 'OG Bad','Thermostat.OZ' => 'EG Kaminzimmer','desired-temp' => '' } Die Benennung der Zeilentitel (Das ist je nach Konfiguration auch über $ALIAS und/oder $ROOM lösbar).
attr myTemp commands { 'desired-temp' => 'desired-temp:' } desired-temp soll per dropDown einstellbar sein.
attr myTemp nameStyle style="color:yellow" Die Überschriften sollen gelb sein.
attr myTemp valueIcon {'battery.ok' => 'batterie@lightgreen', 'battery.low' => 'batterie@red'} Für den Batteriestand sollen jeweils Icons angezeigt werden.
attr myTemp valueFormat { 'measured-temp' => "%0.1f &deg;C",'ToutIst' => "%.1f &deg;C",'night-temp' => "%.1f &deg;C",'day-temp' => "%.1f &deg;C",'humidity' => "%.0f

%%",'ValvePosition' => "%.0f %%",'ValveDesired' => "%.0f %%",'R-valveErrorPos' => "%.0f %%" }

Die Formatierung der Werte.
#namen des ventil device aus thermostat device ableiten
sub valveOfDevice ($) {
  my ($DEVICE) = @_;
 
  if ($DEVICE =~ m/AZ/) {
 	return "Ventil.".substr($DEVICE,11).".Nord";
  } else {
 	return "Ventil.".substr($DEVICE,11);  	
  }
}
Dieser Teil kommt in die 99_myUtils.pm: Hier wird aus dem Namen des Thermostaten der Name des zugehörigen Ventilantriebs abgeleitet.

Da im {...} Teil des <reading>@<device> Arguments keine Leerzeichen oder Kommas vorkommen dürfen ist er in der Regel das Einfachste die Funktionalität wie in diesem Beispiel in eine eigene Routine auszulagern. Mit ein paar 'Tricks' lässt es sich aber manchmal auch ohne Leerzeichen oder Kommas lösen und dann direkt in die Definition schreiben:...,ValvePosition@{$DEVICE=~s/Thermostat/Ventil/;$DEVICE;},...

Dynamische Inhalte

readingsGroup mit umschaltbarem Inhalt 1
readingsGroup mit umschaltbarem Inhalt 2

Es ist möglich, den in einer readingsGroup dargestellten Inhalt dynamisch von zusätzlichen Bedingungen abhängig zu machen. Im folgenden Beispiel lässt sich einstellen, dass nur die Devices angezeigt werden, die einen bestimmten Zustand (hier: on/off, open/tilted/closed) haben. Hier wird zum Umschalten ein dummy, der direkt über der readingsGroup dargestellt wird, verwendet. Über das links und/oder commands lässt sich auch eine Darstellung erzeugen, bei der das Umschalten direkt innerhalb der readingsGroup möglich ist.

define LXrg dummy
attr LXrg group -
attr LXrg setList mode1:on,off mode2:open,closed,tilted
attr LXrg stateFormat 1=mode1 2=mode2
attr LXrg webCmd mode1:mode2

define rg readingsGroup Window.*:state Light.*:state
attr rg group -
attr rg valueFormat { return $VALUE if ( $VALUE eq ReadingsVal("LXrg","mode1","") || $VALUE eq ReadingsVal("LXrg","mode2","") );; return undef;;}

define Watch_LX notify LX.*:.* {my $value = ReadingsVal($NAME,'state','');;;;fhem("setreading $NAME $value")}


Enable/Disable Button am Beispiel eines WeekdayTimer

Dieses Beispiel zeigt die Anwendung einer readingsGroup, um im Frontend einen Enable/Disable Button für ein Objekt darzustellen. Für den WeekdayTimer gibt es hier spezielle Erweiterungen (set Routinen, um das disable Attribut zu setzen, Reading "disabled"). Es gibt aber auch eine allgemeinere Variante (siehe diesen Forumsbeitrag) für alle Objekte, die das FHEM Attribut "disable" unterstützen.

Definition Erläuterungen
Enable/Disable Button
define rg_Timer_Wasser readingsGroup timer_Wasser_..:disabled,+DEF,<{rg_timer_Wasser_show_conditional($DEVICE,"nextUpdate")}@disabled>,<{rg_timer_Wasser_show_conditional($DEVICE,"nextValue")}@disabled> Definition der angezeigten Readings. Das Reading disabled wird mit den u.a. Attributen zum Button, +DEF zeigt die Definition, d.h. die Schaltzeiten, des Timers an. Die Readings nextUpdate und nextValue sollen nur angezeigt werden, falls der Timer aktiv ist. Hierfür sorgt eine Routine rg_timer_Wasser_show_conditional, welche in der 99_myUtils.pm definiert wird. Das abschließende @disabled sorgt dafür, daß der LongPoll Mechanismus die Anzeige sofort ändert, wenn der Button betätigt wird.
attr rg_Timer_Wasser valueFormat { if ( $READING =~ m/.*DEF/ ) { my @text = split(" ", $VALUE); shift @text; return join(" ", @text) }} Der Name des Timers wird aus dem interal Reading "+DEF" vorne abgeschnitten. Damit werden nur die definierten Schaltpunkte angezeigt.
attr rg_Timer_Wasser valueIcon { 'disabled.0' => 'Restart', 'disabled.1' => 'Shutdown' } Die beiden Zustände für den Button werden durch zwei Standard-Icons angezeigt.
attr rg_Timer_Wasser commands { 'disabled.0' => 'set $DEVICE disable', 'disabled.1' => 'set $DEVICE enable' } Toggle-Funktion für den Button. Wenn der Timer aktiv ("disabled.0") sorgt ein Klick auf den Button, daß der Timer deaktiviert wird ("set $DEVICE disable").
sub rg_timer_Wasser_show_conditional($$)
{
  my ($DEVICE,$READING) = @_;
  return ( ReadingsVal($DEVICE, "disabled", "1") eq "0" )? 
     ReadingsVal($DEVICE, $READING, "reading_undef") : "disabled";
}
Dieser Teil kommt in die 99_myUtils.pm: Hiermit wird das übergebene Reading des Timers nur angezeigt, wenn der Timer aktiv ist. Andernfalls wird der String "disabled" stattdessen angezeigt.

Links und Trigger

readingsGroup mit Link

Das PCA301 Beispiel oben lässt sich mit einem ans Ende des define angehängten

<{appendTrigger($DEVICE,"clear","Alle löschen")}>

und der folgenden appendTrigger Definition in 99_myUtils.pm um einen Link erweitern, der ein Event auslöst, an das z.B. ein notify gehängt werden kann, um die Verbrauchszähler der PCA301 Dosen zurückzusetzen.

define clearVerbrauch notify Verbrauch:clear set TYPE=PCA301 clear
use vars qw($FW_ME);
use vars qw($FW_subdir);
sub
appendTrigger($$$)
{
  my ($name,$trigger,$label) = @_; 

  my $ret .= "</table></td></tr>";

  my $link = "cmd=trigger $name $trigger";
  my $txt = "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$link')\">$label</a>";
  $ret .= "<td colspan=\"99\"><div style=\"cursor:pointer;color:#888888;text-align:right\">$txt</div></td>";

  return ($ret,0);
}

Ein weiteres Beispiel für 'custom links und trigger' findet sich im Forum: dort wird damit eine readingsGroup dynamisch umgeschaltet, um nur die eingeschalteten, nur die ausgeschalteten oder alle Lampen anzuzeigen.

Sonstiges

In der Regel werden die Parameter zu einem reading in den mappings unter <$DEVICE> und dann <$DEVICE>.<$READING> und dann unter <$READING>.<$VALUE> gesucht.

Lesbar machen

Für die meisten Attribute gilt:

  • Wenn es komplexer wird ist es einfacher den Code in eine sub in 99_myUtils auszulagern und diese aufzurufen:
 attr <name> valueStyle {myValueToFormat($READING,$VALUE)}
  • code für unterschiedliche readings kann man auch im mapping schon aufteilen:
attr <name> valueStyle { SuperE5 => '{perl code}', Diesel => '{perl code}' }
  • Ifs lassen sich verschachteln und sortieren. So kann die Anzahl der Klammern und Else-Zweige reduziert werden:
if( $READING eq ... ) {
  return xxx if( $VALUE < 1 );
  return yyy if( $VALUE < 1.5 );
  return zzz;
} elsif( $READING eq ... ) {
  ...
}

Da alles lässt sich natürlich auch kombinieren und so viel lesbarer machen als ein einziger langer Bandwurm.

group

Wenn der doppelte Rahmen um eine readingsGroup in eine group stört, lässt er sich mit dem passenden style entfernen:

attr <device> style style="border:0px;background:none;box-shadow:none"