(erledigt) Ausgabe eines get in Textdatei schreiben

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

Vorheriges Thema - Nächstes Thema

TomLee

Wie ist das genau gemeint ?

<<< durch bash -c ersetzen ?

(system("lpr -P HL-2035 -o media=Custom.95x138mm bash -c 'Test' "))

ergibt im Log

2020.07.15 16:34:40 3: sduino IT_set: FB_433_2_TasteD off
2020.07.15 16:34:40 3: get Unifi voucher 7d2x : 9561737429
lpr: Fehler - Zugriff auf »bash« nicht möglich - Datei oder Verzeichnis nicht gefunden
2020.07.15 16:34:40 3: not_FB_433_2_TasteX return value: -1
lpr: Fehler - Zugriff auf »bash« nicht möglich - Datei oder Verzeichnis nicht gefunden


Im Terminal das gleiche

pi@FHEMSERVER:~ $ lpr -P HL-2035 -o media=Custom.95x138mm bash -c 'Test'
lpr: Fehler - Zugriff auf »bash« nicht möglich - Datei oder Verzeichnis nicht gefunden





lpr -P HL-2035 -o media=Custom.95x138mm <<< "Test"


Macht was es soll.

amenomade

Mach zuerst /bin/sh
Dann bist Du im (nicht bash) Shell.

Jeztz macht vermutlich
lpr -P HL-2035 -o media=Custom.95x138mm <<< "Test"nicht mehr was er soll.

Aus dem Shell musst Du dann explizit bash aufrufen und zum bash -c Parameter dein "bash script" als Parameter geben. Etwas wie:
bash -c 'lpr -P HL-2035 -o media=Custom.95x138mm <<< "Test"'
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

Zitatnicht mehr was er soll.

Ja dann klappts, aber wie mach ich das in der myUtils, kann doch nicht einfach ein bash -c vor die " im System-Aufruf schreiben.

$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));

TomLee

Und was mich noch stört ist das jetzt auch ein get gemacht wird wenn irgendeine Taste betätigt wird .

Kann man das auch noch umgehen ?
Nur ein get wenn TasteD off betätigt wird .

Dachte das liegt an der kurzen Variante von if, darum hab ich es auch mal so versucht, dann aber festgestellt das es bei jeder Taste gemacht wird:

return (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.pdf")) if $NAME eq "FB_433_2_TasteD" && $EVENT eq "on";
return (system(bash -c "lpr -P HL-2035 -o media=Custom.95x138mm bash -c 'Test' ")) if $NAME eq "FB_433_2_TasteD" && $EVENT eq "off";

amenomade

#19
Zitat von: TomLee am 15 Juli 2020, 18:05:11
kann doch nicht einfach ein bash -c vor die " im System-Aufruf schreiben.

Doch schon und das ist wahrscheinlich das einfachste.
system('/bin/bash -c "'. "blabla <<<" .$voucher.'"')
Es gibt 2 Alternativen:
- bash spezifische Features nicht benutzen (davon '<<<'). Man kann z.B. statt dessen
echo "Test" | lpr -P HL-2035 -o media=Custom.95x138mm benutzen, wenn lpr das Piping akzeptiert
- backquotes benutzen statt system(). Wird aber mit einer Variable nicht einfach.

Oder man geht ja über eine Datei.
Oder wie betateilchen gesagt hat: über ein bash Skript auf System Ebene, das von fhem aufgerufen wird.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

betateilchen

bei lpr würde ich immer mit piping arbeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Danke.

Die einfache Variante klappt jetzt, bin ich vorerst zufrieden mit.
Was die Alternativen angeht, ist wohl einleuchtend das ich davon erstmal die Finger lasse.

Für nen Tipp mit dem get bei jeder Taste wär ich noch dankbar.

Und, aber da komm ich auch selbst drauf, vlt. gleich nen Tip dazu wie ich in dem Vergleich
$NAME eq "FB_433_2_TasteA && ..."

auch $NAME verwende und bspw. ein A anhänge.
Denke so in die Richtung aber noch nicht ausprobiert.

$NAME eq "$NAME".A &&

oder gleich mit einem Smartmatch ?

betateilchen

rein von der Logik her möchte ich behaupten, dass der Vergleich

$NAME eq "$NAME".A

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

TomLee

Ja, Denkfehler. Ist gestrichen.

Das mit dem get ist wohl die Definition im notify ? reagiert immer bei jeder Taste.
Ich verstehs noch nicht, wird dann immer die Variable "abgerufen" ? gibts doch nicht ?

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

FB_433_2_Taste.*:.* {my433RemoteCodesHandlerKueche ($NAME,$EVENT)}

amenomade

Die Funktion wird von deinem notify bei jeder Taste aufgerufen.

Das "get" ist nicht in irgendeinem "if" sondern einfach so am Anfang der Routine, ohne Bedingung.
Dann wird es ja jedes mal gemacht, das ist klar.

Wenn Du es nur bei TasteD und "off" willst, dann musst Du es unter der if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "off") Bedingung unterordnen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

betateilchen

Zitat von: TomLee am 15 Juli 2020, 20:56:49
Das mit dem get ist wohl die Definition im notify ? reagiert immer bei jeder Taste.
Ich verstehs noch nicht, wird dann immer die Variable "abgerufen" ? gibts doch nicht ?

Jetzt sind wir aber endgültig im Urschleim des logischen Denkens angekommen *kopfschüttel*
Bitte lies dringend die Dokumentation zu notify,

help notify

damit Du vielleicht doch noch irgendwann verstehst, was Du da eigentlich tust.
Mit bloßem Code-abschreiben und Copy&Paste kommst Du nicht dauerhaft weiter.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatMit bloßem Code-abschreiben und Copy&Paste kommst Du nicht dauerhaft

Ich bin Ich, was auch immer du in den falschen Hals bekommen hast, gebs kund.

Mit 100% Sicherheit basiert die zitierte Aussage nicht auf copy&paste, einfach nur Unwissenheit,  aber ich kann deine Gedanken nachvollziehen, während meiner letzten Posts ging mir genau das durch den Kopf, man könnte mir das vorwerfen.

Welch Wunder du hast es gemacht.

TomLee

ZitatJetzt sind wir aber endgültig im Urschleim des logischen Denkens angekommen *kopfschüttel*

Mich fuchst es was dich genau zu dieser Aussage gebracht hat !?

$EVENT beinhaltet in dem Fall nicht das komplette Ereignis sondern nur on/off.
Man könnte auch EVTPART0 nehmen, ja, das hab ich mir zuvor angeschaut, aber für $EVENT entschieden. Nix copy&paste !

Was das notify angeht wüsst' ich aktuell nicht was ich mir eventuell noch anschauen soll das ich irgendwann verstehe was ich da tu.




Zu der letzten Frage bezüglich der Variable, die aber nicht das notify betrifft sondern mMn. Perl-Grundlagen, war mir offensichtlich einfach nicht klar auf welcher Ebene man die Variable deklariert. Schlimm ?
Ich hab gefragt, hab ne Antwort bekommen, verstanden was ich zu tun habe und umgesetzt, fragen wird man doch noch dürfen wenn was unklar ist.

betateilchen

Zitat von: TomLee am 16 Juli 2020, 11:15:58
Was das notify angeht wüsst' ich aktuell nicht was ich mir eventuell noch anschauen soll das ich irgendwann verstehe was ich da tu.

Beispielsweise, wie man ein notify so definiert, dass es auch wirklich das tut, was Du eigentlich willst. Insbesondere geht es um den regex-Teil des notify.

Zitat von: TomLee am 16 Juli 2020, 11:15:58
Mich fuchst es was dich genau zu dieser Aussage gebracht hat !?

Naja, Du definierst zuerst ein notify

FB_433_2_Taste.*:.* {my433RemoteCodesHandlerKueche ($NAME,$EVENT)}

dessen regex zwingend auf jeden event eines device reagiert. Und dann wunderst Du Dich darüber...

Zitat von: TomLee am 15 Juli 2020, 20:56:49
im notify ? reagiert immer bei jeder Taste.
Ich verstehs noch nicht, wird dann immer die Variable "abgerufen" ? gibts doch nicht ?

... dass genau das passiert: das notify reagiert auf jeden event.

Für ich ist das ein klares Zeichen dafür, dass bezüglich des Verständnis von notify (und events in FHEM im Allgemeinen) noch Lernbedarf besteht. Deshalb der Verweis auf das notify.

Zitat von: TomLee am 16 Juli 2020, 11:15:58
Ich hab gefragt, hab ne Antwort bekommen

ja, Fragen ist halt immer einfacher und bequemer als Nachdenken (am besten VOR dem Nachfragen).

Zitat von: TomLee am 16 Juli 2020, 11:15:58
Mich fuchst es was dich genau zu dieser Aussage gebracht hat !?

Die regex eines notify gehören für mich zum FHEM-Urschleim. Und sie beruhen auf nichts anderem als Logik.

Möchte es mal so sagen... ich bin bestimmt der Letzte, der jemanden nicht weiterhelfen würde, wenn man wirklich mal nicht weiterkommt. Aber als "Gegenleistung" des Fragestellers erwarte ich dafür auch ein bisschen Mitarbeit und Engagement des Fragestellers bezüglich des Verstehens des vorgeschlagenen Lösungsweges.
Meistens poste ich ganz bewusst keine Lösung, die man per copy&paste einfach übernehmen kann, sondern versuche Hinweise auf einen möglichen Lösungsweg zu geben und in die richtige Richtung zu stupsen (siehe meine Hinweise zu LPR und der Textdatei, wo Dir das sogar doch noch aufgefallen war).
Bei Dir vermisse ich (als Helfender) aber ein bisschen diese Mitarbeit, es kommt einfach eine (meist simple) Frage nach der anderen und es erscheint mir sehr wahrscheinlich, dass Du ein paar der Fragen hättest vermeiden selbst beantworten können, wenn Du Dir ein bisschen Mühe gegeben hätte (z.B. die Übergabe von Werten in einem Shell Skript). Ja, das kostet Zeit, aber sich die Mühe zu machen lohnt sich immer.

Übrigens: auch das Beantworten Deiner Fragen kostet Zeit. Das stört mich aber nicht, solange ich als Helfender erkenne, dass der Fragesteller sich mit den Antworten auseinandersetzt und daraus lernen möchte. Wenn ich das aber nicht erkenne, fuchst mich das.

Zitat von: TomLee am 15 Juli 2020, 22:42:27
Ich bin Ich,

Ja, offensichtlich.

Nix für ungut, ich habe nix in den falschen Hals bekommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Was das notify angeht:

Ich hab letzte Woche, nach rd. 5 Jahren FHEM (angefangen mit null Programmierkentnissen), das erste mal ein notify ausgelagert, ja ich bin am experimentieren was wie geht, richtig erkannt.

Was den regex angeht hab ich den bewusst so gewählt, mein Gedanke war ein notify für alle Tasten zu verwenden, statt mehrere.
Ja richtig erkannt,  ich habe noch kein Verständnis welcher Weg einzuschlagen ist, für jede Taste eines oder nur eins was ich bevorzugen würde.

Wenn ich nur ein notify möchte muss das (bei entsprechender Namenwahl) logischerweise auf jedes event reagieren.

Mit dem Verständnis das man die Variable nur in der richtigen Ebene deklarieren muss, frag ich mich jetzt auch was denn dagegen spricht den regex so zu verwenden, es klappt doch so, nix wird mehr unnötig ausgeführt.

ZitatMöchte es mal so sagen...
Ich verstehe sehr gut was du rüberbringen möchtest, ich denke nicht anders und deine Hinweise weiß ich immer zu schätzen.
Ja. ich gebe zu ich habs mir hier ausnahmsweise einfacher gemacht und schneller gefragt wie eigentlich üblich.
Hey, /bin/bash -c und Shell/Bash-Script, ich bin kein Programmierer, eine Hürde mit dem auslagern des notify geschafft und das mit weniger Kenntnis wie Perl-Grundlagen und schon wird von einem verlangt ein Script zu schreiben womit ich mich noch nie mit beschäftigt habe, klar fuchst mich das jetzt auch deswegen mach ich mich aber nicht verrückt und beschäftige mich damit zu gegebener Zeit auch wenns nochmal fünf Jahre dauern sollte bis dieser Tag kommt.





Ja, Ich bin Ich und ich mach weiter mit ganz einfachen Verständnisfragen im Anfängerbereich:

Was mich beschäftigt welche Variante von if ich jetzt im myUtils Code weiter verwenden soll, kann/darf ich mischen.
Weil die kurze Variante mit ? : ist mir am liebsten, soll aber eher für oneliner in FHEMWEB genutzt werden und bekomm ich keine Variable reingebastelt, auch in die return if Variante nicht.
Also besser auf die oneliner-Variante in einer myUtils ganz verzichten ?

Soll ich hier am Beispiel statt return (system("lpr -P HL-2035 -o media=Custom.95x138mm /opt/fhem/Gastzugang.pdf")) if $NAME eq "FB_433_2_TasteD" && $EVENT eq "on"; das besser in einem else Zweig von if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "off")
{my $voucher = fhem('get Unifi voucher 7d2x');
(system('/bin/bash -c "'. "lpr -P HL-2035 -o media=Custom.95x138mm <<<" .$voucher.'"'));
unterbringen?


Spricht was dagegen wenn keine Variable benötigt wird statt if () {} else {} wieder return if zu verwenden also wieder zu mischen ?


sub my433RemoteCodesHandlerKueche {
my $NAME = shift;
my $EVENT = shift // return;

$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))));

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

if ($NAME eq "FB_433_2_TasteD" && $EVENT eq "off")
{my $voucher = fhem('get Unifi voucher 7d2x');
(system('/bin/bash -c "'. "lpr -P HL-2035 -o media=Custom.95x138mm <<<" .$voucher.'"'));
}
}