Mit ReadingsGroup Dummies tabellarisch darstellen und ändern?

Begonnen von Petrosilius Zwackelmann, 31 Mai 2016, 02:33:07

Vorheriges Thema - Nächstes Thema

Petrosilius Zwackelmann

Hallo Liste,

ich habe ein Verständnisproblem bei ReadingsGroup und ich hoffe ihr könnt mir helfen.

Situation: Ich habe eine Ablaufsteuerung zur Gartenbewässerung realisiert. Hierzu können vom Anwender die Bewässerungsdauer, die Gruppen der Ventile die gleichzeitig angehen sollen sowie ein Feuchtigkeitsgrenzwert pro Bewässerungs-Strang angegeben werden ab dem die Bewässerung nicht durchgeführt werden soll.

All diese Eingabewerte habe ich derzeit in Dummies gespeichert - die Werte werden dann von Unterprogrammen verarbeitet.
d.h. Ich habe eine Tabelle von 7 Dummies für die Dauer, 7 für die Gruppe usw. d.h. das ganze ist nicht übersichtlich.

Ich stelle mir eine Tabelle wie im Anhang vor, in welcher die Werte der Dummies oder aber entsprechende userReadings aktualisiert werden können.
Ich dachte das ist einfach mit ReadingsGroup machbar aber bisher habe ich es nicht hinbekommen.

Ansatz Dummy:
Die Definitionen der dummies  ist immer wie folgt....
define Ventil_1_Gruppe dummy
define Ventil_1_Dauer dummy
define Ventil_1_Feuchte dummy
...
define Ventil_7_Gruppe dummy
define Ventil_7_Dauer dummy
define Ventil_7_Feuchte dummy

Ansatz userReading: (greift letztlich auf die Werte der Dummies zu)
Feuchte {Value("Ventil_7_Feuchte")}, Dauer {Value("Ventil_7_Dauer")}, Gruppe {Value("Ventil_7_Gruppe")}
Problem: damit lässt sich mit....
<>,<Dauer>,<Gruppe>,<Feuchte>,<Status> TYPE=readingsProxy:Dauer,Gruppe,Feuchte,state
...zwar genau die Darstellung generieren welche ich möchte (Anhang) aber die Kommandos werden vom Device nicht akzeptiert. Die Fehlermeldung "Unknown argument Gruppe, choose one of on off on-for-timer on-till off-for-timer on-till-overnight blink toggle off-till-overnight intervals off-till"


Mein Verständnisproblem:
Ich benötige einen Zwischenspeicher für meine Eingabewerte.
Kann hierzu ein userReading verwendet werden welches durch ReadingsGroup modifiziert wird?

Gibt es ein Setup mit ReadingsGroup welches sich direkt auf zig verschiedene Dummies anwenden lässt sodass eine Darstellung wie im Anhang entsteht - incl. der drop-down Menüs um die Werte zu ändern?

LG
Manuel

FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

justme1968

wenn du nicht für jeden wert einen eigen dummy nimmst sonders jeweils die drei zusammengehörenden werte als unterschiedliche readings in einen dummy steckst machst du dir vieles einfacher.

in diesem dumme konfigurierst du dir dann mit setList und readingList die drop down menüs und readings. das kann man mit webCmd im dumme testen.

in der readingsGroup zeigst du dann für jeden dummy die drei readings an und verwendest das commands mapping um jeweils das dropdown statt nur den wert anzuzeigen.

wie der readingsProxy ins spül kommt und warum du eine zwischenablage brauchst verstehe ich nicht.

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

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

Petrosilius Zwackelmann

Hallo Andre,

danke für deine schnelle Hilfe...
So ist es tatsächlich einfacher - und noch besser - es funktioniert.

Damit ist die Ablage als Reading im readingsProxy hinfällig. 
Im readingsProxy ist ein Kanal des 1-wire 8-fach Switch herausgelöst - also mein Bewässerungsventil.

Ist es möglich den state und ein webcmd z.B. on-for-timer noch in diese readingsGroup hinzuzunehmen?
Wahrscheinlich muss dann ein gemeinsamer Bezugspunkt existieren ggf. der Alias?




define Ventil_1 dummy
attr Ventil_1 alias 1_Vorgarten_Rasen_aussen
attr Ventil_1 group Test
attr Ventil_1 readingList Dauer Gruppe Feuchte
attr Ventil_1 room Bewässerung
attr Ventil_1 setList Dauer:1,2,3,4 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40

define Ventil_2 dummy
attr Ventil_2 alias 2_Vorgarten_Rasen_innen
attr Ventil_2 group Test
attr Ventil_2 readingList Dauer Gruppe Feuchte
attr Ventil_2 room Bewässerung
attr Ventil_2 setList Dauer:1,2,3,4 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40

define Ventil_3 dummy
attr Ventil_3 alias 3_Vorgarten_Tropfschlauch
attr Ventil_3 group Test
attr Ventil_3 readingList Dauer Gruppe Feuchte
attr Ventil_3 room Bewässerung
attr Ventil_3 setList Dauer:1,2,3,4 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40

define rg_test readingsGroup <%sani_sprinkling>,<Dauer>,<Gruppe>,<Feuchte>,<State>,<manual> Ventil_.:Dauer,Gruppe,Feuchte
attr rg_test alias Bewässerungssteuerung
attr rg_test commands {Gruppe => "Gruppe:1,2,3,4,5,6,7",Dauer => "Dauer:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,30,35,40,45,50,55,60",Feuchte => "Feuchte:35,40,45,50,55,60,65,70,75"}
attr rg_test group Test
attr rg_test nameStyle style="color:yellow;;font-weight:bold"
attr rg_test room Bewässerung
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

justme1968

du kannst readings aus anderen devices mit <reading>@<device> angeben. <device> kann auch {...} perl dode sein um das device dynamisch z.b. abhängig vom device der aktuellen zeile zu bestimmen.

ein beispiel gibt es im wiki.

gruss
  andre

ps: wenn die dropdown menüs  den gleichen inhalt haben sollen wie in der setList vergeben musst du in commands nach dem : die liste nicht noch mal hin schreiben. der : nach dem kommando reicht.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Petrosilius Zwackelmann

Hallo Andre,

ich habe da noch meine Probleme weil ich nicht verstehe wie soetwas funktionieren kann.
Die readingsGroup ist doch soetwas wie eine Anzeige von Readings die einem bestimmten Filter entsprechen.
In meinem Beispiel werden wohl alle devices welche dem Muster Ventil_. entsprechen separiert. Nach welcher Logik welches device in welcher Zeile steht verstehe ich nicht... dennoch ist es wohl mit  <reading>@<device> möglich ein reading eines völlig anderen device in der gleichen Zeile darzustellen.

Ich brauche also einen Perl Code der von Ventil_3 auf z.B. Bewaesserung_Vorgarten_Tropfschlauch auflöst und mir ein bestimmtes reading z.B. state zurückgibt.

Zitatdu kannst readings aus anderen devices mit <reading>@<device> angeben. <device> kann auch {...} perl code sein um das device dynamisch z.b. abhängig vom device der aktuellen zeile zu bestimmen.

ein beispiel gibt es im wiki.
Meinst du hier den Abschnitt: Readings aus zusätzlichen Devices
mit dem Beispiel...
sub valveOfDevice ($) {
  my ($DEVICE) = @_;

  if ($DEVICE =~ m/AZ/) {
return "Ventil.".substr($DEVICE,11).".Nord";
  } else {
return "Ventil.".substr($DEVICE,11); 
  }
}



Zitatps: wenn die dropdown menüs  den gleichen inhalt haben sollen wie in der setList vergeben musst du in commands nach dem : die liste nicht noch mal hin schreiben. der : nach dem kommando reicht.

--> verstanden - danke

##############################################################################################
#
# derzeitiges readingsGroup definition
#
##############################################################################################

<%sani_sprinkling>,<Dauer>,<Gruppe>,<Feuchte>,<State>,<manual> Ventil_.:Dauer,Gruppe,Feuchte

#################################################################################################################################################################################
#
# list list Ventil_3 - TYPE=dummy
#
#################################################################################################################################################################################



Internals:
   NAME       Ventil_3
   NR         2560
   STATE      ???
   TYPE       dummy
   Readings:
     2016-05-31 12:15:51   Dauer           3
     2016-05-31 09:52:38   Feuchte         40
     2016-05-31 09:52:45   Gruppe          7
Attributes:
   alias      3_Vorgarten_Tropfschlauch
   group      Test
   readingList Dauer Gruppe Feuchte
   room       Bewässerung
   setList    Dauer:1,2,3,4 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40
   
   
   
#################################################################################################################################################################################
#
# list OW_Switch_Bewaesserung - TYPE=OWSWITCH
#
#################################################################################################################################################################################



Internals:
   ASYNC      0
   CFGFN      ./FHEM/00_Bewaesserung_Tobi.cfg
   DEF        DS2408 1A6813000000
   INTERVAL   300
   IODev      1wire
   NAME       OW_Switch_Bewaesserung
   NOTIFYDEV  global
   NR         2190
   NTFY_ORDER 50-OW_Switch_Bewaesserung
   OW_FAMILY  29
   OW_ID      1A6813000000
   PRESENT    1
   ROM_ID     29.1A6813000000.28
   STATE      A: ON. B: ON. C: ON. D: ON. E: ON. F: ON. G: ON. H: ON
   TYPE       OWSWITCH
   Readings:
     2016-05-31 12:51:28   A               ON.
     2016-05-31 12:51:28   B               ON.
     2016-05-31 12:51:28   C               ON.
     2016-05-31 12:51:28   D               ON.
     2016-05-31 12:51:28   E               ON.
     2016-05-31 12:51:28   F               ON.
     2016-05-31 12:51:28   G               ON.
     2016-05-31 12:51:28   H               ON
     2016-05-31 12:51:28   state           A: ON. B: ON. C: ON. D: ON. E: ON. F: ON. G: ON. H: ON
   owg_val:
     0
     0
     0
     0
     0
     0
     0
     0
   owg_vax:
     1
     1
     1
     1
     1
     1
     1
     0
Attributes:
   IODev      1wire
   model      DS2408
   room       SYSTEM
   stateS     .

   
#################################################################################################################################################################################
#
# list Bewaesserung_Vorgarten_Tropfschlauch - TYPE=readingsProxy
#
#################################################################################################################################################################################

Internals:
   CFGFN      ./FHEM/00_Bewaesserung_Tobi.cfg
   DEF        OW_Switch_Bewaesserung:C
   DEVICE     OW_Switch_Bewaesserung
   NAME       Bewaesserung_Vorgarten_Tropfschlauch
   NR         2208
   NTFY_ORDER 50-Bewaesserung_Vorgarten_Tropfschlauch
   READING    C
   STATE      OFF
   TYPE       readingsProxy
   Content:
     OW_Switch_Bewaesserung 1
   Readings:
     2016-05-31 12:13:33   lastCmd         off
     2016-05-31 13:06:32   state           OFF
Attributes:
   alias      3_Vorgarten_Tropfschlauch
   devStateIcon ON.*:general_an@green OFF.*:general_aus@red
   group      Ventile
   icon       sani_sprinkling
   room       Bewässerung
   setFn      {"output C $CMD"}
   setList    on off
   valueFn    {($VALUE eq "ON.")?"OFF":"ON"}
   webCmd     on:off:on-for-timer 600   




FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

justme1968

du gibst im define der readingsGroup an welche readings von welchen devices angezeigt werden sollen.

in deinem fall Ventil_.:Dauer,Gruppe,Feuchte jeweils die drei readings aller devices die auf Ventil_. matchen.

in der darstellung wird für jedes device eine neue zeile angelegt und diese von links nach rechts mit den angegeben readings gefüllt. wenn das reading eines anderen devices mit aufgeführt ist wird auch dieses genau so mit in der zeile angezeigt.

ZitatMeinst du hier den Abschnitt: Readings aus zusätzlichen Devices
ja. genau. die routine muss für jedes $DEVICE einer zeile dann den passenden anderen device namen zurück geben. entweder über irgendwelche string manipulationen wenn die namen sich dafür anbieten oder einfach hart kodiert.

in der readings group definition hast du dann etwas in der art:
Ventil_.:Dauer,Gruppe,Feuchte,state@{myProxyForVentil($DEVICE)} mit passender myProxyForVentil routine.

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

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

Petrosilius Zwackelmann

Hallo Andre,

DANKE!

.. hart codiert ist für mich wohl am einfachsten....
Folgender Code bringt den "State" zur Anzeige.....

sub myProxyForVentil{
my $DEVICE= shift;
if ($DEVICE =~ m/Ventil_1/) {return "Bewaesserung_Vorgarten_1"}
if ($DEVICE =~ m/Ventil_2/) {return "Bewaesserung_Vorgarten_aussen"}
if ($DEVICE =~ m/Ventil_3/) {return "Bewaesserung_Vorgarten_Tropfschlauch"}
if ($DEVICE =~ m/Ventil_4/) {return "Bewaesserung_Kuebelpflanzen"}
if ($DEVICE =~ m/Ventil_5/) {return "Bewaesserung_Garten_Tropfschlauch"}
if ($DEVICE =~ m/Ventil_6/) {return "Bewaesserung_Garten_aussen"}
if ($DEVICE =~ m/Ventil_6/) {return "Bewaesserung_Garten_innen"}
}



Jetzt fehlt nur noch ein das Absetzen eines start Befehls...
Kannst du mir hier nochmals helfen um ein Start-Icon anglickbar in die ReadingsGroup zu bekommen.
Dies könnte dann wieder ein perl script aufrufen -- etwas so -->


sub myProxyForVentil_manual_start{
my $DEVICE= shift;
my $dauer = ReadingsVal($DEVICE,"Dauer","0");
if ($DEVICE =~ m/Ventil_1/) {fhem "set Bewaesserung_Vorgarten_1 on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_2/) {fhem "set Bewaesserung_Vorgarten_aussen on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_3/) {fhem "Bewaesserung_Vorgarten_Tropfschlauch on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_4/) {fhem "Bewaesserung_Kuebelpflanzen on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_5/) {fhem "Bewaesserung_Garten_Tropfschlauch on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_6/) {fhem "Bewaesserung_Garten_aussen on-for-timer $dauer"}
if ($DEVICE =~ m/Ventil_6/) {fhem "Bewaesserung_Garten_innen on-for-timer $dauer"}
}


LG Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

justme1968

entweder als eigene spalte: am einfachsten mit einem 'dummy' reading das es nicht gibt. das kannst du dann beliebig über commands auf ein set mappen: Ventil_.:Dauer,Gruppe,Feuchte,state@{myProxyForVentil($DEVICE)},!cmd@{myProxyForVentil($DEVICE)} und commands ..., cmd => 'set $DEVICE on-for-timer 123', ...

oder du konfigurierst dir im readingsProxy devStateIcon so das es anklickbar ist und setzt dann in der readingsGroup attr <rg> valueIcon {state => '%devStateIcon'}

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

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

Petrosilius Zwackelmann

Hallo Andre,

deine Beschreibung funktioniert - ich will das Bewässerungsventil bei dem manuellen Kommando (cmd) aber mit der eingestellten Dauer "versorgen".
Deswegen versuche ich folgenden perl code aufzurufen...

sub myProxyForVentil_manual_start($){
my $DEVICE= shift;
if ($DEVICE =~ m/Bewaesserung_Vorgarten_1/) {
my $dauer = ReadingsVal("Ventil_1","Dauer","0")*60;
fhem "set Bewaesserung_Vorgarten_1 on-for-timer $dauer";
Log 1, "Aufruf: Bewaesserung_Vorgarten_1 an";
}


Ich hoffe das ist nicht zu sehr von hinten durch die Brust etc.

Als command ist folgendes konfiguriert ...
{Gruppe => "Gruppe:",Dauer => "Dauer:",Feuchte => "Feuchte:",cmd => "myProxyForVentil_manual_start($DEVICE)"}

Fehlermeldung:
Unknown command myProxyForVentil_manual_start(Bewaesserung_Vorgarten_1), try help

Es scheint also der Aufruf des Unterprogramms fehlerhaft zu sein.

LG Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

justme1968

ohne geschweifte  klammern bist du immer auf der fhem ebene. da könntest du cmdalias verwenden um dir ein passendes kommando zusammen zu bauen.

um auf die perl ebene zu wechseln versuch mal{Gruppe => "Gruppe:",Dauer => "Dauer:",Feuchte => "Feuchte:",cmd => '{myProxyForVentil_manual_start($DEVICE)}'}

wenn das nicht geht gibt es zwei möglichkeiten: du verwendest als cmd trigger und hängst ein notify dran oder du nimmst so etwas: 'set $DEVICE on-for-timer {(60*ReadingsVal(...))}'

du kannst auch die berechnung im readingsProxy machen und diesen mit einem einfachen set aufrufen.

wenn du direkt die sekunden im deinem reading hättest (z.b. über ein user reading) kannst du auch set $DEVICE on-for-timer [$DEVICE:<reading>] verwenden.

du siehst viele möglichkeiten :)

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

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

Petrosilius Zwackelmann

Hallo Andre,

danke für deinen 24h Support. Soetwas gibt es wahrscheinlich nur hier.
Es läuft mit deinem Vorschlag ein userreading hinzuzufügen.

define Ventil_1 dummy
attr Ventil_1 alias 1_Vorgarten_Rasen_aussen
attr Ventil_1 group Test
attr Ventil_1 readingList Dauer Gruppe Feuchte
attr Ventil_1 room hidden
attr Ventil_1 setList Dauer:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20,25,30,35,40,45,50,55,60 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40,45,50,55,60,65,70,75

....

define Ventil_7 dummy
attr Ventil_7 alias 7_Garten_Rasen_innen
attr Ventil_7 group Test
attr Ventil_7 readingList Dauer Gruppe Feuchte
attr Ventil_7 room hidden
attr Ventil_7 setList Dauer:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20,25,30,35,40,45,50,55,60 Gruppe:1,2,3,4,5,6,7 Feuchte:35,40,45,50,55,60,65,70,75

define rg_test readingsGroup <%sani_sprinkling>,<Dauer>,<Gruppe>,<Feuchte>,<Status>,<On-For-Timer> Ventil_.:Dauer,Gruppe,Feuchte,state@{myProxyForVentil($DEVICE)},!cmd@{myProxyForVentil($DEVICE)}
attr rg_test alias Bewässerungssteuerung
attr rg_test commands {Gruppe => "Gruppe:",Dauer => "Dauer:",Feuchte => "Feuchte:",cmd => "set $DEVICE on-for-timer [$DEVICE:Dauer]"}
attr rg_test group 1_Einstellungen
attr rg_test nameStyle style="color:yellow;;font-weight:bold"
#attr rg_test noheading 1
attr rg_test room Bewässerung
attr rg_test valueIcon { state => '%devStateIcon' }
attr rg_test valueStyle style="text-align:center"
attr rg_test verbose 5


sowie in 99_myUtils.pm

sub myProxyForVentil($){
my $DEVICE= shift;
if ($DEVICE =~ m/Ventil_1/) {return "Bewaesserung_Vorgarten_1"}
if ($DEVICE =~ m/Ventil_2/) {return "Bewaesserung_Vorgarten_aussen"}
if ($DEVICE =~ m/Ventil_3/) {return "Bewaesserung_Vorgarten_Tropfschlauch"}
if ($DEVICE =~ m/Ventil_4/) {return "Bewaesserung_Kuebelpflanzen"}
if ($DEVICE =~ m/Ventil_5/) {return "Bewaesserung_Garten_Tropfschlauch"}
if ($DEVICE =~ m/Ventil_6/) {return "Bewaesserung_Garten_aussen"}
if ($DEVICE =~ m/Ventil_7/) {return "Bewaesserung_Garten_innen"}
}


nochmals 1000 Dank!
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

FHEM_Starter

Hallo Manuel, hallo Andre,

ich habe das Beispiel nachgebaut, bekomme aber bei dem "set $DEVICE on-for-timer [$DEVICE:Dauer]" immer den Hinweis, das ich ein numerische Argument mitgeben muss. Ist meiner Meinung auch klar, weil das Reading "Dauer" ja nur bei dem Dummy (Ventil_x) bekannt ist, nicht auf dem zu schaltenden GIPO.

Ich bekomme das einfach nicht hin. Könnt ihr mir bitte helfen?

anke und Gruß
Wolfgang

Petrosilius Zwackelmann

Hallo Wolfgang,

sorry ich habe die Nachricht lange nicht gesehen...

Ich hatte die Dauer welche im dummy definiert wird dem als userreading dem Ventil angehängt....
attr userReadings Dauer {ReadingsVal("Ventil_5","Dauer","0")*60}


Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony