Hallo,
nach vielen Stunden lesen zu Stringvergleich ,Nummernvergleich,Listen und initialisieren von Variablen in Perl und Ausprobieren an der fraglichen Datei komme ich einfach nicht mehr weiter und bitte um gedankliche Unterstützung.
folgende Meldungen müllen mir alle 15 Minuten mein Log voll, aber an sich funktioniert der Code zur Heizungssteuerung schon etliche Monate lang.
Es handelt sich um diesen etwas angepassten Code aus den fhem Code Shnippets zu FHT 8v direkt ansteuern.
Use of uninitialized value $zeilen_werte[0] in string ne at ./FHEM/99_myUtils.pm line 35.
Use of uninitialized value $zeilen_werte[0] in string eq at ./FHEM/99_myUtils.pm line 37.
Use of uninitialized value in numeric eq (==) at ./FHEM/99_myUtils.pm line 54.
Use of uninitialized value in numeric eq (==) at ./FHEM/99_myUtils.pm line 56.
line 36 ist hier : if (($zeilen_werte[0]) ne "#"){
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
use Time::Local;
sub
sucheSchaltzeit() {
## Ermittle aktuelle Rechnerzeit /datum/ zeit/ tag etc. ######################
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $jetztzeit = time();
my @Zeilen = ("");
#my @zeilen_werte = ("");
# oeffne Steuerdatei nur zum Lesen
open(HEIZDAT,'<','./FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
while(<HEIZDAT>)
{
push(@Zeilen,$_);
}
close(HEIZDAT);
## entferne alle \n-Zeichen
chomp (@Zeilen);
for(@Zeilen)
{
# in $_ steht die aktuelle Zeile und die wird per Leerzeichen aufgedroeselt
my @zeilen_werte = split(/ /,$_);
### Abfrage ob es eine Kommentarzeile ist - Kennzeichen ein #
if (($zeilen_werte[0]) ne "#"){
#Abfrage ob Urlaubszeit (Minimum)
if (($zeilen_werte[0]) eq "MINIMUM"){
### Minimumzeitraum berechnen
my $sekunde_tmp = "0";
my @array_datumsplit = split(/\./, $zeilen_werte[1]);
my @array_zeitsplit = split(/:/, $zeilen_werte[2]);
my $minimum_begin = timelocal($sekunde_tmp,$array_zeitsplit[1],$array_zeitsplit[0],$array_datumsplit[0],$array_datumsplit[1]-1,$array_datumsplit[2]-1900);
my @array_datumsplit2 = split(/\./, $zeilen_werte[3]);
my @array_zeitsplit2 = split(/:/, $zeilen_werte[4]);
### Endzeit = eingetragen Endzeit - 1 Tag
my $minimum_ende = timelocal($sekunde_tmp,$array_zeitsplit2[1],$array_zeitsplit2[0],$array_datumsplit2[0],$array_datumsplit2[1]-1,$array_datumsplit2[2]-1900) - 86400;
if (($jetztzeit > $minimum_begin ) && ( $jetztzeit < $minimum_ende)) {
Log 3, "Habe Urlaub Heizung auf 17 Grad Minimum Jetzt: $jetztzeit Start:$minimum_begin Ende:$minimum_ende";
fhem "set Heizkoerper_Buero_desired_temp 17" ;
fhem "set Heizkoerper_Kueche_desired_temp 17" ;
}
} else {
### Abfrage ob heute entsprechender Tag
if ($zeilen_werte[0] == $Wochentag){
## abpruefen ob Stunde erreicht
if ($zeilen_werte[1] == $Stunde){
## abpruefen ob Minute erreicht
if ($zeilen_werte[2] == $Minute){
#### Jetzt Name des Antriebs und Dummys und Zieltemp einlesen sowie Befehle absetzen
fhem "set " . $zeilen_werte[3] . " desired " . $zeilen_werte[5] ;
fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5] ;
Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
}}}
} # Endif Minimum
} # Endif # Kommentar
} # EndeFor
}
################### Ende SUB sucheSchaltzeit
1;
##################
Hat jemand mit Perl Kenntnissen einen Tipp für mich wo ich noch ansetzen könnte um auf meinem Raspberry das Log und Programm sauber am laufen zu bekommen.
wie es scheint dreht es sich alles um $zeilen_werte[0]
Danke für die Hirnakrobatik sagt schon mal
Hans-Jürgen
Wenn du des auskommentierst, wird's auch nie initialisiert werden :)
#my @zeilen_werte = ("");
@Icinger: Das Array @zeilen_werte wird doch an einer anderen Stelle initialisiert ;)
@Deckoffizier: wenn das Array @Zeilen leer ist, liefert der split keine Werte zurück, dann bleibt auch das Array @zeilen_werte leer und es gibt kein Element [null] Bau mal nach dem split folgende Zeile ein: "next unless defined($zeilen_werte[0])"
Irgendwie solltest Du aber besser die Logik Deiner Funktion nochmal überdenken.
Upps, stimmt, übersehen :(
Hallo,
Habe es gleich ausprobiert.
Vorweg, Vielen DANK Betateilchen habe Deinen Code mit ; am Ende eingefügt und weiter unten == gegen eq getauscht und schon mal ohne Fehler im Log fhem neugestartet.
Hmm etwas beunruhigt mich noch... hoffentlich bleibt naechsten Sontag die Bude nicht kalt ?
weil in der Heizzeiten.cfg für den ersten Wert für mich der zeilen_wert[0] eben 0 ist ?
Auszug
##### Hier werden die Heizzeiten definiert
# 0-6 Wochentag beginnt mit Sonntag
# 00-23 Volle Stunde
# 00 oder 15 oder 30 oder 45 Minute
#### Wochenschaltzeiten####################
# Sonntag
0 08 00 Heizung_Buero Heizkoerper_Buero_desired_temp 21
0 22 00 Heizung_Buero Heizkoerper_Buero_desired_temp 18
0 06 00 Heizung_Kueche Heizkoerper_Kueche_desired_temp 21
0 21 00 Heizung_Kueche Heizkoerper_Kueche_desired_temp 18
############################################
# Montag
1 08 00 Heizung_Buero Heizkoerper_Buero_desired_temp 21
1 21 00 Heizung_Buero Heizkoerper_Buero_desired_temp 18
1 06 00 Heizung_Kueche Heizkoerper_Kueche_desired_temp 21
1 21 00 Heizung_Kueche Heizkoerper_Kueche_desired_temp 18
Jetzt mit meiner null Ahnung......
Das Array @Zeilen bekommt doch seine Werte ueber push aus der Datei Heizzeiten.
Wenn ich den Befehl,Anweisung richtig verstehe...
Fügt ein oder mehrere neue Elemente an das Ende eines Arrays an.
Wenn die Betonung auf das Ende liegt muss ja eventuell davor schon mal was sein und wenn es fehlt daher dieses uninitialisiert einer Variablen??
Wir werden sehen oder fühlen :-)
##########
@ Icinger auch Dir DANK für die Mühe.
Ja das mit dem auskommentieren war im Orginal so und hatte ich auch als erstes in der Vermutung und vorher auch auskommentiert gehabt in den vielen Versuchen meinerseits.
Aber......... ist mir wichtig möchte mich nicht mit fremden Federn schmücken der Code auch wenn vielleicht nicht ganz stimmig stammt nicht von mir und wäre froh wenn ich mich mit Perl soweit Auskennen würde.
Einen angenehmen Sonntag Abend noch wünscht
Hans-Jürgen
Den selben Code habe ich auch im Einsatz, nur ein klein wenig erweitert :)
Läuft seit über einem Jahr einwandfrei
Aber, nimm hier einfach die Leerzeile raus, damit solle sich das erledigt haben:
##### Hier werden die Heizzeiten definiert
# 0-6 Wochentag beginnt mit Sonntag
# 00-23 Volle Stunde
# 00 oder 15 oder 30 oder 45 Minute
#### Wochenschaltzeiten####################
# Sonntag
So, wie my @zeilen_werte definiert wird, gilt es immer nur in dem jeweiligen For-Next-Durchlauf.
Sobald jetzt die For-Schleife zu der Leerzeile kommt, gibt es da nichts, was gesplittet werden kann, und somit wird zeilen_werte auch nicht initialisiert.
lg, Ici
Hallo Icinger,
Du kniest Dich zwar rein aber leider auf der falschen Fährte von mir gelegt sorry !
Die Leerzeile ist in der Heizzeiten Datei an keiner Stelle vorhanden copy paste als Auszug geschuldet.
Bis jetzt ist erstmal alles in Ordnung und werde es weiter beobachten (tagwechsel,wochenwechsel).
Danke für die Mühe !
Hans-Jürgen