*Gelöst* Brauche Hilfe bei Perl / 99_myUtils.pm

Begonnen von Garbsen, 25 Dezember 2016, 23:09:50

Vorheriges Thema - Nächstes Thema

Garbsen

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
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Dietmar63

Das sieht komisch aus:
ReadingsVal("$device","Automatik","");
Probier mal
ReadingsVal($device,Automatik,"");

...  Und mit Log() dieInhalte der Variablen ausgeben
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Garbsen

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
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

igami

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

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;
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Garbsen

@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)
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

igami

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 ;)
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED