Hallo,
ich habe meinen Gaszäher mit einer Kamera ausgelesen
+*00:01:00 {system ("
sudo raspistill -vf -hf -o /opt/fhem/www/pgm2/webcambild.jpg -w 640 -h 480&
sudo convert /opt/fhem/www/pgm2/webcambild.jpg -rotate 3 -crop 350x50+70+14 /opt/fhem/www/pgm2/AUSGABEBILD.png&
sudo convert /opt/fhem/www/pgm2/AUSGABEBILD.png /opt/fhem/www/pgm2/AUSGABEBILD.tif&
sudo tesseract /opt/fhem/www/pgm2/AUSGABEBILD.tif /opt/fhem/www/pgm2/Zahl -l deu&
")}
jetzt komme ich aber nicht weiter,
kann mir vielleicht jemand vom Team sagen wie ich die Datei "Zahl.txt" jetzt in Fhem bekomme?
MfG
Klaus
Besser alle Befehle in ein shell script packen und das im Huntergrund aufrufen. Am Ende des Scripts mit netcat an fhem übergeben:
cat Zahl.txt|nc <fhem-ip> <fhem_telnet-port>
Edit: sorry vergessen, dass Du noch 'setrading <device> <reading>...' mit einbauen mußt...
Einlesen von Textdateien ist in fhem grundsätzlich ganz einfach möglich.
my $fileName = <pathToFile>;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "file"});
- In $err steht eine eventuell beim Lesen aufgetretene Fehlermeldung
- In @content steht der zeilenweise Inhalt der Textdatei (in einem Array)
Frage am Rande: Welchen Sinn macht es, einen Gaszähler im Minutentakt abzulesen?
Danke Betateilchen, aber ich kann damit leider nichts anfangen. entweder ich bin zu .............
Soll es so aussehen?
define Leistung_notify notify Leistung.* { my $fileName = /opt/fhem/www/pgm2/Zahl.txt;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "file"}); }
define Leistung dummy
An Dev0
die 1 min ist nur vorläufig und wird später nach Funktionierung auf eine andere Zeit festgelegt.
Ich will nur nicht zu lange warten müssen.
Kann mir denn keiner helfen,
ich hänge jetzt schon Stunden damit herum.
Jetzt bin ich soweit und es klappt immer noch nicht
define leistung at +*00:01:00 { fhem 'set Leistung' my ($err, @content) = FileRead ({FileName => fhem/www/pgm2, ForceType => "Zahl.txt"});}
Was mache ich falsch?
MfG
Klaus :'(
Letzter Versuch für Heute
define leistung at+*00:01:00 { fhem 'set Leistung' my $fileName = <fhem/www/pgm2>; my ($err, @content) = FileRead({FileName => FileName , ForceType => "Zahl.txt"});;
Dann Fehlermeldung:
2017.01.12 22:57:55 3: leistung: Unknown command {, try help.
Unknown command my, try help.
MfG Klaus
Zitat von: klausmrkor am 12 Januar 2017, 23:03:15
Letzter Versuch für Heute
define leistung at+*00:01:00 { fhem 'set Leistung' my $fileName = <fhem/www/pgm2>; my ($err, @content) = FileRead({FileName => FileName , ForceType => "Zahl.txt"});;
Dann Fehlermeldung:
2017.01.12 22:57:55 3: leistung: Unknown command {, try help.
Unknown command my, try help.
MfG Klaus
Hallo Klaus,
bei Dir fehlt zwischen at und dem + ein Leerzeichen --> aber es wird immer noch nicht gehen ;-)
Gehen wir das ganze einmal Logisch durch
Du hast eine Datei wo eine Zahl drinnen steht
FileRead gibt dir die Datei als Array zurück
Du hast ein Reading welches aktualisiert werden muss
ergo sollte folgende Vorgehensweise zum Erfolg führen
Einlesen Datei in Array
benötigte Zeile Zwischenspeichern
Reading mit Zwischenspeicher setzen ...
also ungefähr folgendes
{
my $fileName = <pathToFile>;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "file"});
fhem "setreading ('MeinDummyInFHEM'', 'MeinReadingVomDummy', @Content[ZeileWoDerWertDrinnenSteht]";
}
Achtung die erste Zeile ist @Content[0]
Hallo,
das war eine gute Beschreibung.
aber ich stehe immer noch auf dem Schlauch.
+*00:01:00 {
my $fileName = <fhem/www/pgm2>;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading ('Leistung'', 'abgelesen', @Content[0])";
}
Fehlermeldung:
2017.01.13 13:19:50 1: ERROR evaluating {
my $fileName = <fhem/www/pgm2>;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading ('Leistung','abgelesen',@Content[0])";
}: Global symbol "@Content" requires explicit package name at (eval 1169) line 5.
2017.01.13 13:19:50 3: leistung: Global symbol "@Content" requires explicit package name at (eval 1169) line 5.
fhem/www/pgm2 in spitze Klammern??
hinter Leistung 2x Striche
MeinReadingVomDummy(abgelesen) wie in Leistung Dummy
Klammer hinter @Content[0]
naja,das Blaue musst Du schon entsprechend Deinen persönlichen Gegebenheiten entsprechend anpassen ...
und bei Deinen Sudo Aufrufen am Anfang - Du schickst diese mit & in den Hintergrund - jetzt die Frage: Warten diese entsprechend aufeinander?
Ich habe gerade abgeändert.
Bitte nochmals schauen
<fhem/WWW/pgm> --> 'ich/bin/irgenwo/der/Pfad/im/Dateisystem/Beispiel/opt/fhem/'
bei dem Content aka content hast Du nicht richtig gelesen .... mein Fehler Dein Problem ;-)
der Pfad sollte vermutlich eher so aussehen: /fhem/www/pgm2 und nicht in eckigen Klammern stehen
das zweite Hochkomma sieht fuer mich auch fehl am Platz aus
Ich muss nochmals fragen
Datei : /opt/fhem/www/pgm2/Zahl.txt
mein Define at sieht so aus:
+*00:01:00 {
my $fileName = /opt/fhem/www/pgm2 ;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading ( 'Leistung' , 'abgelesen' , @Content[0] )";
}
Dann kommt Fehlermeldung;
2017.01.13 14:08:13 1: ERROR evaluating {
my $fileName = /opt/fhem/www/pgm2 ;
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading ( 'Leistung' , 'abgelesen' , @Content[0] )";
}: syntax error at (eval 1297) line 2, near "/opt/fhem"
Global symbol "$fileName" requires explicit package name at (eval 1297) line 3, <GEN8> line 4970.
Global symbol "@Content" requires explicit package name at (eval 1297) line 5, <GEN8> line 4970.
2017.01.13 14:08:13 3: leistung: syntax error at (eval 1297) line 2, near "/opt/fhem"
Global symbol "$fileName" requires explicit package name at (eval 1297) line 3, <GEN8> line 4970.
Global symbol "@Content" requires explicit package name at (eval 1297) line 5, <GEN8> line 4970.
Wie geht es Weiter ???????????????????????????
my $fileName = '/opt/fhem/www/pgm2';
hier haben jetzt Hochkomma gefehlt :)
C c sieht Du jetzt den Unterschied beim englischem Inhalt?
+*00:01:00 {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => 'Zahl.txt'});
fhem "setreading ( 'Leistung' , 'abgelesen' , @Content[0] )";
}
Und Fehlermeldung:
2017.01.13 16:53:03 1: ERROR evaluating {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => 'Zahl.txt'});
fhem "setreading ( 'Leistung' , 'abgelesen' , @Content[0] )";
}: Global symbol "@Content" requires explicit package name at (eval 1589) line 5, <GEN8> line 5332.
2017.01.13 16:53:03 3: leistung: Global symbol "@Content" requires explicit package name at (eval 1589) line 5, <GEN8> line 5332.
Gibt es denn keine andere Möglichkeit an die Daten zu kommen?
schreib den Content doch mit kleinem C am Anfang ...
Perl ist Case sensitive
betateilchen? Hast Du noch Popcorn?
Zitat von: CoolTux am 13 Januar 2017, 17:24:03
betateilchen? Hast Du noch Popcorn?
Wagonweise :-)
aber ich gebe bald auf ...
auf skimmen und copy paste habe ich keine große Lust ...
Hilfe zur Selbsthilfe, das ist mein Motto
An den Threadersteller. Bitte sei so lieb und schreibe Deinen Code und Logausgaben in Codetags. So kann man das kaum lesen.
Entschudigung, manchmal hat man Tomaten auf den Augen, ich habe einfach das "C" nicht gesehen.
Es sieht jetzt schon anderst aus.
aber
2017.01.13 17:46:22 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 1613) line 5.
2017.01.13 17:46:22 3: eval: {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => 'Zahl.txt'});
fhem "setreading ( 'Leistung' , 'abgelesen' , @content[0] )";
}
2017.01.13 17:46:22 1: PERL WARNING: Use of uninitialized value in join or string at (eval 1613) line 5.
2017.01.13 17:46:22 3: eval: {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => 'Zahl.txt'});
fhem "setreading ( 'Leistung' , 'abgelesen' , @content[0] )";
}
2017.01.13 17:46:22 1: devspec2array (: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE ()$/ at fhem.pl line 1185.
2017.01.13 17:46:22 3: setreading ( 'Leistung' , 'abgelesen' , ) : Please define ( first
2017.01.13 17:46:22 3: leistung: Please define ( first
was soll ich denn noch definieren?
ich habe
define Leistung dummy
nur wie bekomme ich das "abgelesen" hinein?
fhem "setreading Leistung abgelesen " . $content[0];
Versuche mal so.
Ich habe es gemacht, aber kein Erfolg
+*00:01:00 {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading Leistung abgelesen " . $content[0];
}
2017.01.13 19:15:23 1: PERL WARNING: Use of uninitialized value $content[0] in concatenation (.) or string at (eval 1744) line 5.
2017.01.13 19:15:23 3: eval: {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => "Zahl.txt"});
fhem "setreading Leistung abgelesen " . $content[0];
}
2017.01.13 19:15:23 3: setreading Leistung abgelesen : Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
2017.01.13 19:15:23 3: leistung: Usage: setreading <name> <reading> <value>
where <name> is a single device name, a list separated by komma (,) or a regexp. See the devspec section in the commandref.html for details.
Suche Dir bitte einen anderen Weg oder versuche Dir Perl Grundkenntnisse zu zu legen. So wird das nichts. Dein Array wird nicht gefüllt. Zu mindest sieht es so aus. Schaue doch mal ob Dein err nicht einen Wert hat der dir verrät was los ist. Gib mal err aus.
print oder printf
Ich bin weg
Kann mir vielleicht jemand sagen, wie ich ein "Test.pl" aus fhem aufrufen kann?
define Test at +*00:01:00 {fhen "/opt/fhem/www/pgm2/Test.pl")}
Zitat von: klausmrkor am 13 Januar 2017, 22:59:33
Kann mir vielleicht jemand sagen, wie ich ein "Test.pl" aus fhem aufrufen kann?
define Test at +*00:01:00 {fhen "/opt/fhem/www/pgm2/Test.pl")}
Wozu denn das? Mit fhen geht es sicher nicht. Jeder Buchstabe zählt.
Wieso gehst Du nicht den eingeschlagenen Weg weiter? Was steht in $err und was steht in @content nach dem Einlesen der Datei? Ich habe jetzt nicht speziell nach der Funktion FileRead in fhem gesucht, aber naheliegenderweise wäre für mich plausibler
my $fileName = "/opt/fhem/www/pgm2/Zahl.txt";
my ($err, @content) = FileRead({FileName => $fileName, ForceType => "file"});
Ein alternativer Ansatz ist oben auch schon einmal angerissen worden. Du kannst in Deinem Shell-Script direkt einen dummy-Wert in fhem setzen.
perl "$fhemdir"/fhem.pl 7072 $myTelnetPW "trigger $dev $reading $filecontent
Dabei enthält die Shell-Variable fhemdir den Pfad zu fhem auf Deinem System und myTelnetPW das eventuell nötige Passwort. dev enthält den Namen Deines dummy-Devices und reading den Namen des Readings, das gesetzt werden soll. In filecontent müsste die Zahl aus Deinem File Zahl.txt stehen. Dann kannst Du in fhem mit einem notify darauf reagieren sobald Dein shell-Script durchgelaufen ist und einen Wert geschrieben hat (sonst müsstest Du noch irgendwie den cron-job für das shell-script und das at in fhem synchronisieren).
mach mal dieses ....
+*00:01:00 {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 Debug, 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
und schreib dann mal was im Logfile dazu drinnen steht - ich vermute einfach, das Zahl.txt in dieser Schreibweise nicht als Datei vorliegt ...
und setzt mal das Verbose vom Notify auf 5
Hier der Fehlercode:
2017.01.14 01:18:25 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 2063) line 5.
2017.01.14 01:18:25 3: eval: {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => "Zahl.txt"});
Log3 Debug, 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
2017.01.14 01:18:25 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 2063) line 7.
2017.01.14 01:18:25 3: eval: {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => "Zahl.txt"});
Log3 Debug, 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
2017.01.14 01:18:25 1: ERROR evaluating {
my $fileName = '/opt/fhem/www/pgm2' ;
my ($err, @content) = FileRead ({FileName => $fileName, ForceType => "Zahl.txt"});
Log3 Debug, 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}: Not enough arguments for main::Debug at (eval 2063) line 5, near "Debug,"
2017.01.14 01:18:25 3: leistung: Not enough arguments for main::Debug at (eval 2063) line 5, near "Debug,"
+*00:01:00 {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
bitte noch einmal ... hatte meinen letzten Code noch einmal editiert
btw ...
deine Grafikkonvertierung kannst Du auch optimieren
das tesseract kann auch direkt jpg lesen .... brauchst diese also nicht wirklich vorher via png nach tif zu convertieren
bin jetzt erst mal die Bettkante besuchen
Könnte mir jemand mal eine PM schicken, wenn das heute fortgesetzt wird ? Hat einen hohen Unterhaltungswert.
@klausmrkor: Um den Unterhaltungswert etwas zu verringern, schlage ich vor, ein wenig hier zu blättern:
https://wiki.selfhtml.org/wiki/Perl
Etwa anfangen hier: https://wiki.selfhtml.org/wiki/Perl/Listen_bzw._Arrays#Auf_einzelne_Listenelemente_zugreifen
LG
pah
Anbei die letzte Fehlermeldung:
2017.01.14 08:51:34 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 2129) line 5.
2017.01.14 08:51:34 3: eval: {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
2017.01.14 08:51:34 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 2129) line 7.
2017.01.14 08:51:34 3: eval: {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];
}
2017.01.14 08:51:34 1: PERL WARNING: Use of uninitialized value $err in concatenation (.) or string at (eval 2129) line 5.
2017.01.14 08:51:34 3: eval: {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: @content[0]";
fhem "setreading Leistung abgelesen " . @content[0];2017-01-14 08:54:34 dummy Leistung abgelesen: 0093b43
2017-01-14 08:54:34 at leistung Next: 08:55:34
}
2017.01.14 08:51:34 0: Error: Content[0]: 0093b43
Er hat die Datei ausgespuckt
2017-01-14 08:54:34 dummy Leistung abgelesen: 0093b43
2017-01-14 08:54:34 at leistung Next: 08:55:34
und für sie Prof. Dr. Peter Henning : es freud mich daß ich einen großen unterhaltswert habe. Ich hoffe, daß sie sich gut unterhalten haben.
@pah, cooltux & Co.
mal komplett off topic... das ist das anfaengerfragen-board, nicht das sich "ueber leute lustig machen und vergraulen"...
wir haben alle irgendwann mal angefangen
Also wenn unsere Tips bezüglich Perl lernen und wie man Debuged als verkraulen angesehen werden, dann muss ich mich in aller Form entschuldigen.
Weiß dann aber auch in welchen Forumsbereich ich nicht mehr schreiben werde.
Grüße
Ersetze mal @content[0] durch $content[0]:
+*00:01:00 {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: $content[0]";
fhem "setreading Leistung abgelesen " . $content[0];
}
Paul
Hier der Fehlercode
2017.01.14 11:43:04 1: PERL WARNING: Use of uninitialized value $err in concatenation (.) or string at (eval 2525) line 5.
2017.01.14 11:43:04 3: eval: {
my $fileName = '/opt/fhem/www/pgm2/Zahl.txt' ;
my ($err, @content) = FileRead ($fileName);
Log3 'TestNotify', 0, "Error: $err Content[0]: $content[0]";
fhem "setreading Leistung abgelesen " . $content[0];
}
2017.01.14 11:43:04 0: Error: Content[0]: oosäsjos};
jetzt muss ich nur noch Tesseract OCR anlernen
Ich bedanke mich schon jetzt für die grosse Mühe die ihre mit mir hattet.
Klaus
Leute, contenance bitte.
Es steht jedem frei zu entscheiden, WIE er programmieren lernen möchte. Allerdings darf man sich über den eigenen Unterhaltungswert nicht beklagen, wenn man Anfängerfragen zur Programmierung (die mit der Anwendung FHEM gar nichts zu tun haben), in einem anwendungsspezifischen Forum stellt. Es ist nämlich sicher nicht der Sinn des FHEM-Forums "Anfängerfragen", jemanden Zeichen für Zeichen durch seinen Code zu leiten, wenn derjenige sogar die Fehlermeldung
Zitat2017.01.14 01:18:25 1: PERL WARNING: Scalar value @content[0] better written as $content[0] at (eval 2063) line 7.
ignoriert und einfach die gleiche Frage noch einmal stellt. Dafür gibt es Anfängerforen zur Programmierung.
LG
pah
Hallo Leute,
ist zwar schon etwas her, dass Ihr Euch mit dem Thema befasst habt, aber mein kleines Problem könnte passen.
Nach den ganzen Befehlen, eine Datei einzulesen, habe ich es hinbekommen, die letzte Zeile einer Datei auszulesen und einem Dummy auf´s Auge zu drücken. ;D
Warum ich das mache?
Ich habe eine Solarzelle auf dem Dach und eine Software schreibt alle 2 Sekunden Daten in eine LOG-Datei:
"THK";"26.8.2017 17:50:25";109;2258;000000000000
"THK";"26.8.2017 17:50:28";107;2258;000000000000
"THK";"26.8.2017 17:50:30";106;2258;000000000000
"THK";"26.8.2017 17:50:32";106;2258;000000000000
"THK";"26.8.2017 17:50:35";105;2258;000000000000
"THK";"26.8.2017 17:50:37";104;2258;000000000000
...
Jetzt möchte ich immer die letzte Zeile auslesen.
PROBLEM: Es wird nur der erste Wert (Name) ausgelesen. ("THK")
Ich habe folgendes zum Test gemacht:
Datei erstellt test.txt und ins log Verz. gelegt.
Ich habe ein Dummy erzeugt:
define energieerzeugung dummy
und ein AT erstellt, welches alle 5 Sekunden eine Datei ausliest:
define leistungholen at +*00:00:05 { my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; fhem "set energieerzeugung $content[-1]";;}
In der test-Datei stehen Zeilenweise Daten drin:
"Zeile 1";"ABC"
"Zeile 2";"DEF"
"Zeile 3";"GHI"
"Zeile 4";"JKL"
"Zeile 5";"MNO"
Ergebnis: Im Dummy steht "Zeile 5".
und sonst nix - es fehlt also das "MNO".
Wenn ich das Semikolon durch z.B. ein Komma ersetze, wird die ganze Zeile ausgelesen. ("Zeile 5";"MNO")
Das ich das eingentliche Logfile nicht beeinflussen kann, stehe ich vor dem Problem mit dem ";".
Habt Ihr eine kleine Lösung für mich?
Gruß Thomas
Gehen wir mal davon aus, dass es sich um ein ordentliches Linux-System handelt. Dann bitte mal über das Konzept von Pipes als virtuellen Dateien informieren, und über sed und awk. Damit lässt sich die ganze Mimik in eine Zeile packen.
LG
pah
Ohh... das System, mit dem Ich arbeite, ist kein Linux.
Die Software, die das Logfile erstellt, läuft unter Windows.
Fhem läuft bei mir auch unter Windows.
Und ganz ehrlich, ich weis nicht, was mit Pipes und virtuellen Dateien gemeint ist.
Und eine Zeile?
Die Logdatei?
Puhh - bin gerade etwas überfordert. :o
Gruß Thomas
Also der einzige der mir da einfällt wäre Michael Winkler. Er könnte in Bezug zu Windows was wissen. Die meisten hier arbeiten mit Mac oder Linux.
Versuch mal das, es liegt einfach am Semikolon ->defmod leistungholen at +*00:00:05 { my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; fhem "set energieerzeugung $content[-1]"}
Können die Perl Experten sicher besser, aber ich habe es so probiert und es tut :)
Gruß Otto
Hallo Otto
leider hat es nicht geklappt.
:'( :'( :'(
Kein Unterschied zu vorher.
Ich denke es liegt am Auslesen der Datei. Sobald das Semikolon erreicht wird, ist für die Zeile Ende.
Bei Dir geht es?
Ev. liegt es dann ev. an der Perlversion.
Ich habe Perl unter Windows installiert (strawberry). Die genaue Version habe ich gerade nicht parat.
Gruß Thomas
Hallo Thomas,
nein, es liegt am set Befehl, bei dem ist einfach beim Semikolon Schluss.
was liefert Dir diese Codezeilen getrennt jeweils einfach in der FHEM Kommandozeile zurück?
{ my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; return $content[-1]}
{ my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; return $content[-1]}
Gruß Otto
Hallo Otto
Zeile 1:
Can't find string terminator '"' anywhere before EOF at (eval 7366977) line 1.
Zeile 2:
Can't find string terminator '"' anywhere before EOF at (eval 7367074) line 1.
Gruß Thomas
Sorry da war ein " zuviel, ich habe es editiert probiere es nochmal.
Hallo Otto
das scheint zu gehen:
Zeile 1:
"Zeile 5","MNO"
Zeile 2:
"Zeile 5";"MNO"
Scheint also das Auslesen zu gehen.
hmmm
Dann probiere noch { my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; fhem "set energieerzeugung $content[-1]"}
;)
Wenn das richtig im dummy ankommt hast Du ein C&P Fehler :) oder dein anderes at ist noch aktiv?
Ich habe mal in #42 von define auf defmod geändert.
Hallo Otto
ich habe erst einen Luftsprung gemacht - war umsonst.
geht nicht.
Aber es liegt nicht am Auslesen!
Wenn ich z.B. set energieerzeugung "Zeile 5";"MNO" absetze, kommt auch nur "Zeile 5" im Dummy an.
Also geht die übergabe an´s Dummy mit ; nicht.
Thomas
Das sage ich doch! Aber die Variante mit Komma muss doch gehen!?!
bei set dummy "Zeile 5";"MNO"
ist ab dem ; ein neuer Befehl und das wirft maximal einen Fehler
Du kannst anstatt Komma auch etwas anderes nehmen, bloß semikolon wird schwierig, Brauchst Du ein Semikolon im Dummy?
Die ;´s sind mir egal - ich brauche nur die Zahlen dazwischen.
Ich versuche mal alles zusammenzusetzen, sodass nur das , gesetzt wird.
Th.
Hallo Otto
habe folgenses getestet:
{ my @content = FileRead({FileName => "log/test.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; return $content[-1];; fhem "set energieerzeugung $content[-1]"}
geht aber trotzdem nicht.
Habe ich ev. das falsch zusammengesetzt?
bestimmt - es geht nämlich garnicht...
Irgend etwas habe ich falsch gemacht.
Th.
Ja :'(
warum nimmst Du nicht direkt meinen Code aus #48 ? Der ist doch für Dich gemacht?!
das das ersetzen geht hast Du doch in #47 schon bestätigt :-[
Und lerne bitte Codetags - die # Taste über dem :-X Smiley
Hallo Otto
manchmal steht man vor einem Wald und sucht Bäume.
JEP! Geht.
Puhh - Ich danke Dir nochmal.
Gruß Thomas
Hallo Otto.
Danke für den # Hinweis - habe nicht dran gedacht.
Trotzdem habe ich ein komisches Phänomen:
Wenn ich aus der Originaldatei folgendes als Befehl absetzte, wird alles sauber an das Dummy übergeben:
{ my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; fhem "set energieerzeugung $content[-1]"}
raus kommt im Dummy: "THK","29.8.2017 20:16:55",0,6228,000000000000
cool.
Jetzt alles ins AT:
+*00:00:05 { my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; fhem "set energieerzeugung $content[-1]"}
Das AT aus der Config:
define leistungholen at +*00:00:05 { my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"});;;; $content[-1] =~ s/\;;;;/,/g;;;; fhem "set energieerzeugung $content[-1]"}
Im Dummy kommt nur "THK" an.
:-\
Siehst Du noch einen Fehler?
Gruß Thomas
Du hast jetzt den Code für das define in die DEF eingetragen? Schwerer Fehler ...
Die Anzahl der ; ist in beiden Fällen unterschiedlich ::)
ZitatMehrere FHEM-Kommandos hintereinander werden mittels Semikolon (;) getrennt. Weil Semikola auch in PERL-Code oder SHELL-Programmen benutzt werden, müssen sie mittels doppelten Semikola geschützt werden. Lesen Sie sich bitte die Bermerkungen des notify-Abschnittes zu Kommandoparametern und Regeln durch.
Z.B. schaltet die erste der folgenden Befehlszeilen die Lampe 1 nur/erst zur Uhrzeit 07:00 Uhr aus, die Lampe 2 aber sofort und die zweite Befehlszeile schaltet Lampe 1 und 2 um 7:00 Uhr gleichzeitig aus.
define lampoff at 07:00 set Lamp1 off; set Lamp2 off
define lampoff at 07:00 set Lamp1 off;; set Lamp2 off
Für jede weitere Indirektion muss man die Strichpunkte verdoppeln. Um also die beiden Lampen um 7:00 für 10 Minuten einzuschalten schreibt man:
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off
Hallo Otto
jetzt hab ich´s
Ist irgendwie verwirrend. Einmal müssen zwei Semikolons genommen werden und dann aber wieder nur eines.
Aber jetzt geht es.
So sieht es jetzt in der CFG aus:
define leistungholen at +*00:00:05 { my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; fhem "set energieerzeugung $content[-1]"}
Damit geht es.
Danke nochmal.
Gruß Thomas
PS.: Eine Bitte: Sei nicht so hart zu den Anfängern obwohl ich das verstehen kann, wenn man immer wieder schreiben muss "nimm das #..." - wir sind nicht nur innerhalb von FHEM Anfänger, sondern auch im Forum. Alle Regeln perfekt zu beherschen ist nicht einfach.
Hallo Thomas,
uih da bin ich jetzt wieder zu sehr als Oberlehrer durchgekommen. Sorry das wollte ich nicht.
Weißt Du, ich "kann zwar Windows" aber mein FHEM läuft unter Linux. Das FileRead was bei Dir läuft gibt es bei mir nicht, ich hab es anders nachgestellt ( my @content = `cat /home/pi/test.txt`). Dann versuche ich Deine Umgebung in dem was ich schreibe nach zu "denken" dabei können natürlich Fehler passieren. Wenn Du dann sagst es geht nicht, zweifle ich an mir.
Im geschriebenen Wort steht nur 7 % unserer Kommunikation :) da kann es im schnellen in und her schon mal schief gehen.
Gruß Otto
Zitat von: Otto123 am 29 August 2017, 22:22:42
Das FileRead was bei Dir läuft gibt es bei mir nicht, ich hab es anders nachgestellt
Das FileRead() gibt es bei Dir auch, Du benutzt es nur nicht. FileRead() ist eine von FHEM bereitgestellte Funktion.
An dieser Stelle mit einem Systemaufruf zu arbeiten, um eine Datei mit cat auszugeben, ist schon ziemlich haarsträubend.
Hi,
mal ne Frage zwischendurch, wie kann man denn von einem Bild Zahlen oder/und Buchstaben auslesen?
Würde gerne KFZ Nummernschilder lesen, wenn jemand auf den Hof fährt.
LG
Marlen
Zitat von: Marlen am 30 August 2017, 12:20:07
mal ne Frage zwischendurch
Völlig offtopic hier. Such im Web nach: Bilderkennung, OCR, etc...
alternativ mal in den ersten post geschaut....
die befehle gegoogelt und man wäre bei tesseract fündig geworden.
Danke...ihr seid so nett :-* :-*
Zitat von: betateilchen am 30 August 2017, 10:25:24
Das FileRead() gibt es bei Dir auch, Du benutzt es nur nicht. FileRead() ist eine von FHEM bereitgestellte Funktion.
An dieser Stelle mit einem Systemaufruf zu arbeiten, um eine Datei mit cat auszugeben, ist schon ziemlich haarsträubend.
Hallo Udo,
ich habe es gerade noch mal probiert, ich hatte einen simplen Fehler in meinem Einzeiler deswegen lief die Variante mit FileRead nicht :-[
Hab etwas Nachsicht mit einem Halbwissenden - trifft bei mir nun mal bei beidem zu Linux und FHEM :-[
Gibt es eigentlich irgendwo eine Doku zu den FHEM Funktionen?
Gruß Otto
Zitat von: Otto123 am 30 August 2017, 20:34:38
Gibt es eigentlich irgendwo eine Doku zu den FHEM Funktionen?
Schau mal in: https://wiki.fhem.de/wiki/DevelopmentModuleAPI
Gruß, Christian
Hi Ihr
Ihr habt super weiter geholfen und jetzt habe ich "Blut geleckt"
Ich lese jetzt die Log Datei aus und übergebe alles an mein Dummy.
+*00:00:05 { my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"}); $content[-1] =~ s/\;/,/g; $content[-1] =~ s/\"THK\"\,//g; $content[-1] =~ s/\,000000000000//g; $content[-1] =~ s/\"//g; fhem "set energieerzeugung $content[-1]"}
Es wird folgendes an mein Dummy übergeben: 2.9.2017 16:02:46,59,9025
Ich habe die Formel ist bestimmt umständlich ergänzt, aber sie geht.
Erst das Datum mit Uhrzeit - dann der aktuelle Wert und zum Schluss der Summenwert, der immer höher wird.
Wie kann ich die Werte Trennen?
Sind ja mit Komma getrennt.
Könnte man die drei Werte in separate Dummy´s legen oder denke ich gerade zu kompliziert?
Gruß Thomas
Hi Thomas,
Du hast sie doch schon getrennt. Schreib sie doch einfach mit userreadings in getrennte readings in einem Dummy.
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B.* {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
Gruß Otto
Hallo Otto
danke für deine erneute Hilfe.
Das mit den Userreadings habe ich gesehen, aber nicht verstanden.
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
Dieser Befehl setzt ein Userreading "energy und füllt ihn mit einem Wert aus einem anderen Reaning.
Das Problem ist aber, wie lese ich die drei Werte per z.B. PerlCode aus?
Ich habe drei Werte die jeweils mit einem Komma getrennt sind.
In mein Dummy habe ich folgende Userreadings erstellt:
LeistungDatum { erstenWertauslesen,std-Datum },
LeistungAktuell { zweitenWertauslesen,0 },
LeistungSumme { drittenWertauslesen,0 }
Jetzt weiß ich nicht wie ich per Perl die Werte auslesen kann.
Gruß Thomas
Das ist nur ein Beispiel, der wichtige Satz ist
Zitatindem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird
Also fang doch erstmal an und probiere deinen bisherigen Code
attr energieerzeugung userReadings Wert1 { my @content = FileRead({FileName => "log/SMI_Loggdatei.txt", ForceType => "file"});; $content[-1] =~ s/\;;/,/g;; return $content[-1]}
Da müsste anstatt im state vom Dummy einfach noch ein Reading Wert1 erzeugt werden.
Dann such mal nach dem split Befehl.
Den Rest hast Du doch fast fertig mit Deinem endgültigen Code wo Du die drei Werte mit drei Kommas getrennt hast - oder habe ich das falsch verstanden?
Wie gesagt, ich bin kein Perl Experte :-[
Gruß Otto
JAJA Das habe ich schon getestet - ist genau so wie ich den Wert meinem Dummy zuweise.
Mit Deinem Vorschlag habe ich jetzt ein Reading "Wert1" mit den Werten STATE.
Wert1 = "THK","2.9.2017 18:48:03",6,9226,000000000000
Ich brauche aber nur jeweils einen Wert. z.B. "THK" )der erste Wert vor dem ersten Komma.
Dann im zweiten Wert "2.9.2017 18:48:03" zwischen dem ersten Komma und dem Zweiten
usw.
Dafür weiß ich nicht welchen Perlcode ich nehmen muss.
Gruß Thomas
Mit sowas {my ($W1, $W2, $W3) = split(/,/,'"THK","2.9.2017 18:48:03",6');;return $W1}
trennst Du den String z.B. am Komma auf. Kannst Du als Einzeiler direkt ausprobieren.
Aber es ist besser da hilft jetzt Einer der es besser kann als ich. Das erscheint mir so viel zu umständlich.
Gruß Otto
Habe folgendes eingebaut:
LeistungDatum { return (split(",","2.9.2017 19:39:42,0,9227"))[0]}
Das geht!
Jetzt muss ich nur noch den Wert des Dummy´s einbauen.
Hier stockt es ein wenig.
Wert1 { return (split(",",fhem ("getstate energieerzeugung")))[2]}
läuft aus einen Fehler.
Ich springe mit den {} in Perl und darin mit fhem wieder zurück.
Da fehlt bestimmt nur noch eine Kleinigkeit.
Gruß Thomas
ups - gefunden...
Wert1 { return (split(",",ReadingsVal("energieerzeugung", "state", 0)))[1]}
So habe ich die Readings gemacht:
LeistungDatum { return (split(",",ReadingsVal("energieerzeugung", "state", 0)))[0]},
LeistungAktuell { return (split(",",ReadingsVal("energieerzeugung", "state", 0)))[1]},
LeistungSumme { return (split(",",ReadingsVal("energieerzeugung", "state", 0)))[2]}
geht.
Besser kann man es bestimmt machen...
Gruß Thomas
@Schmitzkatze
Wie hast du das Reading genau gemacht?
attr energieerzeugung userReadings LeistungSumme { return (split(",",ReadingsVal("energieerzeugung", "state", 0)))[2]}
Hallo Edi77
Die Readings im Dummy sehen SO aus (aus meiner CFG)
attr energieerzeugung userReadings LeistungDatum { return (split(",",ReadingsVal("energieerzeugung", "state", "0")))[0]},\
LeistungAktuell { return (split(",",ReadingsVal("energieerzeugung", "state", "0")))[1]},\
LeistungSumme { return (split(",",ReadingsVal("energieerzeugung", "state", "0")))[2]}
Das sind die drei Readings die ich brauche.
Gruß Thomas
wie kann ich denn mehr als eine Zeile in der Datei auslesen? Ich habe quasi 2000 Zeilen in der CSV und würde einmal am Tag die Datei vom Vortag einlesen wollen.
http://www.hidemail.de/blog/datei-komplett-einlesen.shtml