[gelöst] Perl, Array, i-tes Element, did you forgot...

Begonnen von KNUT345, 27 März 2022, 17:25:43

Vorheriges Thema - Nächstes Thema

KNUT345

Hallo Zusammen,
ich habe mir für meine Licht- und Heizungssteuerung eine Lösung gebaut,
mit der ich anhand meiner Weckzeit abhängige Zeiten per DOIF einstellen kann.
Funktioniert alles schon soweit, aber ich würde es gerne etwas flexibler gestalten
und was mir da einfach nicht gelingen will ist die Ausgabe eines i-ten Elements aus einem zuvor erzeugten Array.
Mit:
$myTemp = $myArray[$i];;
bekomme ich
..did you forget to declare "my $myGeraete"?..

Das Array habe ich zuvor dynamisch erzeugt mit:

my @myArray;;
@myArray = (@myArray, $newFeld);;

Wenn ich das Array über foreach ausgebe, dann passt das auch.
Wenn ich das i-te Feld über:
$myTemp = $myArray[1];;
dann passt es auch.

Ich kann mir ungefähr vorstellen woran es liegt,
aber ich komme einfach nicht auf den Dreh.

Hat mir jemand einen Tipp?

Danke im Voraus und Grüße
Knut

betateilchen

Zitat von: KNUT345 am 27 März 2022, 17:25:43
Mit:
$myTemp = $myArray[$i];;
bekomme ich
..did you forget to declare "my $myGeraete"?..

Das kann nicht sein, $myGeraete kommt in dem Codeschnipsel vorher gar nicht vor, da gibt es nur $myTemp und $myArray[].
Zumindest stammt die Fehlermeldung nicht von der zitierten Codestelle.

Was willst Du eigentlich hier tatsächlich machen?

@myArray = (@myArray, $newFeld);;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KNUT345

Ok, myGeraete ist copy und paste Fehler.
myGeraete sollte myArray heißen
also
..did you forget to declare "my $myArray"?..

@myArray = (@myArray, $newFeld);
Das ist meine Variante ein neues Feld dem Array anzufügen,
ok, weiß mittlerweile dass push() da das bessere Mittel wäre.
also sowas

my @myArray;;
@myArray = (@myArray,"1");;
@myArray = (@myArray,"2");;
@myArray = (@myArray,"2");;


womit dann
@myArray = ("1","2","3")
Wenn man es so betrachtet ist das wie push nur ohne das Schlüsselwort.

Sorry für die Verwirrung.

betateilchen

Zeig doch mal den kompletten Code, um den es hier geht.
Mit dem bisher präsentierten Stückwerk kommt man nicht gut weiter.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KNUT345


defmod Wecker_Knut_DOIF DOIF (["Wecker_Knut:^go"])\
{ my @EVT = split(/ /,"$EVENT");;;;\
  my $Nr = substr($EVT[0],2,-1);;;;\
  my $einNeu = "";;;;\
  my $ausNeu = "";;;;\
  ## Auswerten\
  if ($EVT[1] eq "on") {\
    my $myProfil2 = ReadingsVal("$DEVICE","Profil$Nr","unbenutzt");;;;\
    my $myWeck = ReadingsVal("$DEVICE","ein$Nr","00:00");;;;\
    my $myWeckerStr = "xx,xx,xx,xx§".ReadingsVal("$DEVICE","LGeraete$Nr","xx")."§".ReadingsVal("$DEVICE","HGeraete$Nr","xx");;;;\
    my @myWecker = split(/§/,"$myWeckerStr");;;;\
    my @tmpWecker;;;;\
    my @myGeraete;;;;\
    my @myNr;;;;\
    my $myNr;;;;\
    my @myEin;;;;\
    my $myEin;;;;\
    my @myAus;;;;\
    my $myAus;;;;\
    my $myI = -1;;;;\
    my $myGeraet1;;;;\
    my $myGeraet2;;;;\
    my $myProfil1;;;;\
    my $myTempE;;;;\
    my $myTempA;;;;\
    my $myTempEN;;;;\
    my $myTempAN;;;;\
    ## Log 3, "$DEVICE - $EVENT - $myWeckerStr";;;;\
    ## Log 3, "Mein Wecker - @myWecker";;;;\
    foreach my $myWeckStr (@myWecker) {\
      @tmpWecker = split(/,/,"$myWeckStr");;;;\
      @myGeraete = (@myGeraete,$tmpWecker[0]);;;;\
      @myNr = (@myNr,$tmpWecker[1]);;;;\
      @myEin = (@myEin,$tmpWecker[2]);;;;\
      @myAus = (@myAus,$tmpWecker[3]);;;;\
      $myI = $myI + 1;;;;\
      ## Log 3, "$myWeckStr - $tmpWecker[0]";;;;\
    }\
    ## foreach my $i (0..$#myGeraete) {\
      ## Log 3, "$i - $myGeraete[$i]";;;;\
    ## }\
    ## Log 3, "$myGeraete[$myI-1]";;;;\
    ## Log 3, "Meine Anz  Geräte - $myI";;;;\
    ## Log 3, "Meine dyn. Geräte - @myGeraete";;;;\
    ## Log 3, "Meine dyn. Felder - @myNr";;;;\
    ## Log 3, "Meine dyn. Ein    - @myEin";;;;\
    ## Log 3, "Meine dyn. Aus    - @myAus";;;;\
    ##\
    ## Setzen der Lichtszenen\
    for my $i (1..10) {\
      $myGeraet1 = ReadingsVal("LichtSzene_Knut","Geraet$i","unbenutzt");;;;\
      $myProfil1 = ReadingsVal("LichtSzene_Knut","Profil$i","unbenutzt");;;;\
      for my $j (1..$myI) {\
        if ($j==1) {$myGeraet2=$myGeraete[1];;;;$myNr=$myNr[1];;;;$myEin=$myEin[1];;;;$myAus=$myAus[1];;;;}\
        elsif ($j==2) {$myGeraet2=$myGeraete[2];;;;$myNr=$myNr[2];;;;$myEin=$myEin[2];;;;$myAus=$myAus[2];;;;}\
        elsif ($j==3) {$myGeraet2=$myGeraete[3];;;;$myNr=$myNr[3];;;;$myEin=$myEin[3];;;;$myAus=$myAus[3];;;;}\
        elsif ($j==4) {$myGeraet2=$myGeraete[4];;;;$myNr=$myNr[4];;;;$myEin=$myEin[4];;;;$myAus=$myAus[4];;;;}\
        elsif ($j==5) {$myGeraet2=$myGeraete[5];;;;$myNr=$myNr[5];;;;$myEin=$myEin[5];;;;$myAus=$myAus[5];;;;}\
        elsif ($j==6) {$myGeraet2=$myGeraete[6];;;;$myNr=$myNr[6];;;;$myEin=$myEin[6];;;;$myAus=$myAus[6];;;;}\
        $myTempE = ReadingsVal("LichtSzene_Knut","ein$i$myNr","00:00");;;;\
        $myTempA = ReadingsVal("LichtSzene_Knut","aus$i$myNr","00:00");;;;\
        ## Log 3, "Mein Gerät - $j - $myGeraet2";;;;\
        if ($myGeraet1 eq $myGeraet2 and $myProfil1 eq $myProfil2) {\
          Log 3,"$myGeraet1 nach Comfort Wecker $myProfil1 stellen.";;;;\
          $myTempEN = substr($myEin,1);;;;\
          $myTempAN = substr($myAus,1);;;;\
          ## $myTemp = substr($myEin,1)).":00";;;;\
          if (substr($myEin,0,1) eq "-") {\
            $myTempEN = substr(TU_Get_Decrement($myWeck.":00",$myTempEN.":00"),0,5);;;;\
          } else {\
            $myTempEN = substr(TU_Get_Increment($myWeck.":00",$myTempEN.":00"),0,5);;;;\
          }\
          $myTempAN = substr(TU_Get_Increment($myWeck.":00",$myTempAN.":00"),0,5);;;;\
          ## Log 3, "mein Ein$i$myNr Alt - $myTempE -> $myTempEN";;;;\
          ## Log 3, "mein Aus$i$myNr Alt - $myTempA -> $myTempAN";;;;\
          fhem("setreading LichtSzene_Knut ein$i$myNr"." $myTempEN");;;;\
          fhem("setreading LichtSzene_Knut aus$i$myNr"." $myTempAN");;;;\
        }\
      }\
    }\
    ##\
    ## Setzen der Heizung\
    for my $i (1..12) {\
      $myGeraet1 = ReadingsVal("HeizungProfil_Knut","Zimmer$i","unbenutzt");;;;\
      $myProfil1 = ReadingsVal("HeizungProfil_Knut","Profil$i","unbenutzt");;;;\
      for my $j (1..$myI) {\
        if ($j==1) {$myGeraet2=$myGeraete[1];;;;$myNr=$myNr[1];;;;$myEin=$myEin[1];;;;$myAus=$myAus[1];;;;}\
        elsif ($j==2) {$myGeraet2=$myGeraete[2];;;;$myNr=$myNr[2];;;;$myEin=$myEin[2];;;;$myAus=$myAus[2];;;;}\
        elsif ($j==3) {$myGeraet2=$myGeraete[3];;;;$myNr=$myNr[3];;;;$myEin=$myEin[3];;;;$myAus=$myAus[3];;;;}\
        elsif ($j==4) {$myGeraet2=$myGeraete[4];;;;$myNr=$myNr[4];;;;$myEin=$myEin[4];;;;$myAus=$myAus[4];;;;}\
        elsif ($j==5) {$myGeraet2=$myGeraete[5];;;;$myNr=$myNr[5];;;;$myEin=$myEin[5];;;;$myAus=$myAus[5];;;;}\
        elsif ($j==6) {$myGeraet2=$myGeraete[6];;;;$myNr=$myNr[6];;;;$myEin=$myEin[6];;;;$myAus=$myAus[6];;;;}\
        $myTempE = ReadingsVal("HeizungProfil_Knut","ein$i$myNr","00:00");;;;\
        $myTempA = ReadingsVal("HeizungProfil_Knut","aus$i$myNr","00:00");;;;\
        ## Log 3, "Mein Gerät - $j - $myGeraet2";;;;\
        if ($myGeraet1 eq $myGeraet2 and $myProfil1 eq $myProfil2) {\
          Log 3,"$myGeraet1 nach Comfort Wecker $myProfil1 stellen.";;;;\
          $myTempEN = substr($myEin,1);;;;\
          $myTempAN = substr($myAus,1);;;;\
          ## $myTemp = substr($myEin,1)).":00";;;;\
          if (substr($myEin,0,1) eq "-") {\
            $myTempEN = substr(TU_Get_Decrement($myWeck.":00",$myTempEN.":00"),0,5);;;;\
          } else {\
            $myTempEN = substr(TU_Get_Increment($myWeck.":00",$myTempEN.":00"),0,5);;;;\
          }\
          $myTempAN = substr(TU_Get_Increment($myWeck.":00",$myTempAN.":00"),0,5);;;;\
          ## Log 3, "mein Ein$i$myNr Alt - $myTempE -> $myTempEN";;;;\
          ## Log 3, "mein Aus$i$myNr Alt - $myTempA -> $myTempAN";;;;\
          fhem("setreading HeizungProfil_Knut ein$i$myNr"." $myTempEN");;;;\
          fhem("setreading HeizungProfil_Knut aus$i$myNr"." $myTempAN");;;;\
        }\
      }\
    }\
  }\
  ##\
  fhem("setreading $DEVICE go$Nr off");;;;\
}
attr Wecker_Knut_DOIF do always


KNUT345

Ich denke es hat was mit der Variablendeklaration zu tun,
denn so funktioniert es.

defmod at_Test at *00:00:05 {\
  my @myArray = ("xx,xx,xx,xx","xx,xx,xx,xx","xx,xx,xx,xx","xx,xx,xx,xx");;\
  Log 3, "Mein Array: @myArray";;\
  # $myArray[0] = "11,11,11,11";;\
  # $myArray[1] = "22,22,22,22";;\
  for my $i (0..2) {\
    $myArray[$i] = $myArray[$i]."$i$i";;\
    Log 3, "Mein Array $i: $myArray[$i]";;  \
  }\
}


2022.03.31 17:56:29 3: Mein Array: xx,xx,xx,xx xx,xx,xx,xx xx,xx,xx,xx xx,xx,xx,xx
2022.03.31 17:56:29 3: Mein Array 0: xx,xx,xx,xx00
2022.03.31 17:56:29 3: Mein Array 1: xx,xx,xx,xx11
2022.03.31 17:56:29 3: Mein Array 2: xx,xx,xx,xx22

KNUT345

Fehler gefunden, es lag am fehlenden Update.
Grüße
Knut