Hallo @All,
bin ziemlich neu hier und stehe momentan absolut auf dem Schlauch.
Ich möchte mit einem kleinen Script einen Analogeingang von meinem "Automatisation Hat" abfragen.
In Python geht das supt einfach mit:
python
import automationhat
value = automationhat.analog.one.read()
print(value)
Nun war der Gedanke das in FHEM einzulesen. Das bekomme ich aber nicht hin.
Die PHP Datei im Script ist nur zum Testen da und sollte die Zeit zurück geben.
Internals:
CFGFN
DEF (Analog1:on) {fhem("set Analog1 off");;(my $rueckgabe = "php /home/pi/Analog1.php &");; fhem("set Analog1Wert $rueckgabe;;");;}
NAME Analog1_notify
NOTIFYDEV Analog1
NR 1987
NTFY_ORDER 50-Analog1_notify
REGEXP (Analog1:on)
STATE 2018-12-27 07:44:55
TRIGGERTIME 1545893095.44252
TYPE notify
READINGS:
2018-12-26 23:03:52 state active
Attributes:
Mein "dummy" wird aber nur mit "php /home/pi/Analog1.php &" gefüllt. Was habe ich falsch geschrieben?
Das auzurufende Datei liegt am angegebenen Ort. Kann ich diese Datei auch direkt i Browser aufrufen?
Aktuell weißt du der Variable einen string zu. Probier's mal mit backricks
Kurz, weil mobil
Meine erste Empfehlung wäre das Du Dir das Einsteiger PDF durch liest. Dann schaust Du Dir an wie Perl funktioniert.
Analog1.on { fhem('set Analog1 off');
my $rueckgabe = qx (php /home/pi/Analog1.php/);
fhem('set Analog1Wert ' . $rueckgabe);
}
Grüße
Hi,
ich gebe zu bedenken: Wenn das PHP Script länger braucht, wird FHEM für diese Zeit stehen bleiben!
Lösung: Wenn es nur mit Extern PHP geht - im PHP Script das Reading in FHEM setzen (über HTTP) und das Script nicht blockierend starten.
Gruß Otto
Hallo,
ich habe mich mal ein bisschen in das Thema eingelesen.
Das Script wird nun gestartet, aber die Datei nicht mit Werten gefüllt obwohl im Log alles richtig drinne steht.
{my $rueckgabe = system ("/opt/fhem/Analog.py&");
fhem('set Analog1Wert ' . $rueckgabe);
}
Die Benutzerrechte habe ich auf "fhem" gesetzt und auch Schreib-/Ausführungsrechte gesetzt.
Im Log steht bei Ausführung vom Script:
| 315 | 2 | 2 | 281 |
Das ist der formatierte String vom Script. Der muss in den Dummy "Analog1Wert" rein.
Leider steht dort nur:
STATE -1
Wo ist da der Schreibfehler?
Zitat von: andy75 am 28 Dezember 2018, 10:30:17
Hallo,
ich habe mich mal ein bisschen in das Thema eingelesen.
Das Script wird nun gestartet, aber die Datei nicht mit Werten gefüllt obwohl im Log alles richtig drinne steht.
{my $rueckgabe = system ("/opt/fhem/Analog.py&");
fhem('set Analog1Wert ' . $rueckgabe);
}
Die Benutzerrechte habe ich auf "fhem" gesetzt und auch Schreib-/Ausführungsrechte gesetzt.
Im Log steht bei Ausführung vom Script:
| 315 | 2 | 2 | 281 |
Das ist der formatierte String vom Script. Der muss in den Dummy "Analog1Wert" rein.
Leider steht dort nur:
STATE -1
Wo ist da der Schreibfehler?
Ich habe Dir gezeigt wie es gehen kann. Da Du es anscheinend besser weißt ist es für mich schwer. Ich kann zu Deiner Version nur sagen das sie 2 Fehler hat.
1. Du schickst den gesamten Prozess in den Hintergrund, damit bekommt man keine Ausgabe. Egal wo hin.
2. Mit system() liest man keine Ausgaben in eine Variable.
Cooltux war kurz und knapp :D, etwas im Detail: Meine Notiz dazu (https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html).
Da fehlt aber als Lösungsansatz noch genau der Part den Du jetzt brauchst. Eine Idee wie das über HTTP gehen kann steht im Wiki, allerdings nicht für PHP.
https://wiki.fhem.de/wiki/CsrfToken-HowTo
Gruß Otto
Juchu es geht!
Danke für eure Hilfe.
(Analog.on) {my $rueckgabe = qx "/opt/fhem/Analog.py&";
fhem ("set Analog off");
fhem('set AnalogWert ' . $rueckgabe);
}
Das Script (Python) braucht nur den bruchteil einer sekunde um die Analogeingäne von meinem AutomatisationHat einzulesen. Es blockiert also nicht den Server.
Das ich in dem Script keine "waits" einbauen kann war schon klar.
Die Analogwerte werden sauber in die Variable "AnalogWert" geschrieben.
Ich glaube das & am Ende des Scripts ist sinnfrei. -> Weil qx macht keinen extra Prozess, sonst käme ja nichts zurück.
Wird vielleicht einfach nicht beachtet, aber ich würde es rausnehmen. Verwirrt nur. ::)
Der Punkt des Blockierens ist meist nicht der normale Betrieb. Du solltest testen was passiert wenn das analoge Device mal nicht da ist.
Gruß Otto
Nur für den Fall, dass es mal scripts sind, die länger dauern:
http://forum.fhem.de/index.php/topic,88398.msg808685.html#msg808685
Dazu muß man neuerdings aber auch ein telnet-Device definieren (und absichern!). Dafür funktioniert das in abgewandelter Form dann auch von entfernten Rechnern.
Gruß, Beta-User
Ok ich habe das"&" rausgenommen und es geht noch.
Jetzt wo alles läuft, besteht denn hier im Forum bedarf?
Was mache ich mit dem Script?
Ich habe mir einen Shield von "Pimoroni" Pi-Automation-Hat https://www.pollin.de/p/raspberry-pi-automation-hat-810606 (https://www.pollin.de/p/raspberry-pi-automation-hat-810606) gekauft um damit meine Heizung zu steuern.
Die Eingänge und die Ausgänge werden direkt auf die GPIO´s gelegt.
Nur die Analogeingänge werden über I2C abgefragt.
Ein direktes Modul für Fhem gibt es nicht (oder ich habe es nicht gefunden).
Mit dem Script lese ich die Analogeingänge und übergebe diese zur weiteren Verwendung an Fhem.
Ich denke mal wenn hier größerer Bedarf besteht sollte man da eher ein vollumfängliches Modul bauen.
Zitat von: Beta-User am 28 Dezember 2018, 13:50:21
Dazu muß man neuerdings aber auch ein telnet-Device definieren (und absichern!). Dafür funktioniert das in abgewandelter Form dann auch von entfernten Rechnern.
Genau deswegen empfehle ich nur noch HTTP :)
Was aber auch nicht unbedingt "fehlerfreier" ist. Ich persönlich mag immer noch die telnet-Schnitstelle .... gibt übrigens für php ein telnet-Modul ....
Zitat von: Wernieman am 28 Dezember 2018, 17:47:22
Was aber auch nicht unbedingt "fehlerfreier" ist.
Sag ich ja nicht :D aber Telnet ist quasi per default weg - in Zukunft wird es eine Generation FHEM Jünger geben die fragen: Hä? Wasndas? Ich will denen nicht erklären, dass sie erstmal "Telnet installieren" (aktivieren!) müssen.
HTTP bleibt hoffentlich noch ne Weile :)
Gruß Otto
So wie ich das verstanden hatte, muß man telnet nicht installieren, sondern nur aktivieren (FHEM-seitig). Das ist schön beschrieben, wie andere komplizierte Dinge auch, von denen Neulinge denken "wat'n'dat?!?!?".
Und wer unbedingt Pi-GPIO's nutzen will, läßt sich erfahrungsgemäß von nichts abschrecken :P .
(@TE: für den Fall, dass du nicht so genau weißt, was du tust: Nimm lieber eine andere Lösung, die nicht nur mit einem Pi funktioniert; gibt genug Leute, die froh sind, die Server-Hardware auch wechseln zu können...)
Ja klar sorry nicht installieren ... ;)
Aber warum eine zweite potentiell unsichere Schnittstelle aktivieren und umfangreich absichern? Es gab doch einen Grund das Rudi die Definition rausgeschmissen hat! :-X
Aber das ist jetzt alles OT - dem TE hilft es nicht ;D
Naja .. für "non-blocking-Module" wird sowieso eine Telnet-Instanz hochgefahren .... ;o)
Ansonsten hast Du Recht :o)
Zitat von: Wernieman am 28 Dezember 2018, 19:19:13
Naja .. für "non-blocking-Module" wird sowieso eine Telnet-Instanz hochgefahren .... ;o)
Achso?! ::)