Neues Modul readingsGroup

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

Vorheriges Thema - Nächstes Thema

justme1968

ich denke ich habe eine idee wie das ohne dummy geht. aber du musst dich bis heute abend gedulden.

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

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

justme1968

ich habe eben ein kleines update eingecheckt. das sollte morgen im update kommen. neu ist das <STRING> und <{perl}> jetzt nicht nur in er liste der readings erlaubt ist sondern auch statt einem device auftauchen kann. damit ist es möglich z.b. zwischenüberschriften einzubauen.

wenn du das hier in deine 99_myUtils.pm einbaust: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);
}


und ans ende deiner reading group das hier als letztes 'device' anhängst:
<{appendTrigger($DEVICE,"clear","Alle löschen")}>

bekommst du einen klickbaren link der ein event clear auf die readingsGroup triggert das du mit einem notify abfangen kannst.

ein komplettes beispiel (mit screenshot) findet sich hier: http://forum.fhem.de/index.php/topic,15190.msg106766.html#msg106766

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

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

Elektrolurch

Hallo Andre,

habe gerade aktualisiert und probiere das mit dem Text hinter dem defStateIcon in der rg aus:

define Alle_Lampen_im_Haus readingsGroup [A-Z][E-z][012]*_.*[LlFf](ampe|luter).*
attr Alle_Lampen_im_Haus alias Alle eingeschalteten Lampen
attr Alle_Lampen_im_Haus eventMap /on:ein/off:aus/
attr Alle_Lampen_im_Haus group Beleuchtung
attr Alle_Lampen_im_Haus mapping {state => '%ROOM %ALIAS'}
attr Alle_Lampen_im_Haus noheading 1
attr Alle_Lampen_im_Haus nolinks 1
attr Alle_Lampen_im_Haus notime 1
attr Alle_Lampen_im_Haus room Haus
attr Alle_Lampen_im_Haus valueFormat {($VALUE =~m/on.*/)?"</td><td>ein seit ".KonvertiereZeit(ReadingsTimestamp("$DEVICE","state","???")):undef()}
attr Alle_Lampen_im_Haus valueIcon {state => '%devStateIcon'}


Derzeit bekomme ich nur das Ikon, zum Ausschalten. Möchte aber noch die Zeit einblenden, seit dem die Lampe eingeschaltet ist, wie in "ValueFormat definiert ist.
Wenn ich an die rg Definition [A-Z].,<ein Text>  anhänge, bekomme ich gar keine Lampen mehr angezeigt. Statt "," ein " " zeigt den 'Text unterhalb aller eingeschalteten Lampen an.
Da stehe ich irgendwie auf dem Schlauch, in welcher Form ich die Liste der readings erweitern muss, damit ich den Ausdruck:
<{"</td><td>ein seit ".KonvertiereZeit(ReadingsTimestamp("$DEVICE","state","???"));}>

noch angezeigt bekomme. mit ",<Text> wird die Ausgabe ja unterdrückt, da da irgendwas nicht matched.????

Gruß

Elektrolurch
configDB und Windows befreite Zone!

justme1968

also...

der <...> teil gehört in die liste der readings. in der definition der readingsGroup gibst du ja die devices und die readings durch doppelpunkt getrennt an. wenn du die readings weg lässt sind es alle. deine lampen haben nur state von daher hat es bis jetzt gepasst wenn du nichts angegeben hast. jetzt möchtest du aber zwei dinge anzeigen. state und zeit also musst du beides auch hinschreiben:define Alle_Lampen_im_Haus readingsGroup [A-Z][E-z][012]*_.*[LlFf](ampe|luter).*:state,<{anSeit($DEVICE)}>

der <...> teil ist leider was die syntax angeht etwas eingeschränkt. es dürfen z.b keine leerzeichen vorkommen. deshalb ist es am besten alles in eine kleine routine in 99_myUtils.pm zu stecken und diese aufzurufen:sub                                               
anSeit($)                                         
{                                                 
  my ($DEVICE) = @_;                               
                                                   
  my $state = ReadingsVal($DEVICE,"state","" ); 
  return undef if( !$state || $state eq "off" );
                                                   
  my $time = ReadingsTimestamp($DEVICE,"state","");
                                                   
  return "an seit ". KonvertiereZeit($time);                       
}


value format kann jetz ganz einfach werden:attr valueFormat {($VALUE=~/on/)?"":undef}

wichtig: das unterdrücken der ausgabe für den <...> ausdruck hab ich eben erst eingecheckt. das geht erst morgen im update.

das mapping kannst du etwas vereinfachen:attr mapping %ROOM %ALIAS

die <...> werden nicht wirklich unterdrückt. der webbrowser blendet sie nur aus weil er denkt es wäre ein html kommando. das ist aber nicht wirklich ein problem. beim klick auf DEF sollten sie wieder zu sehen sein.

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

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

Elektrolurch

Hallo Andre,

wenn mans dann liest, ist es ja logisch. Danke. Eingebaut, funktioniert und sieht "echt kompetent" aus.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

justme1968

das freut mich.


du hast inzwischen so viel mit der readingGroup gemacht ich glaube es gibt vielleicht noch dein ein oder anderen der sich deine ideen gerne mal anschauen würde :)

hast du nicht zeit und lust mal ein bisschen was zu beschreiben. vielleicht sogar im wiki...

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

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

Elektrolurch

Hallo Andre,

köntte ich schon machen, weiß aber nicht, wie ich einen Zugriff auf das Wiki bekomme. Außerdem müsste ich mich erst einmal schlau machen, wie das mit der Formatierung (Kapitel usw.) funktioniert.
Da hätte ich noch zwei bis drei Themen:
a) Einen FS SIG2 intelligent ansteuern, ohne dass man 100 FHEM - Objekte dafür anlegen muss;
b) Meine Anruflistenverwaltung, die auch readingsGroup verwendet und dynamisch rolliert;
c) FHTs intelligent ansteuern, mit verschiedenen Heizungsprofilen für Urlaub, Party, Gast oder Abwesenheit einzelner Personen. Da ich 10 Stück davon im Betrieb habe, habe ich um nicht auf Funkprobleme zu laufen, einen Softpuffer mit Verifikation implementiert. Außerdem nutze ich die Fensterkontakte auch noch für eine Alarmanlage und für einen Schutz vor zu starker Raumtemperaturabsenkung bei versehentlichem Dauerlüften.

Zeit müsste man nur haben.

Gruß

Elektrolurch
P.S.: Noch Mals danke für die nette Unterstützung.
configDB und Windows befreite Zone!

ph1959de

Hallo Elektrolurch,

bei den Fragen zum wiki kann ich Dir weiterhelfen:

- wie Du den Zugriff bekommst, ist hier beschrieben: http://www.fhemwiki.de/wiki/Benutzer:Soulman

- den Einstieg in die (Mit-)Arbeit im wiki kannst Du hier finden: http://www.fhemwiki.de/wiki/FHEMWiki:%C3%9Cber_FHEMWiki#Beispiel:_Neuer_Artikel (... aber bitte auch die restlichen Hinweise auf der Seite beachten). Das Beispiel ist zwar auf ein Hardware-Device zugeschnitten, aber ich denke, das Prinzip lässt sich leicht auf Deinen Bedarf zuschneiden.

Wenn Dir das lieber ist, kann ich auch das Grundgerüst für den neuen Artikel schon mal für Dich anlegen - ich weiß nämlich nicht, wie es mit der Nutzbarkeit der Beispiele auf einem Screenreader aussieht. Im Zweifel melde Dich einfach, bei der Formatierung kann ich Dich auf jeden Fall unterstützen.

Gruß, Peter

Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

Elektrolurch

Hallo Andre,

ist leider mit der Lösch-Funktion nach einem Neustart von fhem ein Problem aufgetreten:

2013.11.16 20:31:31 1: reload: Error:Modul 99_myUtils deactivated:
Global symbol "$FW_ME" requires explicit package name at ./FHEM/99_myUtils.pm line 139, <$fh> line 6.
Global symbol "$FW_subdir" requires explicit package name at ./FHEM/99_myUtils.pm line 139, <$fh> line 6.

2013.11.16 20:31:33 3: telnetPort: port 7072 opened

Ist die auskommentierte Zeile im Trigger:

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);
} # end appendTrigger


Weiß allerdings nicht, woher die beiden Variablen stammen. Guter Rat...?
(aktueller Update - Stand von heute und erst nach shutdown restart, ein reload vom Modul hatte ich heute schon mal gemacht, wg. anderer Änderungen).

Zweites Thema (ich war fleißig)
rollierende Listen auf Basis von readingsGroup:

Beispiel:
an "meineFB" habe ich userReadings A0...E4 gehängt, also A - E Spalten und 0 - 4 Zeilen.
Will ich nun einen neuen Eintrag in A0 - E0 schreiben, so schiebe ich den Rest nach hinten:

my $meineFB = $defs{"meineFB"};
...
# shiften der alten Inhalte
   my $tt;
    readingsBeginUpdate($meineFB);

    for ($i=4;$i>0; $i--)
    {
   foreach $j ('A'..'E')
   {
#   $defs{"meineFB"}{READINGS}{$j.($i-1)}{VAL};

    $tt = ReadingsVal("meineFB",$j.($i-1),"-");
   readingsBulkUpdate($meineFB,$j.$i,$tt);
   } # end j
   } # end i
   $E[$callID] = $callDuration;
  readingsBulkUpdate($meineFB,"A0",$A[$callID]);
  readingsBulkUpdate($meineFB,"B0",$B[$callID]);
  readingsBulkUpdate($meineFB,"C0",$C[$callID]);
  readingsBulkUpdate($meineFB,"D0",$D[$callID]);
  readingsBulkUpdate($meineFB,"E0",$E[$callID]);

  readingsEndUpdate($meineFB, 1);


Was jetzt da etwas störend ist, dass jedes schreiben der Readings wohl trotz des bulk-Updates ein Event generiert, also 25 Stück. Man merkt das auch an der Performance....
Kann man die Werte nicht direkt schreiben:
$defs{"meineFB"}{READINGS}{$j.($i-1)}{VAL} = ...;

Irgendwie klappte das nicht mit der doppelten Indirektion, d.h. in einer Variable steht der Name einer Variable....
Zumindest könnte ich mir beim Shiften so die unnötigen Events ersparen, eine FB ist ja keine Cray.

Gruß


Elektrolurch



configDB und Windows befreite Zone!

justme1968

das mit den fehlenden variablen war mein fehler. ich hab dir zwei zeilen zu wenig kopiert. das hier:use vars qw($FW_ME);
use vars qw($FW_subdir);
muss noch vor das 'sub appendTrigger($$$)'

du kannst das triggern der events steuern in dem du bei readingsBulkUpdate einen zusätzlichen vierten parameter angibst. 0 -> keine events, 1 -> triggert events.

aber achtung: wenn keine events getriggert werden bekommt die readingsGroup natürlich auch nicht mit das sich etwas geändert hat und  longpoll funktioniert auch nicht.

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

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

Elektrolurch

Hallo Andre,

wie granular ist denn das graf. Update in der readingsGroup implementiert? Je Wert oder reicht es auch aus, wenn ich am Schluß nur für die neuen Werte in der ersten Zeile das Update per Event veranlasse?
Da es sich ja um eine Übersichtsliste handelt, wäre es ja wünschenswert nach erfolgtem Abschluß der Änderungen (shiften der Einträge) die ganze Gruppe neu malen zu lassen, als jedes Element einzeln.
Die Events, für die userReadings beim Shiften sind jedenfalls im log der Telefonliste, falls man das wirklich doch mal zum Nachsehen (Fehleranalyse) ziemlich nervi.

Daher war ja die Idee, direkt die Hashes zu schreiben.

Mal ncohnoch ein anderes Thema: Setze mal in einer readingsGroup einzlene Werte, die dargestellt werden sollen, auf ein "-". Das scheint fhem überhaupt nicht zu mögen. Ich habe daher jetzt an allen Stellen, wo ich keinen defnierten Wert habe, "n/a" rein geschrieben.... sieht so aus, als wären die fhem-Meldungen aus der fhem.pl über undefinierte Werte im Hash jetzt weg...
Muss das aber noch mal genauer recherchieren.

Gruß


Elektrolurch
configDB und Windows befreite Zone!

justme1968

jeder wert wird einzeln behaldelt. die readingsGroup kennt nur readings. sonst nichts. wenn du etwas gruppenweise brauchst muss schon das reading die ganze gruppe sein.

wenn du es weniger granular haben möchtest hilft es vielleicht die userReadings schon so aufzubereiten das immer ein komplette zeile existiert.

oder du baust die ganze gruppe in valueFormat komplett zusammen.

ich hab eben mal etwas mit '-' probiert und kein problem gehabt. ich schau es mir aber noch mal an.

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

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

Elektrolurch

Hallo Andre,

ich hatte in valueFormat die Abrage auf "-" -> undef, um die Ausgabe zu unterdrücken. Hintergurnd: mit setreadings Name reading value, kann man nur Werte setzen, aber nicht auf "leer" zurücksetzen. Wenn ich also einen Alarmmelder zurücksetzen wollte, damit er in der Liste nicht mehr auftaucht, habe ich ihn mit setreading auf "-" gesetzt.
Da aber nicht das Setzen, sondern erst die Darstellung wohl über

Use of uninitialized value $fn in concatenation (.) or string at ./FHEM/01_FHEMWEB.pm line 984.
Argument "-" isn't numeric in numeric ge (>=) at (eval 88861) line 1.
Argument "-" isn't numeric in sprintf at ./FHEM/33_readingsGroup.pm line 351.
Use of uninitialized value $fn in concatenation (.) or string at ./FHEM/01_FHEMWEB.pm line 984.

zu Problemen führt, konnte ich zunächst die Ursache nicht feststellen.
Dann habe ich gestern noch einige Thermostate in Betrieb genommen. Da sind die readings auch erst einmal mit "-" belegt, bis der alle eingesammelt hat, da häuften sich die Meldungen. Die sind alle über eine rg dargestellt.
Da konnte man auch die Fehlermeldung im log sehen:
Das "-" kein numerischer Vergleich in 33-readingsGroup.pm ist....

Jetzt habe ich alle "Default"-Besetzungen, und deren Abfragen, auf "n/a" gesetzt, und sihe da, das log ist bzgl. der km-langen Fehlermeldungen leer.
Ich vermute fast, das perl aus dem "-" irgendwas mit "-0" und daraus ein undef generiert.
Bei jedem Aufruf der zentralen Webseite hatte ich jede Menge Warnungen im log, (km), die scheinen nun weg zu sein.
Also: Ein "-" ist wohl gefährlich".
Möglicherweise ist dies auch ein perl-Spezifika, bei mir ist dies die Version auf der FB, Du verwendest ev. auf dem RP eine andere...?

Gruß


Elektrolurch


configDB und Windows befreite Zone!

justme1968

das valueFormat wird tatsächlich als format string in einem sprintf verwendet. ich fange den fehler ab. dann sollte keine meldenug mehr auftauchen.

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

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

Elektrolurch

Hallo Andre,

jetzt sind auch die Meldungen von fhem.pl weniger geworden. Für den Rest muss ich noch mal Ursachenforschung betreiben. Gibt's da in perl die Möglichkeit eines trace-backs?

Eine andere Sache, ist strange und ich komm da nicht weiter.
Die Gruppe "Aller eingeschalteten Lampen im Haus" funktioniert mit anklickbaren Ikon je Zeile und der Zeitangabe, dank Deiner freundlichen Unterstützung.
Die gleiche Gruppe, für "Alle eingeschalteten Geräte" zeigt nichst an. Nimmt man das valueFormat ganz raus, so werden alle Geräte eingeschaltet, aber es fehlt die Zeitangabe.
Einziger Unterschied: Die Lampen sind einzeilig über regex definiert, die Geräte mehrzeilig:
Ich sehe da partout keinen Unterschied, zumal ich die Gruppendefinition kopiert habe und nur den Namen ausgetauscht habe:


define Alle_Lampen_im_Haus readingsGroup [A-Z][E-z][012]*_.*[LlFf](ampe|luter).*:state,<{anSeit($DEVICE)}>
attr Alle_Lampen_im_Haus alias Alle eingeschalteten Lampen
attr Alle_Lampen_im_Haus eventMap /on:ein/off:aus/
attr Alle_Lampen_im_Haus group Beleuchtung
attr Alle_Lampen_im_Haus mapping %ROOM %ALIAS
attr Alle_Lampen_im_Haus noheading 1
attr Alle_Lampen_im_Haus nolinks 1
attr Alle_Lampen_im_Haus notime 1
attr Alle_Lampen_im_Haus room Haus
attr Alle_Lampen_im_Haus valueFormat {($VALUE=~/on/)?"":undef}
attr Alle_Lampen_im_Haus valueIcon {state => '%devStateIcon'}

define Alle_Geraete_im_Haus readingsGroup SonosBridge:state,<{anSeit($DEVICE)}> Ku_Squeezebox:state,<{anSeit($DEVICE)}> [MW]z_Media:state,<{anSeit($DEVICE)}> Sa_IR_strahler:state,<{anSeit($DEVICE)}> Sa_Sitzbank:state,<{anSeit($DEVICE)}>
attr Alle_Geraete_im_Haus alias Alle eingeschalteten Geräte
attr Alle_Geraete_im_Haus eventMap /on:ein/off:aus/
attr Alle_Geraete_im_Haus group Geräte
attr Alle_Geraete_im_Haus mapping %ROOM %ALIAS
attr Alle_Geraete_im_Haus noheading 1
attr Alle_Geraete_im_Haus nolinks 1
attr Alle_Geraete_im_Haus notime 1
attr Alle_Geraete_im_Haus room Haus
attr Alle_Geraete_im_Haus valueFormat {($VALUE=~/on/)?"":undef}
attr Alle_Geraete_im_Haus valueIcon {state => '%devStateIcon'}



Eine Idee, woran es liegen könnte?

Gruß


Elektrolurch
configDB und Windows befreite Zone!