Moin
Folgendes Problem (für mich, wahrscheinlich nicht für Leute, die Perl können)
Ich habe verschiedene Automatiksteuerungen für meine Rollos definiert (DOIFs).
Ich möchte aber, das ich gezielt einzelne Rollos aus diesen Automatiken herausnehmen kann (temporär)
Dafür habe ich in den Devices jeweils ein Reading "Automatik " angelegt, das ich im tabletUI ein- und ausschalten kann.
Jetzt habe ich in meiner 99_myUtils.pm folgende Sub angelegt
sub Rollo($$){
my($device,$richtung) = @_;
my $automatik=ReadingsVal("$device","Automatik","");
if ($automatik=="1")
{
if ($richtung=="1") {fhem ("set $device on");}
else {
if ($richtung=="2") {fhem ("set $device stop");}
else {
if ($richtung=="3") {fhem ("set $device off");}
else {
fhem ("set $device Sonnenschutz");}
;}
;}
;}
;}
Und rufe in den DOIFs diese sub auf und zwar mit Rollo.*
Das funktioniert aber nicht wirklich, wenn bei einem der mit Rollo.* benannten Devices die Automatik ausgeschaltet ist (0), wird keines der Devices angesteuert.
Wie bekomme ich es hin, dass die sub, den Zustand des readings Automatik je Device prüft und nur für die Devices, die Automatik =1 haben den Befehl an FHEM sendet?
Oder weiß jemand eine andere Lösung? Theoretisch kann man das vielleicht auch in den DOIFs abfragen, aber das wird bei 15 Devices/Rollos ziemlich lang.
Danke für Hilfe
Das sieht komisch aus:
ReadingsVal("$device","Automatik","");
Probier mal
ReadingsVal($device,Automatik,"");
... Und mit Log() dieInhalte der Variablen ausgeben
Danke, werde ich ausprobieren,
Wobei, grundsätzlich funktioniert das ja so, Problem ist halt nur, dass wenn ich einen Befehl gebe, der mehrere Rollos ansprechen soll (Rollo.*) die Routine schon dann für keine Rollo mehr ausgeführt, wenn bei einem Rollo die if Bedingung. Automatik=1 nicht erfüllt ist.
Das ist m.E. auch logisch, so wie eich den Befehl aufgebaut habe (Reihenfolge), ich weiß aber nicht, wie ich die Befrhle so schachtele, dass die Bedingung für jedes Rollo einzeln überprüft wird
Bitte Code-Tags verwenden (das # Zeichen)
Woher soll deine sub wissen, dass es mehrere devices sind? Du beziehst dich nur auf einen Namen und das device "rollo.*" gibt es nunmal nicht.
Entweder musst du da mit devspec2array (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array) und einer for Schleife arbeiten.
sub Rollo($$) {
my($devspec ,$richtung) = @_;
foreach my $device (devspec2array($devspec)){
next unless(ReadingsVal($device, "Automatik", 0);
if($richtung == 1){
fhem("set $device on");
}
elsif($richtung == 2){
fhem("set $device stop");
}
elsif($richtung == 3){
fhem("set $device off");
}
else{
fhem("set $device Sonnenschutz");
}
}
return;
}
Einfacher ist es aber mit FILTER (http://fhem.de/commandref.html#devspec)
sub Rollo($$) {
my($devspec ,$richtung) = @_;
if($richtung == 1){
fhem("set $devspec:FILTER=Automatik=1 on");
}
elsif($richtung == 2){
fhem("set $devspec:FILTER=Automatik=1 stop");
}
elsif($richtung == 3){
fhem("set $devspec:FILTER=Automatik=1 off");
}
else{
fhem("set $devspec:FILTER=Automatik=1 Sonnenschutz");
}
return;
}
@igami:
Zunächst sorry, für falsche Tags (sup sub statt ##), hoffe ich denke nächstes Mal dran.
Vielen Dank für die beiden Lösungsvorschläge.
Genau "Woher soll die sub das wissen" das hatte ich auch schon als Problem erkannt, mangels Perl-Kenntnissen aber keine Lösung gefunden.
Ich finde es super, dass man hier immer so schnell und kompetent Hilfe bekommt. Ich hoffe ja, dass ich eines Tages auch etwas an die Community zurückgeben kann. Aber noch versuche ich zu lernen und über copy/Pate hinauszukommen.
Nochmals vielen Dank
Und weiterhin frohe Feiertage.
(sollte ich es wieder Erwarten trotz dieser guten Anleitung nicht hinbekommen, melde ich mich)
Zitat von: Garbsen am 26 Dezember 2016, 10:55:57
(sollte ich es wieder Erwarten trotz dieser guten Anleitung nicht hinbekommen, melde ich mich)
Und falls es funktioniert dann ein gelöst vor den Titel setzen ;)