(erledigt) Ausgabe eines get in Textdatei schreiben

Begonnen von TomLee, 14 Juli 2020, 16:36:13

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

wie genau bekomme ich das was mir get Unifi voucher ... zurückgibt (eine 10 stellige Zahl, mehr nicht ) in eine Textdatei ?

So klappts nicht:

FileWrite({ FileName=>"/opt/fhem/Gastzugang.txt", ForceType=>"file", NoNL => 0},fhem("get Unifi voucher 7d2x"))



War der Meinung es ginge im einfachsten Fall sowas :

FileWrite({ FileName=>"/opt/fhem/Gastzugang.txt", ForceType=>"file", NoNL => 0},'Test')


Klappt aber auch nicht .

Gruß

Thomas

-rw-r--r--  1 fhem dialout      5 Jul 14 17:22 Gastzugang.txt


betateilchen

#1
Zitat von: TomLee am 14 Juli 2020, 16:36:13

War der Meinung es ginge im einfachsten Fall sowas :

FileWrite({ FileName=>"/opt/fhem/Gastzugang.txt", ForceType=>"file", NoNL => 0},'Test')


Klappt aber auch nicht .

Und was steht in der Datei "Gastzugang.txt" denn drin? Die ist doch immerhin 5 Byte groß.

Bei mir klappt das Beispiel problemlos und in der Datei steht "Test" drin.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#2
Das Beispiel mit der get-Rückgabe habe ich gerade mit einem Calendar-device (get oc_test vevents) getestet, das funktioniert auch einwandfrei.


{FileWrite({ FileName=>"/opt/fhem/Gastzugang.txt", ForceType=>"file", NoNL => 0},CommandGet(undef,'oc_test vevents'))}


liefert als Ergebnis


/opt/fhem# cat Gastzugang.txt
1: VEVENT @24 [known]
    CREATED: 20190224T120417Z
    DTEND: 20190224T150000
    DTSTAMP: 20190224T120424Z
    DTSTART: 20190224T140000
    SEQUENCE: 0
    SUMMARY: TestEreignis
    TRANSP: OPAQUE
    UID: 64BD5B49-06FC-44F3-9AF0-6958D84C3DFF
    X-APPLE-TRAVEL-ADVISORY-BEHAVIOR: AUTOMATIC
    >>> Events:
    >>> Skipped events:

2: VEVENT @35 [known]
    CREATED: 20190224T090600Z
    DTEND: 20190224T114500
    DTSTAMP: 20190224T090605Z
    DTSTART: 20190224T104500
    SEQUENCE: 0
    SUMMARY: Neues Ereignis
    TRANSP: OPAQUE
    UID: ACF19889-2E7A-4DA2-A343-7F0E1D9FB51E
    X-APPLE-TRAVEL-ADVISORY-BEHAVIOR: AUTOMATIC
    >>> Events:
    >>> Skipped events:

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Alles gut, hab gerade gemerkt das mein Terminal am Rechner mir keinen Inhalt der Dateien anzeigte auf dem Rechner auf dem ich per SSH eingeloggt war, warum auch immer, einmal ausgeloggt und wieder ein und jetzt seh ich auch was passiert,  sry.

Trotzdem Danke für die Rückmeldung.

TomLee

#4
Nächte Frage die mir etwas unklar ist:

Ich will die Datei auf Knopfdruck ausdrucken.

Habs ehrlich gesagt noch nicht ausprobiert aber ich denke ich brauch doch eine minimale Pause zwischen dem schreiben und anschließendem drucken Befehl und ich bin nicht im FHEM-Befehl.
Wie häng ich jetzt den drucken-Befehl (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.txt")) an Filewrite an mit sleep ohne das das System steht, oder brauch ich keine Pause ?


$NAME eq "FB_433_2_TasteD" && $EVENT eq "on" ? (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.pdf")) : FileWrite({ FileName=>"/opt/fhem/Gastzugang.txt", ForceType=>"file", NoNL => 0},fhem("get Unifi voucher 7d2x"));

edit:

und wenn evtl. jemand einen Tipp hat wie man den Wert in der Datei zentriert ausgedruckt bekommt nehm ich den auch mit  :)
man lpr bringt mich nicht weiter.

betateilchen

Warum willst Du überhaupt eine Datei erzeugen und gibst den Text nicht direkt auf den Drucker aus?

Zentriert drucken ist eher eine Frage von Postscript oder ähnlicher Druckersprache, die Dein Drucker beherrscht. Das ist nicht zwingend eine Option von lpr selbst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatWarum willst Du überhaupt eine Datei erzeugen ...

Schlicht, weil ich nur den Filewrite-Weg kenne, von dir,  bin halt mal kein IT-Mensch.

Vorausgesetzt die Frage zielt darauf ab ich könnte das einfacher umsetzen wär ich für weitere Hinweise wie "Text nicht direkt auf dem Drucker ausgeben" dankbar, weil die paar Schlagworte werden mich in Verbindung mit "FHEM" vermutlich nicht weiterbringen.

Postscript behalte ich im Hinterkopf und warte auf den Heureka-Effekt, beschäftigen werde ich mich nicht mit, aber Danke das ich jetzt eine Verbindung habe.

betateilchen

Naja, Du hast doch lpr auch selbst gefunden, was grundsätzlich völlig unabhängig von FileWrite() oder FHEM ist. Und lpr braucht nicht zwingend eine Datei als Eingabe, sondern kann auch direkt Daten entgegennehmen. Deshalb war meine Frage, warum Du eine Datei erzeugen willst - brauchst Du diese Datei denn für irgendwas anderes als zum Ausdrucken?

Meine Vermutung ist, dass Du das, was Du da tun willst, vielleicht auf Betriebssystemebene viel einfacher lesen könntest. Also das Erzeugen des voucher und den Ausdruck auf dem Drucker. Dafür könnte man ggf. ein Shell Skript erstellen, das beide Schritte abarbeitet. Dann müsstest Du aus FHEM heraus nur noch dieses Skript aufrufen und bräuchtest Dir keine Gedanken über Wartezeiten, blockierendes FHEM usw. machen.

Wie gesagt - das ist nur eine Vermutung. Aber ich denke, ich habe verstanden, was Du eigentlich tun willst und ich glaube nicht, dass die Aufgabenstellung ausschließlich über FHEM lösbar ist. Meines Erachtens lohnt es sich immer, auch über den Tellerrand zu schauen und ggf. alternative Lösungswege zu bewerten.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Deshalb war meine Frage, warum Du eine Datei erzeugen willst - brauchst Du diese Datei denn für irgendwas anderes als  jetzt zum Ausdrucken?

Danke für den Stupser, berechtigte Frage, nee brauch eigentlich keine Datei nur drucken, fertig.

Weiter gehts mit einer Perl-Grundlagen Frage  :P

Wie übergebe ich jetzt die Variable, wie ist die richtige Syntax ?

my $voucher = fhem('get Unifi voucher 7d2x');

(system("lpr -P HL-2035 -o media=Custom.95x138mm <<< $voucher"))
(system("lpr -P HL-2035 -o media=Custom.95x138mm <<< '$voucher'"))
(system("lpr -P HL-2035 -o media=Custom.95x138mm <<< ('$voucher')"))


Klappt alles nicht, wenn ich die myUtils speichern will.



amenomade

(system("lpr -P HL-2035 -o media=Custom.95x138mm <<< ".$voucher))
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

DANKE

versteh ich auch sofort, noch nicht ausprobiert, aber weiß mittlerweile das es klappt.

TomLee

Neues Problem und ich frag besser gleich.

Die Variable ist nicht bekannt, weil sie in dem System-Aufruf ist ?

syntax error at ./FHEM/99_myUtils_Remotes.pm line 86, near ") $NAME " Global symbol "$voucher" requires explicit package name (did you forget to declare "my $voucher"?) at ./FHEM/99_myUtils_Remotes.pm line 87.


sub my433RemoteCodesHandlerKueche {
my $NAME = shift;
    my $EVENT = shift // return;
my $voucher = fhem('get Unifi voucher 7d2x')
$NAME eq "FB_433_2_TasteA" && $EVENT eq "on" ? fhem("set MQTT2_EG_Flur_Kueche_Tuer on") : fhem("set EG_Echo_Kueche notifications_delete ".(sprintf('fw@'. ReadingsVal('EG_Echo_Kueche','timer_id',0))));
$NAME eq "FB_433_2_TasteD" && $EVENT eq "on" ? (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.pdf")) : (system("lpr -P HL-2035 -o media=Custom.95x138mm <<< ".$voucher));
}


Wo genau muss ich die Variable my $voucher = fhem('get Unifi voucher 7d2x') definieren, das ist mir jetzt völlig unklar, doch nicht im System-Aufruf ?

amenomade

Ich würde sagen, es fehlt ein Semikolon nach "my $voucher = ..."
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

 ::)

Jetzt gibts aber immer noch keinen Druckauftrag.

Im Log steht:

2020.07.15 12:29:12 3: sduino IT: FB_433_2_TasteD on->off
2020.07.15 12:29:12 3: get Unifi voucher 7d2x : 9561737429
sh: 1: Syntax error: redirection unexpected
2020.07.15 12:29:12 3: not_FB_433_2_TasteX return value: -1


Alles korrekt bis auf das sh: 1: Syntax error: redirection unexpected

Zum Vergleich der andere System-Aufruf:

2020.07.15 12:28:41 3: sduino IT: FB_433_2_TasteD on->on
2020.07.15 12:28:41 3: get Unifi voucher 7d2x : 4790518579
2020.07.15 12:28:41 3: not_FB_433_2_TasteX return value: -1


die -1 ist normal, bekommt man auch über die Befehlszeile zurück.


$NAME eq "FB_433_2_TasteD" && $EVENT eq "on" ? (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.pdf")) : (system("lpr -P HL-2035 -o media=Custom.95x138mm <<< ".$voucher));

amenomade

'<<<' ist ein bash Feature.

Perl nutzt aber /bin/sh (shell) und nicht bash (Bourne again shell)

Workaround: "bash -c ..." damit sh bash aufruft.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus