Neues Modul readingsGroup

Begonnen von Niko, 24 August 2013, 11:59:11

Vorheriges Thema - Nächstes Thema

vbs

Mal ein Frage bzgl. dynamischen Inhalten:
Ich habe für meine Dreambox die Enigma-readingsGroup aus dem Wiki nachgebaut. Ich habe dann jedoch noch Zeilen für laufende Aufnahmen hinzugefügt. Die sollen jedoch nur angezeigt werden, wenn auch wirklich aufgenommen wird.

In dem man für ein Reading in ValueFormat "undef" zurück liefert, kann man ja Readings dynamisch ausblenden. Geht das denn auch für feste Labels, die man mit "<MeinLabel>" im DEF eingefügt hat?

Also ich würde gerne im Screenshot die unteren Zeilen komplett löschen:
(https://dl.dropboxusercontent.com/u/24641738/fhem/rgenigma.png)

Mein DEF:

wz_dm7020hd:<Status>,state,<Kanal>,channel
wz_dm7020hd:,<Aktuell>,eventtitle,<Rest>,eventremaining_hr,<Dauer>,eventduration_hr
wz_dm7020hd:<Beschreibung>,eventdescription
wz_dm7020hd:,<Nächste>,eventtitle_next,<Start>,eventstart_next_hr,<Dauer>,eventduration_next_hr
wz_dm7020hd:,<HDD Kapazität>,hdd1_capacity,<Frei>,wz_dm7020hd:hdd1_free wz_dm7020hd:,<Lautstärke>,volume,<HDD>,hdd1_capacity,<Frei>,hdd1_free
wz_dm7020hd:,<Nächste&nbsp;Aufname>,recordings_next_name,<Uhrzeit>,recordings_next_hr
wz_dm7020hd:,<Laufende&nbsp;Aufnahme1>,recordings1_name,recordings1_servicename
wz_dm7020hd:,<Laufende&nbsp;Aufnahme2>,recordings2_name,recordings2_servicename
wz_dm7020hd:,<Laufende&nbsp;Aufnahme3>,recordings3_name,recordings3_servicename
wz_dm7020hd:,<Laufende&nbsp;Aufnahme4>,recordings4_name,recordings4_servicename


ValueFormat:
{ if($READING eq 'hdd1_capacity' or $READING eq 'hdd1_free') { return "%.2f";  } elsif( $READING eq 'volume' ) {if( ReadingsVal($DEVICE, "mute", "") eq "on") {return "mute";} else {return "%i %%";}  }elsif ($READING =~ /recordings._.*name/) { return ($VALUE eq '-')  ? undef : $VALUE;}}

justme1968

#1201
@Elektrolurch: du hast recht. die regex matched tatsächlich nicht. state ist aber das einzige reading das diese rekursion erzeugt.

bitte schau mal ob es mit dem update morgen weg ist.

du kannst über commands nicht direkt perl code ausführen. zum einen wird der perl code beim aufbau der reading group ausgwertet und die rückgabe als auszuführende kommando interpretiert und zum anderen musst du immer beachten das client (der web browser) und der server (der fhem prozess) getrennt sind und der web browser nicht direkt perl code im server ausführen kann. d.h. du musst immer vom client an den server senden was der server ausführen soll.

das kann theoretisch auch ein stück perl code sein. aber dann hast du das problem das hier alle möglichen zeichen url escaped werden müssen weil sie in einer url nicht erlaubt sind. aus deinem einfachen
attr myrg commands {'MAN' => '{MeineSub("Param");;}' }
aufruf wird dann das hier:
attr myrg commands {'MAN' => '%7BMeineSub%28%22Param%22%29%3B%3B%7D' }das ist nicht wirklich lesbar.

das encoding könnte man eventuell automatisch machen, ich habe aber keine möglichkeit dem mapping anzusehen ob es den string der ausgeführt wird zurück gibt oder ob der code selber an fhem gesendet werden soll.


@vbs: wenn du statt <MeinLabel> die !MeinLabel variante verwendest wird MeinLabel wie ein normales reading behandelt und alle attribute verhalten sich so wie bei einem reading. d.h du kannst es per valueFormat und undef ausblenden. das ! flag ist um das reading auch dann zu berücksichtigen wenn es im device gar nicht vorhanden ist.

du kannst auch mit setreading im device das entsprechende reading erzeugen und dann wird der wert des readings als text verwendet. damit entfällt das problem mit nicht erlaubten zeichen wie leerzeichen und :.

statt die reading im device zu erzeugen kannst du sie auch in die readingsGroup selber stecken.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Elektrolurch

Hallo Andre,

jetzt habe ich mit meinem Lachen mein WAF erschreckt!

das:
Alle_Fenster_rg:<Ansicht>,Ansicht,<Fenster>

führt jetzt zwar nicht mehr zum Absturz, gibt aber den state "initialized Fenster" zurück!

genau:
Ansicht
Initialized
Fenster
Fenster

Das ersehnte Menü "alle,offene,geschlossene" bleibt noch im "Dunkeln".
Wenn Du da noch mal schauen könntest, was da schief läuft....
(Habe den Gegentest gemacht:
Ein_anderes_Objekt:<Ansicht>,Ansicht,<Fenster>
erzeugt das gewünschte Ergebnis.)
okay, commands und kein perl ...
Dann muss ich eben doch mit trigger und einem Objekt arbeiten, an das ich die Events schicke.

Die !VARS nutze ich auch fleißig, um Ikonen dynamisch ein- und auszublenden.
Über valueFormat und das Rückliefern von undef kann man schon viel machen, bei einer Sache klappt das leidr nicht:

device:rd1,rd2,<{perlcode}>
Da der perlcode nicht über die Regel  von valueFormat abgearbeitet wird, kommt der immer.
Also muss man die Bedingung, mit der etwas ein- und ausgeblendet werden soll, in den perlcode mit zusätzlich implementieren.
-> gleiches wie oben mit den <> - Labeln....

Elektrolurch
configDB und Windows befreite Zone!

Motivierte linke Hände

Sorry, ich versteh's nicht. Vielleicht kann jemand mal bitte mit einem Stemmeisen das Brett vor meinem Kopf entfernen.

define rg_Wetter_Garten readingsGroup <Wert>,<Wert2> <Zeile2_1>,<Zeile2_2>

Funktioniert. Ausgegeben werden 2 Zeilen mit meinem einfallsreichen Text.

define rg_Wetter_Garten readingsGroup <Wert>,<Wert2> <Zeile2_1>,KS300:temperature

führt dazu, dass nur noch "Wert| Wert2" ausgegeben wird. Die 2. Zeile verschwindet. Das Logfile ist leer.

Ein in der Kommandozeile von fhem eingegebenes

{ReadingsVal("KS300","temperature","0")}

ergibt

2.3

Das Reading gibt es also.

Anbei noch ein list auf mein KS300:

Internals:
   CODE       1234
   CUL1_MSGCNT 1503
   CUL1_RAWMSG 810d04xx4027a00171320770004102
   CUL1_RSSI  -89.5
   CUL1_TIME  2015-02-21 20:10:36
   DEF        1234
   IODev      CUL1
   LASTInputDev CUL1
   MSGCNT     1503
   NAME       KS300
   NR         360
   RAINUNIT   255
   STATE      T: 2.3  H: 77  W: 0.0  R: 5.1  IR: no  Wi: 0
   TYPE       KS300
   WINDUNIT   1
   Readings:
     2015-02-21 20:10:36   avg_day         T: 4.0  H: 68  W: 1.7  R: 0.3
     2015-02-21 00:03:15   avg_month       T: 0.6  H: 43  W: 36.4  R: 4.5
     2015-02-21 20:10:36   checksum        2
     2015-02-21 20:10:36   cum_day         2015-02-21 00:03:15 T: 286772  H: 4967726  W: 125876.7  R: 4.8
     2015-02-21 00:03:15   cum_month       7 T: 4.3  H: 303  W: 255.1  R: 4.5
     2015-02-21 20:10:36   dew             -1.30627891427601
     2015-02-21 20:10:36   humidity        77
     2015-02-21 20:10:36   israining       no
     2015-02-21 20:10:36   rain            5.1
     2015-02-21 20:10:36   rain_raw        20
     2015-02-21 20:10:36   rain_raw_adj    20
     2015-02-21 20:10:36   state           T: 2.3  H: 77  W: 0.0  R: 5.1  IR: no  Wi: 0
     2015-02-21 20:10:36   temperature     2.3
     2015-02-21 20:10:36   tsecs           1424545836.75397
     2015-02-21 20:10:36   type_raw        7
     2015-02-21 20:10:36   unknown3        1
     2015-02-21 20:10:36   wind            0.0
     2015-02-21 20:10:36   windIndex       0
Attributes:
   IODev      CUL1
   room       Garten,Cfg_868
   userReadings dew:temperature { my $dp; my $temperature = ReadingsVal($name,"temperature",0); my $humidity = ReadingsVal($name,"humidity",0); my $A = 17.2694; my $B = ($temperature > 0) ? 237.3 : 265.5; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) ); my $e = $humidity/ 100 * $es; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity"; return 0; } my $e1 = $e / 610.78; my $f = log( $e1 ) / $A; my $f1 = 1 - $f; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity"; return 0; } $dp = $B * $f / $f1 ;}


Eigentlich wollte ich eine simple, kleine readingsGroup anlegen, die mir die Werte des KS300 nett formatiert anzeigt. Und ich dachte, das wäre einfach, nachdem ich eine komplexere Group mit meinen diversen Heizungsthermostaten hier schon am Laufen habe... Nun ja.

Bitte: Was mache ich falsch?
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

Elektrolurch

<Wert1>,device:rd

geht glaube ich so nicht. Das device muss immer am Anfang der Zeile stehen
device:<Wert1>,rd

Elektrolurch
configDB und Windows befreite Zone!

Motivierte linke Hände

In der Tat, das klappt - Danke!
FHEM 6 in einer KVM VM mit Ubuntu
HM-CFG-USB2, 2xHM-CFG-HMLAN, HM-HMUARTLGW mit 100+ HomeMatic Devices, Geofencing, Fritzbox, Unifi, HUE, Harmony-Hub, Denon-Receiver-Modul, Calendar, GardenaSmartDevice, Shelly, MQTT (zigbee2mqtt, Tasmota und Shelly) und ein wenig 1Wire.

Jorche

Hallo zusammen,
ich habe die letzten Tage versuch das Beispiel von Andre im Wiki zur Heizungssteuerung http://www.fhemwiki.de/wiki/ReadingsGroup#Heizungsteuerung_f.C3.BCr_HM_Wand-_und_Heizk.C3.B6rperthermostate um die möglichen Zustände on/off der Thermostate zu erweitern.

Meine ersten Problemchen mit der Erweiterung des Beispiels und der Tatsache, dass "off" kein numerischer Wert ist, habe ich erfolgreich durch das Ersetzen des Werts durch "0" überwunden, wie man hier nachlesen kann http://forum.fhem.de/index.php/topic,34082.0.html.
Damit klappt die farbabhängige Anzeige der Ist-Temperatur weiterhin und mittlerweile auch ohne Fehler im Log. Leider stellt auch die folgende Aufgabe mit valueSuffix wohl kein bekanntes "Anfängerproblem" dar, weshalb ich mich hier nochmals direkt nachhake.

Idee ist es, sofern der Wert "off" als Soll-Temp gesetzt wird, dass innerhalb von valueSuffix der Zusatz "°C" hier unterdrückt wird - siehe Bild im Anhang.

Für sich alleine funktioniert dies bereits mittels
attr heatingInfo valueSuffix {if($READING eq "desired-temp"){my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d ne 'off'){" °C"}else{""}}}

Sobald ich versuche die übrigen Werte der Spalten in wieder hinzufügen, taucht jedoch an JEDEM Reading die Variable des zuletzt eingetragenen Werts auf.
attr heatingInfo valueSuffix {if($READING eq "desired-temp"){my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d ne 'off'){" °C"}else{""}};;"measured-temp"=>" °C","ValvePosition"=>" (".ReadingsVal($DEVICE,$READING,0)." %)}

Leider komme ich mit meinem Latein und try n error nicht mehr weiter, da ich hier wohl verschiedene Sachen zusammen werfe und, nun ja, noch nicht ganz durchschaue.
In jedem Fall bin ich für alle Tipps oder Denkanstöße dankbar. Vermutlich ist der geschilderte Fall auch für ein Beispiel im Wiki interessant, da dies sicher nicht der einzige Anwendungsfall ist :)

Viele Grüße Jorche

berndgel

Hallo,
ich bin Neuling, und habe nach reichlichem Studium der Dokus und vor allem der Beiträge hier nun meine Heizkörper, Wandthermostate und Fensterkontakte am Laufen. Alles von MAX und ohne MAXCube.
Bei einem Problem jedoch trete ich nun seit Tagen auf der Stelle: readingsgroup und commands:

Ich möchte mehrere Dropdown menus installieren. Für z. B. das Icon Tc funktioniert folgendes:

attr heatingInfo commands { "heatingInfo.Tc" => "comfortTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0" }

Wie aber kann ich ein weiteres command für ein weiteres Icon, z. B. attr heatingInfo commands { "heatingInfo.Te" => "ecoTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0" }
da nun dranhängen.

Wenn ich das auf einer Extrazeile formuliere:

attr heatingInfo commands { "heatingInfo.Tc" => "comfortTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0" }
attr heatingInfo commands { "heatingInfo.Te" => "ecoTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0" }

dann überschreibt die zweite Zeile offensichlich die erste Zeile und ich bekomme nur noch ein dropdown menu für ecoTemperature aber keines mehr für comfortTemperature.

Offensichtlich müssen beide dropdown menus in einem attr heatingInfo commands .... definiert werden.
Wie muss das syntaktisch aussehen? Ich habe nirgends ein Beispiel dafür gefunden.

Danke

bernd




justme1968

@Jorche: in deiner version sind diverse fehler beim verschachteln der anführungszeichen und klammern. wenn du den aktuellen wert haben möchtest kannst du $VALUE verwenden und musst nicht über ReadingsVal gehen. wenn du etwas vor den wert schreiben möchtest solltest du valuePrefix verwenden.

etwa so:attr heatingInfo valueSuffix { 'desired-temp' => '{ return "" if( $VALUE eq "off"); return "°C";}', 'measured-temp'=>' °C', 'ValvePosition'=>'%)'}
attr heatingInfo valuePrefix { 'ValvePosition' => '(' }


der code ist zur eingabe ins text feld hinter attr.


@berndgel:attr heatingInfo commands { "heatingInfo.Tc" => "comfortTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0", "heatingInfo.Te" => "ecoTemperature:18.0,19.0,20.0,20.5,21.0,21.5,22.0,22.5,23.0" }
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

berndgel

@ Jorge,

ich hätte schwören können, dass ich genau Deinen Vorschlag schon mal ausprobiert habe. Offensichtlich habe ich es doch nicht so genau gemacht, wie Du schreibst. Nun geht es jedenfalls. In der Zwischenzeit hatte ich das Gleiche mit einfachen Anführungszeichen  an Stelle der doppelten Anführungszeichen versucht, das geht auch. Wieso, weiß ich nicht.

Auf jeden Fall vielen Dank.

LG

bernd

Elektrolurch

Hallo Andre,

hast Du noch Mal geschaut wegen Beitrag 1202?
Ein reading  aus der readingsGroup liefert den Wert von state zurück.....

Elektrolurch
configDB und Windows befreite Zone!

Jorche

Hallo Andre,

hach, ein Traum :) Vielen Dank für Deine Antwort!
Da habe ich für die Einheit °C etwas zu kompliziert gedacht. Die ganze Codezeile für das ValueSuffix lautet dann
attr heatingInfo valueSuffix { 'desired-temp' => '{ return "" if( $VALUE eq "off"); return "°C";}', 'measured-temp'=>' °C', 'ValvePosition'=>" (".ReadingsVal($DEVICE,$READING,0)." %)","batteryLevel"=>"(".ReadingsVal($DEVICE,$READING,0)." V)"}
Dann klappt es auch mit den Readings der anderen Werte und sieht schon ganz gut aus. Dann ran an den Speck und die Zeitabhängie Steuerung in den Griff kriegen ;)

Viele Dank nochmal und schönes WE!
Jörg

Spartacus

Hallo,
ich kämpfe gerade mit ValueFormat und würde gerne das Reading eines DOIF-Timers formatieren.
Im Moment wird das so angezeigt:
Start 03.03.2015 16:30:00 Uhr
Ende 02.03.2015 22:00:00 Uhr

Wie kann ich hier nur
1. das Datum anzeigen lassen
2. die Zeit anzeigen lassen

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

justme1968

@Elektrolurch: ich habe es nicht vergessen bin aber noch nicht dazu gekommen es in ruhe anschauen. ich habe es kurz probiert und konnte es nicht reproduzieren. wenn du mir da ganze mit ein kleinen test konfiguration und ein ein paar dummys nachstellen kannst wird es einfacher.

@Spartacus: z.b. so für das datum: (split(' ',$VALUE))[1]und das gleiche mit 2 statt 1 für die zeit.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Spartacus

Hi andre,
vielen Dank!
Muss aber "0" und "1" sein!
{(split(' ',$VALUE))[0]}
Christian.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R