1
2
m/./ # . steht hier für ein beliebiges Zeichen
m/\./ # hier ist explizit nur der Punkt gemeint, keine Sonderbedeutung mehr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub
RelaisKontrolle
{
open(DATEI,"kontrolle.lh");
while (<DATEI>){
my $soll = $_; #liest die nächste Zeile ein
chop($soll); #entfernt den Zeilenumbruch
my $ist = $soll."k"; #Ist - Item ist immer + "k"
my $isoll = ReadingsVal ($soll,"state",""); #Inhalt IST - Reading
my $iist = ReadingsVal ($ist,"state",""); #Inhalt SOLL - Reading
if (ReadingsVal ($isoll,"state","") ne ReadingsVal ($isoll,"state","")) {
fhem("set pushmsg message Fehler $isoll $iist")
} else {
fhem("set pushmsg message Alles ok");
}
}
}
2023-02-01T12:43:56 lern_nochDas Ausblenden des Unterstrichs geschieht bereits in der Zeile
my $soll = $_;
Aus v_21 wird dann v <neue Zeile> 21.
open(my $datei, '<', 'kontrolle.lh');
while (my $soll = <$datei>){
chomp($soll);
2023-02-01T12:43:56 lern_nochSollten da nicht einfach $isoll und $iist verglichen werden?Code (perl): (dl )if (ReadingsVal ($isoll,"state","") ne ReadingsVal ($isoll,"state","")) {
2023-02-01T19:40:49 haj
- Anstelle der impliziten Nutzung von $_ solltest Du Deine Zeilen gleich in eine "eigene" Variable schreiben:
Code (perl): (dl )while (my $soll = $datei){
while (my $soll = <$datei>){ ... }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
sub RelaisKontrolle { open( my $datei,'<', 'kontrolle.lh'); # Ausgabepfad evtl. anpassen, wenn es nicht auf Linux ist # Fehlerbehandlung sparen wir uns ausnahmsweise mal open( my $prueflog, '>', '/tmp/kontrolle.txt' ); while (my $soll = <$datei>){ if ($prueflog) { print $prueflog "GELESEN: >$soll<"; } chomp($soll); #entfernt den Zeilenumbruch if ($prueflog) { print $prueflog "OHNE UMBRUCH: >$soll<\n"; } my $ist = $soll."k"; #Ist - Item ist immer + "k" my $isoll = ReadingsVal ($soll,"state",""); #Inhalt IST - Reading my $iist = ReadingsVal ($ist,"state",""); #Inhalt SOLL - Reading # sinnfreier Vergleich, wie von haj schon angemerkt if (ReadingsVal ($isoll,"state","") ne ReadingsVal ($isoll,"state","")) { fhem("set pushmsg message Fehler $isoll $iist"); } else { fhem("set pushmsg message Alles ok"); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13
if ($prueflog) { my @loc_time = localtime(); print $prueflog "Startzeit: ", ">", $loc_time[3], $loc_time[4] + 1, $loc_time[5] + 1900, $loc_time[2], $loc_time[1], $loc_time[0], "<\n"; }
2023-02-07T11:45:40 lern_nochIch habe versucht die Startzeit des Scripts mit in die log-Datei zu schreiben. Macht er aber nicht, sondern localtime... kommt uninterpretiert im Klartext ins log. Sicher eine Frage von Klammern etc., meine Versuche sind gescheitert.
2023-02-07T11:45:40 lern_nochif ($prueflog) { print $prueflog "Startzeit: >localtime[3,[4]+1,[5]+1900,2,1,0]<\n"; }
Warum steht (was ja funktioniert) ein Semikolon als letztes Zeichen vor der geschwungenen Klammer? Ist das unnötig und erfolgt nur aus "Gewohnheit"?
1 2 3 4 5 6 7 8 9 10 11 12
if ($prueflog) { my @loc_time = localtime(time); print $prueflog "Startzeit: ", # Ausgabe an das Dateihandle $prueflog ">", # und hier folgen weitere auszugebende Zeicenketten $loc_time[3], $loc_time[4] + 1, $loc_time[5] + 1900, $loc_time[2], $loc_time[1], $loc_time[0], "<\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13
printf $prueflog # $prueflog ist das Dateihandle # Format der Ausgabe "%s%02d.%02d.%4d %02d:%02d:%02d%s", # Hier die Zeichenketten so wie sie laut Format nacheinander ausgegeben werden sollen "Startzeit: >", $loc_time[3], $loc_time[4] + 1, $loc_time[5] + 1900, $loc_time[2], $loc_time[1], $loc_time[0], "<\n";