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
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
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
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.
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
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
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
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
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
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
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!
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
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