HM-OU-LED16 Power on

Begonnen von cerberus, 21 Juli 2014, 12:14:21

Vorheriges Thema - Nächstes Thema

Deudi

Zitat von: Franz Tenbrock am 07 Januar 2016, 21:12:04
Wäre schön wenn wie ein komplettes Beispiel für das Wiki hätten.
http://www.fhemwiki.de/wiki/HM-OU-LED16_Funk-Statusanzeige_LED16

Möchte das Display per Bewegungsmelder einschalten, das natürlich mit den aktuellen Zuständen.
Dafür scheint der code ja geeigent.
Ich kann am Wochenende mal das Wiki ergänzen.
Bist du sicher, dass es Sinn macht das komplette Display stromlos zu machen und bei Bewegung einzuschalten? Wäre es nicht sinnvoller nur die Helligkeit zu reduzieren oder die LEDs vom Display abschalten zu lassen (letztes Beispiel im Wiki)?

Den Fall im Code, dass alle LED Zustände gesendet werden, habe habe ich für mich nur für ein Recovery bei Stromausfall geschrieben und nicht für den Regelbetrieb.

Zitat
muss man hier die Pünktchen durch die echten Namen ersetzen?
Ja, ich wollte nur nicht die ganze Liste posten.
Zitat
also zB 16 Fenster und 16 LEDs oder eben nur 8 ?!
Sorry verstehe den code och nicht ganz
Sorry, aber das merkt man  ;)
Wenn du nur 8 Fenster hast, darf die Schleife nicht über 16 Fenster laufen. Ich hatte den Code schon extra mit Kommentaren (dem natürlichen Feind des Programmierers) versehen. Es steht alles da was passiert. Der Code erfüllt bei mir halt auch zwei Funktionen: Das normale Update einer LED und das Recovery nach Power-on. Werde das Beispiel für das Wiki schlanker gestalten.

Zitat
habs mal probiert:
Und was ist dabei heraus gekommen?
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Deudi

Zitat von: Deudi am 08 Januar 2016, 09:58:44
Wenn du nur 8 Fenster hast, darf die Schleife nicht über 16 Fenster laufen.

Ergänzung: Das geht auch ganz flexibel so:

# Loop über alle Fenster
for ($i = 0; $i <= $#Fenster_name; $i++) {

Damit läuft die Schleife nur über die Länge des Arrays. Ich war da etwas faul, da ich nicht annehme, dass sich die Anzahl der Fenster in meinem Haus mal ändert.  ;)
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Franz Tenbrock

Hallo,
bin halt nicht der Programmier Profi, da eher totaler Anfänger der auch nur alle paar Wochen mal was macht.
Wenn dann auch nur Teile des Codes da stehen wird es immer was schwierig.
Kryptische Namen machen es dann noch schwerer etwas zu verstehen.

aber damit bin ich ja nicht alleine im Forum.

Die Leds hab ich eh schon auf der geringsten Stufe, Gerät steht halt in einer dunklen Ecke
ob das ausschalten überhaupt Sinn macht ?,
hab den Stromverbrauch noch nicht berechnet.

Aber beim Stromausfall sollte das Gerät ja auch den tatsächlichen Zustand anzeigen und nicht den letzten Zustand den das Gerät selbst mitbekommen hat.

Letztendlich soll das Gerät vor dem Verlassen des Hauses einen schnellen Überblick geben und der Bewegungsmelder ist eh im Flur angebracht, kann dann ja gleich mehrere sinnvolle Dinge machen.

Wenn im Wiki erst die einfachen und dann die komplexen Beispiele stehen würden wäre das Verständis auch für Programmieranfänger leichter
Erst das einfache verstehen und umsetzen dann immer komplizierter

Schreib mir fast immer eine Dokument wie was funktioniert damit ich auch Wochen später den code noch verstehe
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

#18
so hab die Zeile geändert und auch verstanden :-)

trotzdem noch nciht ganz richtig
es passiert aber schon mal was

linkes Bild so sieht es aus, unten die Anzeige für die aktuellen Stati der FK oben die Meldungen des Displays
mittleres Bild: wenn das Statusdisplay keinen -strom hat sehe ich in fhem diese Änderung
rechtes bild: wenn ich nun das Display unter Strom setze werden die 2 neuen Stati TK Essen TK Wohnen wieder gelöscht

ev hilft das ja weiter.
es wird zumindest von fhem erkannt das das Statusdisplay was tun soll, Led auf rot schalten...

bzw er läuft die util schon durch wenn das Dsplay aus ist, sollte aber erst laufen wenn das Display eingeschaltet wird ?!

das ist in der fhem.cfg
define LED_Anzeige_powerOn notify LED_Anzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}

die Unteroutine wird doch eigentlich erst 10 sek nachdem das Display Strom bekommen hat ausgelöst

ich habs


also in der fhem.cfg war noch ein Fehler
einfach dumm übernommen  >:(

bei mir hab ich es umbenannt in statusanzeige
also muss auch das notify LED_Anzeige umbenannt werden

define LED_Anzeige_powerOn notify statusanzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}

ein so ein blöder Sensor will noch nicht (der4.) aber da der Rest nun klappt sollte ich die Leerstelle oder was auch immer da noch falsch ist selber finden.

so finde ich Gefallen an dem Teil


durch das Ganze testen gerade erst mal einen hmlan overload  >:(
hab noch einen kleinen Fehler gefunden, so erst mal warten dann weiter testen

werde das nun mal beobachten und testen und dann den ganzen Code hier posten und dann sollten wir das wiki ergänzen damit auch andere Anfänger schnell zruechtkommen, als Bausatz mit 10 Euro Rabatt und ELV card ( hab ich von elv zu Weihnachtne bekommen ) kostet das ja nicht mehr so viel
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

so
nachdem es mit großer Hilfe geklappt habe, habe ich es mal versucht im wiki einzustellen.

Ich hoffe man findet und  versteht  es dort.

Was müsste da sonst noch rein, PM oder so an mich
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

#20
Es gab wohl noch einen Fehler in der 99_myutils.pm
im Logfile haufenweise Fehlermeldungen und vor allem das hier:

Undefined subroutine &main::myUtils_Initialize called at fhem.pl line 2227.

nach dem ausmisten fehlte nun aber das hier am Anfang der utils:

sub
myUtils_Initialize($$)
{
   my ($hash) = @_;
}

jetzt alles ok



den Rest lass ich mal hier stehen für andere Anfänger.
geholfen hat mir das hier
http://www.fhemwiki.de/wiki/99_myUtils_anlegen


Nachdem ich im Logfile nachgeschaut habe fand ich das hier:

Fehler war wohl in der 99_myutils.pm

Undefined subroutine &main::myUtils_Initialize called at fhem.pl line 2227.

also in der fhem.pl nachgeschaut
    &{ "${fnname}_Initialize" }(\%hash);

da fehlt wohl irgendwo ein Funktions Name?!
der Fehler liegt wohl noch hier:


hier meine aktuelle myUtils

package main;
use strict;
use warnings;
use POSIX;
use Time::Local;



my @Fenster_name = ("FK_Bad_EG", "FK_Buero", "FK_Essen", "FK_Garage", "FK_Keller", "FK_Kueche" , "TK_Essen", "TK_wohnen");

my @Led_name = ("HM_20F85B_Led_01", "HM_20F85B_Led_02", "HM_20F85B_Led_03", "HM_20F85B_Led_4", "HM_20F85B_Led_05", "HM_20F85B_Led_06" , "HM_20F85B_Led_07", "HM_20F85B_Led_08");

sub Update_Fenster_LED($) {
  my ($fenster) = @_;
  my $i;
  my $zustand;
  my $led;
  my $farbe;

  # Reset
  if ($fenster eq "Alle") {
    fhem("set LED_Anzeige led off");
  }
  # Loop über alle Fenster
  for ($i = 0; $i <= $#Fenster_name; $i++) {
     if ($fenster eq "Alle" || $fenster eq $Fenster_name[$i]) {
      # Aktuellen Zustand lesen
      $zustand = Value($Fenster_name[$i]);
      # LED ermitteln
      $led = $Led_name[$i];
      # Farbe setzen
      if ($zustand eq "closed") {
        $farbe = "green";
      } elsif ($zustand eq "gekippt") {
        $farbe = "orange";
      } elsif ($zustand eq "open") {
        $farbe = "red";
      } else {
        $farbe = "off";
      }
      # LED senden
      fhem("set $led led $farbe");
      # Abbruch, falls nicht für alle Fenster
      if ($fenster ne "Alle") {
        last;
      }
    }
  }
}




und das hier Update_Fenster_LED:

define LED_Anzeige_powerOn notify statusanzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}

da scheint noch ein Bock drin zu sein ?!  :'(
attr LED_Anzeige_powerOn room Türkontakt
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

#21
da ist noch was faul

das hat wohl hiermit zu tun
für mich leider zu hoch

http://forum.fhem.de/index.php/topic,44094.0.html

gerade eine update gemacht da LED 4 einfach nicht den Zustand übernehmen will
wenn das Ding läuft ging es

so nun bekomme ich eine Fehlermeldung wenn ich die utils speichern will

Global symbol "$fenster" requires explicit package name at ./FHEM/99_myUtils.pm line 17. Global symbol "$i" requires explicit package name at ./FHEM/99_myUtils.pm line 18. Global symbol "$zustand" requires explicit package name at ./FHEM/99_myUtils.pm line 19. Global symbol "$led" requires explicit package name at ./FHEM/99_myUtils.pm line 20. Global symbol "$farbe" requires explicit package name at ./FHEM/99_myUtils.pm line 21. Global symbol "$fenster" requires explicit package name at ./FHEM/99_myUtils.pm line 24. syntax error at ./FHEM/99_myUtils.pm line 24, near "if ($fenster eq "Alle" Global symbol "$led" requires explicit package name at ./FHEM/99_myUtils.pm line 28. Global symbol "$farbe" requires explicit package name at ./FHEM/99_myUtils.pm line 28. Global symbol "$uid" requires explicit package name at ./FHEM/99_myUtils.pm line 28. ./FHEM/99_myUtils.pm has too many errors.

meine Utils:

package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
use HTML::Entities;

sub  myUtils_Initialize($$)
{
   my ($hash) = @_;
}

my @Fenster_name = ("FK_Bad_EG", "FK_Buero", "FK_Essen", "K_Garage", "K_Keller", "FK_Kueche", "TK_Essen", "TK_wohnen", "K_Keller");
my @Led_name = ("statusanzeige_Led_01", "statusanzeige_Led_02", "statusanzeige_Led_03", "statusanzeige_Led_4", "statusanzeige_Led_05", "statusanzeige_Led_06", "statusanzeige_Led_07", "statusanzeige_Led_08", "statusanzeige_Led_09);

sub Update_Fenster_LED($) {
  my ($fenster) = @_;
  my $i;
  my $zustand;
  my $led;
  my $farbe;

  # Reset
  if ($fenster eq "Alle") {
    fhem("set statusanzeige led off");
  }
  # Loop über alle Fenster
   for ($i = 0; $i <= $#Fenster_name; $i++) {
    if ($fenster eq "Alle" || $fenster eq $Fenster_name[$i]) {
      # Aktuellen Zustand lesen
      $zustand = Value($Fenster_name[$i]);
      # LED ermitteln
      $led = $Led_name[$i];
      # Farbe setzen
      if ($zustand eq "closed") {
        $farbe = "green";
      } elsif ($zustand eq "gekippt") {
        $farbe = "orange";
      } elsif ($zustand eq "open") {
        $farbe = "red";
      } else {
        $farbe = "off";
      }
      # LED senden
      fhem("set $led led $farbe");
      # Abbruch, falls nicht für alle Fenster
      if ($fenster ne "Alle") {
        last;
      }
    }
  }
}
sub myAbfallTermine_Initialize($$)
{
my ($hash) = @_;
}

# Mülltermine auswerten
sub MuelltermineA ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtBio = '';
  my $dtYellow = '';
  my $dtRest = '';
  my $dtPapier = '';
  my $dtAltholz = '';
  my $dtSchadstoff = '';
  my $dtGruen = '';
  foreach my $uid (@uids) {
    my $Kalendertext = fhem("get AbfallA summary $uid",1);
        if ($Kalendertext =~ /Bioabfall/) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBio eq '' || ($eventDate < $dtBio && $eventDate > $t))
        {
          $dtBio = $eventDate;
          Log(3, $dtBio);
        }
    };
    if ($Kalendertext =~ /Gelbe Tonne/) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtYellow eq '' || ($eventDate < $dtYellow && $eventDate > $t))
        {
          $dtYellow  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Altpapier /) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
        }
    };
    if ($Kalendertext =~ /Bioabfall/) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtAltholz eq '' || ($eventDate < $dtAltholz && $eventDate > $t))
        {
          $dtAltholz = $eventDate;
        }
    };
    if ($Kalendertext =~ /Glas/) {
        my $dt = fhem("get AbfallA start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtSchadstoff eq '' || ($eventDate < $dtSchadstoff && $eventDate > $t))
        {
          $dtSchadstoff = $eventDate;
        }
    };

  };
  my $dayDiffB = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffB >= 0) {
    fhem("set BioabfallA $dayDiffB");
  }
  my $dayDiffG = floor(($dtYellow - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffG >= 0) {
    fhem("set GelbeTonneA $dayDiffG");
  }
  my $dayDiffR = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffR >= 0) {
    fhem("set RestmuellA $dayDiffR");
  }
  my $dayDiffP = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffP >= 0) {
    fhem("set AltpapierA $dayDiffP");
  }
  my $dayDiffH = floor(($dtAltholz - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffH >= 0) {
    fhem("set MetallA $dayDiffH");
  }
  my $dayDiffS = floor(($dtSchadstoff - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffS >= 0) {
    fhem("set GlasA $dayDiffS");
  }
  my $dayDiff = floor(($dtGruen - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set GruenA $dayDiff");
  }
}
sub MuelltermineB ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtBio = '';
  my $dtYellow = '';
  my $dtRest = '';
  my $dtPapier = '';
  my $dtAltholz = '';
  my $dtSchadstoff = '';
  my $dtGruen = '';
  foreach my $uid (@uids) {
    my $Kalendertext = fhem("get AbfallB summary $uid",1);
        if ($Kalendertext =~ /Bioabfall/) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBio eq '' || ($eventDate < $dtBio && $eventDate > $t))
        {
          $dtBio = $eventDate;
          Log(3, $dtBio);
        }
    };
    if ($Kalendertext =~ /Gelbe Tonne/) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtYellow eq '' || ($eventDate < $dtYellow && $eventDate > $t))
        {
          $dtYellow  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Altpapier /) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
        }
    };
    if ($Kalendertext =~ /Bioabfall/) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtAltholz eq '' || ($eventDate < $dtAltholz && $eventDate > $t))
        {
          $dtAltholz = $eventDate;
        }
    };
    if ($Kalendertext =~ /Glas/) {
        my $dt = fhem("get AbfallB start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtSchadstoff eq '' || ($eventDate < $dtSchadstoff && $eventDate > $t))
        {
          $dtSchadstoff = $eventDate;
        }
    };

  };
  my $dayDiffB = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffB >= 0) {
    fhem("set BioabfallB $dayDiffB");
  }
  my $dayDiffG = floor(($dtYellow - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffG >= 0) {
    fhem("set GelbeTonneB $dayDiffG");
  }
  my $dayDiffR = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffR >= 0) {
    fhem("set RestmuellB $dayDiffR");
  }
  my $dayDiffP = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffP >= 0) {
    fhem("set AltpapierB $dayDiffP");
  }
  my $dayDiffH = floor(($dtAltholz - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffH >= 0) {
    fhem("set MetallB $dayDiffH");
  }
  my $dayDiffS = floor(($dtSchadstoff - $t) / 60 / 60 / 24 + 1);
  if ($dayDiffS >= 0) {
    fhem("set GlasB $dayDiffS");
  }
}


ich bekomms doch nciht fehlerfrei hin
schade
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Deudi

Kann auf die Schnelle in "meinem" Code keinen Fehler sehen, allerdings:

Wofür ist myAbfallTermine_Initialize($$)
Lösch das mal.
Weiterhin fehlt am Ende der Datei:
1;

Probier nochmal...
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Franz Tenbrock

#23
myAbfallTermine_Initialize($$)

ist für die Mülltermine die weiter unten kommen

hab jetzt alles was mit Müll zu tun hatte rausgeschmissen
und auch den anderen code von dir noch einmal komplett neu übernommen

LED_Anzeige ist bei mir die statusanzeige, kommt an einer Stelle im code vor und habe ich da ausgetauscht

ist das ok ?

was merkwürdig ist das LED 4 nie aktualisiert wird, habe da schon alle Fensterkontakte ausprobiert :-(
wenn das Display an ist reagiert die LED absolut richtig udn genau so schnell wie die anderen
wenn ich aber das Dsiplay stromlos mache , wird die LED nie richtig angezeigt, steht immer auf off
der Rest funktioniert wie es soll


package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
use HTML::Entities;

sub  myUtils_Initialize($$)
{
   my ($hash) = $_;
}

my @Fenster_name = ("FK_Bad_EG", "FK_Buero", "FK_Essen", "TK_Essen", "FK_Keller", "FK_Kueche" , "TK_Essen", "TK_wohnen");
my @Led_name = ("statusanzeige_Led_01", "statusanzeige_Led_02", "statusanzeige_Led_03", "statusanzeige_Led_4", "statusanzeige_Led_05", "statusanzeige_Led_06" , "statusanzeige_Led_07", "statusanzeige_Led_08");


sub Update_Fenster_LED($) {
  my ($fenster) = @_;
  my $i;
  my $zustand;
  my $led;
  my $farbe;

  # Reset
  if ($fenster eq "Alle") {
    fhem("set statusanzeige led off");
  }
  # Loop über alle Fenster
for ($i = 0; $i <= $#Fenster_name; $i++) {
    if ($fenster eq "Alle" || $fenster eq $Fenster_name[$i]) {
      # Aktuellen Zustand lesen
      $zustand = Value($Fenster_name[$i]);
      # LED ermitteln
      $led = $Led_name[$i];
      # Farbe setzen
      if ($zustand eq "closed") {
        $farbe = "green";
      } elsif ($zustand eq "gekippt") {
        $farbe = "orange";
      } elsif ($zustand eq "open") {
        $farbe = "red";
      } else {
        $farbe = "off";
      }
      # LED senden
      fhem("set $led led $farbe");
      # Abbruch, falls nicht für alle Fenster
      if ($fenster ne "Alle") {
        last;
      }
    }
  }
}
1;


hier die Definition aus der fhem.cfg
sind die letzten beiden Zeilen da ok ?

######################################################################################
####                    Statusanzeige                                          ########
######################################################################################

define statusanzeige CUL_HM 20F85B
attr statusanzeige IODev hmusb
attr statusanzeige autoReadReg 4_reqStatus
attr statusanzeige expert 2_raw
attr statusanzeige firmware 1.1
attr statusanzeige model HM-OU-LED16
attr statusanzeige room Türkontakt
attr statusanzeige serialNr KEQ0123776
attr statusanzeige subType outputUnit
attr statusanzeige webCmd getConfig:clear msgEvents

define FileLog_statusanzeige FileLog ./log/statusanzeige-%Y.log statusanzeige
attr FileLog_statusanzeige logtype text
attr FileLog_statusanzeige room Türkontakt

define statusanzeige_Led_01 CUL_HM 20F85B01
attr statusanzeige_Led_01 model HM-OU-LED16
attr statusanzeige_Led_01 peerIDs 00000000,
attr statusanzeige_Led_01 room Türkontakt
#attr statusanzeige_Led_01 alias TK_ESSEN
define statusanzeige_Led_01_open notify FK_Bad_EG:open set statusanzeige_Led_01 led red
define statusanzeige_Led_01_closed notify FK_Bad_EG:closed set statusanzeige_Led_01 led green

define statusanzeige_Led_02 CUL_HM 20F85B02
attr statusanzeige_Led_02 model HM-OU-LED16
attr statusanzeige_Led_02 peerIDs 00000000,
attr statusanzeige_Led_02 room Türkontakt
#attr statusanzeige_Led_02 alias FK_ESSEN
define statusanzeige_Led_02_open notify FK_Buero:open set statusanzeige_Led_02 led red
define statusanzeige_Led_02_closed notify FK_Buero:closed set statusanzeige_Led_02 led green

define statusanzeige_Led_03 CUL_HM 20F85B03
attr statusanzeige_Led_03 model HM-OU-LED16
attr statusanzeige_Led_03 peerIDs 00000000,
attr statusanzeige_Led_03 room Türkontakt
#attr statusanzeige_Led_03 alias TK_WOHNZIMMER
define statusanzeige_Led_03_open notify FK_Essen:open set statusanzeige_Led_03 led red
define statusanzeige_Led_03_closed notify FK_Essen:closed set statusanzeige_Led_03 led green

define statusanzeige_Led_04 CUL_HM 20F85B04
attr statusanzeige_Led_04 model HM-OU-LED16
attr statusanzeige_Led_04 peerIDs 00000000,
attr statusanzeige_Led_04 room Türkontakt
#attr statusanzeige_Led_04 alias FK_KUECHE
define statusanzeige_Led_04_open notify TK_Essen:open set statusanzeige_Led_04 led red
define statusanzeige_Led_04_closed notify TK_Essen:closed set statusanzeige_Led_04 led green

#define statusanzeige_Led_04_open notify FK_Kueche:open set statusanzeige_Led_04 led red
#define statusanzeige_Led_04_closed notify FK_Kueche:closed set statusanzeige_Led_04 led green


define statusanzeige_Led_05 CUL_HM 20F85B05
attr statusanzeige_Led_05 model HM-OU-LED16
attr statusanzeige_Led_05 peerIDs 00000000,
attr statusanzeige_Led_05 room Türkontakt
#attr statusanzeige_Led_05 alias FK_BUERO
define statusanzeige_Led_05_open notify FK_Keller:open set statusanzeige_Led_05 led red
define statusanzeige_Led_05_closed notify FK_Keller:closed set statusanzeige_Led_05 led green


define statusanzeige_Led_06 CUL_HM 20F85B06
attr statusanzeige_Led_06 model HM-OU-LED16
attr statusanzeige_Led_06 peerIDs 00000000,
attr statusanzeige_Led_06 room Türkontakt
#attr statusanzeige_Led_06 alias FK_BAD
define statusanzeige_Led_06_open notify FK_Kueche:open set statusanzeige_Led_06 led red
define statusanzeige_Led_06_closed notify FK_Kueche:closed set statusanzeige_Led_06 led green

define statusanzeige_Led_07 CUL_HM 20F85B07
attr statusanzeige_Led_07 model HM-OU-LED16
attr statusanzeige_Led_07 peerIDs 00000000,
attr statusanzeige_Led_07 room Türkontakt
#attr statusanzeige_Led_07 alias K_GARAGE
define statusanzeige_Led_07_open notify TK_Essen:open set statusanzeige_Led_07 led red
define statusanzeige_Led_07_closed notify TK_Essen:closed set statusanzeige_Led_07 led green


define statusanzeige_Led_08 CUL_HM 20F85B08
attr statusanzeige_Led_08 model HM-OU-LED16
attr statusanzeige_Led_08 peerIDs 00000000,
attr statusanzeige_Led_08 room Türkontakt
#attr statusanzeige_Led_08 alias FK_KELLER
define statusanzeige_Led_08_open notify TK_wohnen:open set statusanzeige_Led_08 led red
define statusanzeige_Led_08_closed notify TK_wohnen:closed set statusanzeige_Led_08 led green


define statusanzeige_Led_09 CUL_HM 20F85B09
attr statusanzeige_Led_09 model HM-OU-LED16
attr statusanzeige_Led_09 peerIDs 00000000,

define statusanzeige_Led_10 CUL_HM 20F85B0A
attr statusanzeige_Led_10 model HM-OU-LED16
attr statusanzeige_Led_10 peerIDs 00000000,

define statusanzeige_Led_11 CUL_HM 20F85B0B
attr statusanzeige_Led_11 model HM-OU-LED16
attr statusanzeige_Led_11 peerIDs 00000000,

define statusanzeige_Led_12 CUL_HM 20F85B0C
attr statusanzeige_Led_12 model HM-OU-LED16
attr statusanzeige_Led_12 peerIDs 00000000,

define statusanzeige_Led_13 CUL_HM 20F85B0D
attr statusanzeige_Led_13 model HM-OU-LED16
attr statusanzeige_Led_13 peerIDs 00000000,

define statusanzeige_Led_14 CUL_HM 20F85B0E
attr statusanzeige_Led_14 model HM-OU-LED16
attr statusanzeige_Led_14 peerIDs 00000000,

define statusanzeige_Led_15 CUL_HM 20F85B0F
attr statusanzeige_Led_15 model HM-OU-LED16
attr statusanzeige_Led_15 peerIDs 00000000,

define statusanzeige_Led_16 CUL_HM 20F85B10
attr statusanzeige_Led_16 model HM-OU-LED16
attr statusanzeige_Led_16 peerIDs 00000000,

########################################################################
##########        Statusanzeige abfragen
###http://forum.fhem.de/index.php/topic,25539.msg387495.html#msg387495
########################################################################

define LED_Anzeige_powerOn notify statusanzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}
attr LED_Anzeige_powerOn room Türkontakt


und wenn ich nach shtudown restart ins logfile schaue kommt das hier bei dem code


2016.01.09 14:50:31 1: reload: Error:Modul 99_myutils deactivated:

2016.01.09 14:50:31 1: Including fhem.cfg
Subroutine Update_Fenster_LED redefined at ./FHEM/99_myUtils.pm line 12, <$fh> line 4.
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Deudi

In deinem Array Led_name fehlt bei Led 4 die führende 0  :o
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Deudi

Ausserdem kannst du deine ganzen Notify durch ein einziges ersetzten, dann macht auch meine Funktion mehr Sinn:
define statusanzeige_Led_update notify (T|F)K_.*:(open|closed) { Update_Fenster_LED("$NAME") }
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Franz Tenbrock

Hallo
thanks
manchmal hat man einfach Tomaten auf den Augen 04 klar , als BVB Fan kann das passieren  ;D

define statusanzeige_Led_update notify (T|F)K_.*:(open|closed) { Update_Fenster_LED("$NAME") }

das klappt allerdings noch nicht
er bekommt das powerOn.* noch nicht mit

das hier hab ich verstanden
(T|F)K_.*:(open|closed) { Update_Fenster_LED("$NAME") }

klasse abgekürzt  8)

das hier schaltet das dsiplay an ?!
define LED_Anzeige_powerOn notify statusanzeige:powerOn.*

und das hier ist eine Zeitverzögerung damit das Dsiplay nachkommt?!
at +00:00:10

ich hab erst mal den alten code, damit klappt es, aber nur wenn ich nach einen restart die datei myutils zum editieren starte und dann beende
im logfile zeigt er mir immer noch das das


2016.01.09 19:08:34 0: Server shutdown
2016.01.09 19:08:39 1: reload: Error:Modul 99_myutils deactivated:

es funktioniert ja erst mal. Ich werde es mal am Bestimmungsort montieren.
ev muss ich ja den Bewegungsmelder im Erfassungsbereich noch etwas einschränken damit es nicht zu häufig angeht.
schaun wir mal
:-)

klasse wie hier immer wieder geholfen wird.
werde den Fehler im Wiki mal ändern.

ev bekommen wir dasmit dem eleganteren Code ja auch noch hin

cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Deudi

Zitat von: Franz Tenbrock am 09 Januar 2016, 19:13:52
das klappt allerdings noch nicht
er bekommt das powerOn.* noch nicht mit
Nee, dafür ist es auch nicht gedacht. Das notify für powerOn muss bleiben. Das andere ersetzt diejenigen für die ganzen Tür- und Fensterkontakte.
Zitat
das hier hab ich verstanden
(T|F)K_.*:(open|closed) { Update_Fenster_LED("$NAME") }
Gut.
Zitat
das hier schaltet das dsiplay an ?!
define LED_Anzeige_powerOn notify statusanzeige:powerOn.*
Ja.
Zitat
und das hier ist eine Zeitverzögerung damit das Dsiplay nachkommt?!
at +00:00:10
Ja.

Zitat
ich hab erst mal den alten code, damit klappt es, aber nur wenn ich nach einen restart die datei myutils zum editieren starte und dann beende
im logfile zeigt er mir immer noch das das

2016.01.09 19:08:34 0: Server shutdown
2016.01.09 19:08:39 1: reload: Error:Modul 99_myutils deactivated:

Das verstehe ich nicht. Was machst du im Detail? Was bedeutet "wenn ich nach einen restart die datei myutils zum editieren starte und dann beende" ?
Die Datei heißt 99_myUtils.pm und sowohl FHEM als auch Perl unterscheiden Groß- und Kleinschreibung. Das muss alles ganz genau stimmen - wie das vergessene "1;" am Ende, die im Wiki aber stand. Du musst immer ganz genau darauf achten wie du was schreibst...

Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Franz Tenbrock

Hallo
ja ich weiß
Programmsprachen sind nicht fehlertolerant
ein Zeichen zu früh zu spät oder wenn was fehlt und schon geht nichts mehr
aber ich werde ja schon besser, am Anfang hab ich nur Bahnhof verstanden.

als Mediziner hat man es einfacher, wenn auch jeder Mensch ein Individuum ist

Also wenn ich in der Kommadozeile von fhem
shutdown restart eingeben um fhem komplett neu zu starten

und dann in das logfile sehe
dann steht da das die 99_myutils deactiviert wird.

2016.01.09 20:32:30 0: Server shutdown
2016.01.09 20:32:35 1: reload: Error:Modul 99_myutils deactivated:

gerade noch einmal ausprobiert
funktioniert trotzdem alles  :D

dann vergessen wir mal das was da im log steht...

was ich aber noch nicht ganz verstehe ist
define LED_Anzeige_powerOn notify statusanzeige:powerOn.* define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}

hier stehen zwei define in einer Zeile
ist das identisch wenn ich daraus zwei Zeilen mache ?
define LED_Anzeige_powerOn notify statusanzeige:powerOn.*
define UF_LED_Anzeige_powerOn at +00:00:10 {Update_Fenster_LED("Alle")}

das war dein neuer code
define statusanzeige_Led_update notify (T|F)K_.*:(open|closed) { Update_Fenster_LED("$NAME") }

"Alle" wurde durch "$NAME" ersetzt
(T|F)K_.*:(open|closed)  schaut ob alle Tür Fenster Kontakte open oder closed sind.

kann man sich damit die Schleife in der 99_myUtils.pm sparen??
sub Update_Fenster_LED
...

?
also nur noch Zuordnung der Namen zu den Leds der statusanzeige?
die ersten beiden Zeilen in der 99_myUtils
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Deudi

Zitat von: Franz Tenbrock am 09 Januar 2016, 20:47:11
hier stehen zwei define in einer Zeile
ist das identisch wenn ich daraus zwei Zeilen mache ?
Nein, ist es nicht. Wenn das Display eingeschaltet wird, wird das Notify ausgelöst. Darin wird ein at definiert, dass in 10 Sekunden einmalig etwas tut und dann gelöscht wird.
Zitat
"Alle" wurde durch "$NAME" ersetzt
(T|F)K_.*:(open|closed)  schaut ob alle Tür Fenster Kontakte open oder closed sind.
Nein, du hast meine Funktion immer noch nicht verstanden und - sorry - schreibst dann einen wiki Eintrag?

Bei obigem Notify steht in $Name der Name des Tür-/Fensterkontaktes, der gerade betätigt wurde. Das Problem ist nun herauszufinden welche Led für dieses Fenster zuständig ist. Dafür gibt es die beiden Listen. Led1 gehört zum ersten Kontakt in der Fenster Liste, Led2 zum zweiten usw. Die Funktion wird mit dem Namen aufgerufen und sucht nun in der Schleife den gleichen Namen. Dann haben wir den Index und wissen welche Led es ist. Dann wird der Zustand des Kontakts ermittelt, die gewünschte Farbe dazu und gesendet. Ist der Kontakt gefunden, bricht die Schleife ab.
Die zweite Verwendung der gleichen Funktion ist für powerOn. Dann wird an die Funktion statt einem Namen der Text "Alle" übergeben und die Funktion updated alle Leds.

Jetzt verstanden? Bring das mal zum Laufen, dann kannst du noch Kosmetik machen, z.B. die Abfrage auf "gekippt" löschen, da du offensichtlich keine Drehgriffsensoren hast.

Gruß und gute N8
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch