Problem mit versenden von UDP Paketen

Begonnen von TheMason76, 12 Juni 2016, 14:45:26

Vorheriges Thema - Nächstes Thema

TheMason76

Hallo liebes FHEM Forum,

ich habe eine Frage (weiß allerdings nicht ob es das richtige Unterforum ist).

Ich versuche schon seit einiger zeit verzweifelt für meinen Papa WLAN-Steckdosen von broadlink ins FHEM einzubinden.
Die Steckdosen werden derzeit von einer Android App gesteuert. Ich habe schon mit einem Paketsniffer die UDP Pakete
extrahiert und bin auch auf dem Raspberry PI in der Lage die Steckdosen zu steuern. Dazu habe ich für den Zustand An und Aus
jeweils eine eigene Datei. Diese schubse ich per cat einfach raus ... z.b. cat steckdose_an > /udp/192.168.2.70/80
In der Shell funktioniert das Prima. Allerdings schaffe ich nicht das ins FHEM einzubinden.
Die fhem.cfg sieht an der fraglichen Stelle so aus :

define WLANSteckdose dummy
attr WLANSteckdose webCmd on : off
attr WLANSteckdose room 1
define WLANSteckdose_on notify WLANSteckdose:on { `cat /opt/fhem/FHEM/steckdose_an.pak > /dev/udp/192.168.2.70/80`;; }
define WLANSteckdose_off notify WLANSteckdose:off { `cat /opt/fhem/FHEM/steckdose_aus.pak > /dev/udp/192.168.2.70/80`;; }

Ich habe schon in den Logdateien gesehen das wenn die Datei nicht existiert das er meckert und sagt : File doesnt exist.
Die Rechte der Script-Datei habe ich auch alle auf fhem gesetzt (mit chown fhem), und lesbar sind die dateien auch (chmod 777)
Mit der Konfig oben taucht beim "ein/ausschalten" nichts mehr an fehlermeldungen auf, aber es wird auch nichts geschaltet.
Was ich z.b. auch merkwürdig finde. Um zu testen ob beim Drücken des entsprechenden Tasters in FHEM das Shell Commando auch ausgeführt wird habe ich z.b. mal per echo "test" > /opt/fhem/FHEM/test.txt mir versucht eine Text-Datei erzeugen zu lassen. Aber diese taucht auch nicht im FHEM Ordner auf ?
Was kann das sein ? Ich bin langsam ein wenig am Ende mit meinen Ideen, zumal andere ja schon erfolgreich Systemkommandos ausgeführt bekommen, und ein cat bzw echo ist jetzt ja kein "großes" Kommando.
Jemand vllt eine Idee ?

rudolfkoenig

Zitatattr WLANSteckdose webCmd on : off
Ich wuerde die Leerzeichen entfernen.

Otto123

Zur Fehlersuche gibt es verschieden Strategien, in deinem Fall gäbe es zwei Annäherungsmöglichkeiten:
- Geht das Shellkommando bzw. geht der Perl (System) Ausdruck? Kann fhem das Kommando ausführen?
- Geht der Dummy?

Den Ausdruck den Du ausführen willst kannst Du völlig separat testen, Du bist der Meinung der geht nicht, aber wahrscheinlich geht der...
Den Dummy kannst Du mit etwas einfacherem testen, z.B. irgendwas direkt ins Log schreiben. Oder eine Lampe schalten ... --> { Log 1, "Hello" }

Hilfreich ist auch immer der eventmonitor, den darf man auch gern in einem zweiten Browserfenster zusätzlich öffnen  8)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig

Korrektur: die Leerzeichen in webCmd haben doch keinen negativen Effekt, mein Vorschlag von vorhin ist zu ignorieren.

TheMason76

Hallo Otto,

also der Ausdruck (cat steckdose_an > /dev/udp/... falls du das meinst) geht per Shell einwandfrei. Aber eben nur da.
Ursprünglich habe ich das ganze in ein Script gepackt, aber selbst wenn ich nur das einzelne "effektive" Kommando abgesetzt
habe hat FHEM es nicht ausgeführt bzw es irgendwo hängengeblieben.
Das mit dem Log habe ich schon getestet. Also sprich das ich statt `cat ....` ein Log (1, "geht dat ..") genommen habe.
Und das ist auch in der Log Datei gelandet. Nach 4 mal Schalten stand da 4 mal "geht dat .." am Ende der Logdatei.
Nur um sicher zu gehen das das die Config stimmt und der Befehl theoretisch ausgeführt werden müsste.
Rechte und Benutzer müssten für die Dateien auch stimmen (wie gesagt die Datei per chown und chmod zugreifbar gemacht).

Otto123

Ok, also dann geht Dein Dummy.

Dann musst Du weiter testen warum Dein Shellkommando nicht geht.
Was passiert wenn Du { `cat /opt/fhem/FHEM/steckdose_an.pak > /dev/udp/192.168.2.70/80`;; } in der Kommandozeile, also in der Zeile oben im Browserfenster von fhem eingibst?
Die Rechte auf die Datei hast Du gesetzt, aber braucht deine Aktion root Rechte? Oder andere Rechte, die fhem nicht hat?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TheMason76

Hallo Otto,

ich bin nun wiedermal dazu gekommen an dem FHEM rumzuprobieren. Danke erstmal für den Hinweis mit der Kommandozeile oben im Browser. So lässt sichs ja doch ganz gut testen ... :-)
Aber mein Problem habe ich leider noch nicht lösen können. wenn ich den cat ... absezte passiert nüscht. Ich habe auch mal völlig "unkritische" Befehle wie z.b, touch ausprobiert die ja in jedem Fall gehen müssen und unabhängig von den Rechten sind. Auch da tut sich nichts. Wenn ich z.b.  { ` touch /opt/fhem/FHEM/tester.txt`;; } in der Commandline eintippe dann passiert auch nichts. Es wird also nicht eine leere Datei mit dem namen "tester.txt" in /opt/fhem/FHEM erstellt. Wo kann ich denn überprüfen ob das an den rechten liegt ? Wobei mich ja schon wundert das ein popeliges touch auch schon nicht funktioniert.

TheMason76

Ich habe nochmal etwas rumprobiert und etwas merkwürdiges festgestellt.

Sobald ich folgende Zeile in der Kommandozeile versuche auszuführen, hängt sich der Browser-Teil vom Fhem anscheinend weg.
Jedenfalls komme ich per Web Browser nicht mehr auf das FHEM (es wird immer gesagt : Connection refused) und muß (als bisher einzige lösung) den Raspberry bzw Orangepi neustarten.

{ exec ("cat /opt/fhem/FHEM/stk80_on.pak > /dev/udp/192.168.178.80/80");; }

Egal wie ich es anstelle. Ich bekomme es nicht hin im FHEM die Datei "stk80_on.pak" per UDP an die Adresse 192.168.178.80 zu schicken.
Langsam verzweifel ich ...

Otto123

Zitat von: TheMason76 am 26 Juni 2016, 13:08:47
habe auch mal völlig "unkritische" Befehle wie z.b, touch ausprobiert die ja in jedem Fall gehen müssen und unabhängig von den Rechten sind. Auch da tut sich nichts. Wenn ich z.b.  { ` touch /opt/fhem/FHEM/tester.txt`;; } in der Commandline eintippe dann passiert auch nichts. Es wird also nicht eine leere Datei mit dem namen "tester.txt" in /opt/fhem/FHEM erstellt.
Muss an "Dir" liegen, das funktioniert bei mir ohne Probleme.  8)
Ich habe keine Idee was bei Deiner Installation falsch ist.

Kannst Du die Befehlszeile vom Terminal aus absetzen, mit anderem Benutzer?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TheMason76

Hallo Otto,

als "anderer Benutzer" hatte ich auch schon überlegt, aber noch nicht getestet. Das ganze hab ich bisher nur als Root
gemacht. Also das ich per Putty auf dem OrangePI bin und die UDP-Pakete per cat ... > /dev/udp/... rausschubse.
Was mich nur so stutzig macht ist das selbst ein einfaches touch was ja abgesehen von den jeweiligen Rechten
in dem Ordner wo man die Datei erstellen will ein Befehl ist der unabhängig von dem Benutzer funktionieren muß bzw sollte,
in der Kommandozeile beim FHEM nicht geht. Einen anderen Befehl wie z.b. Log 1, "geht das" per Kommando-Zeile oder auch
mit dem dummy-Schalter (weiter oben) kann ich absetzen und der Text landet auch im Log (auch z.b. ein unterschiedlicher Log mit
"Lampe an", "Lampe aus"). Nur alles (!) was mit der Shell zu tun hat interessiert den kein bischen, zumindest nicht bei der Ausführung.
Wenn ich z.b. den Befehl in ein Script packe und einen falschen Namen angebe (z.b. stockdose statt steckdose) sagt der im Log das
der die Datei nicht findet. Ist der Befehl dennoch richtig geschrieben taucht im Log nichts mehr auf (also Fehlermäßig), aber der Befehl wird
nicht ausgeführt. Von Hand auf der Konsole geht es ...
Na ja. Vllt liegt es ja wirklich an der Installation. Ich muß das bei mir mal gegentesten. Und erstmal das FHEM installieren. Mal schauen was die Banane davon hält  ;D

budy

Warum machst du das nicht lieber direkt aus FHEM. Du könntest doch einfach in einer eigenen Routine direkt die UDP-Pakete raus sschicken. Ich habe so etwas ähnliches für meinen LD382 LED controller gemacht... In diesem Fall spreche ich einen eigenen daemon auf dem RPi an, aber das ist ja ega. Das kurze Beispiel müsstest du doch leicht für deine Zwecke abwandeln können... ;)

sub dreamyFire(@) {
  my @params=@_;
  foreach (@params) {
    my $duration = $_;

    my $cmdBlock = "e,fire,$duration";
    my ($socket,$client_socket);
    $socket = new IO::Socket::INET (
      PeerHost => '127.0.0.1',
      PeerPort => '5382',
      Proto => 'tcp',
    ) or die "ERROR in Socket Creation : $!\n";
    $socket->send($cmdBlock);
    $socket->close();
    InternalTimer(gettimeofday()+$duration,'dreamyFire',$duration, 0);
  }
}


Ist irgendwie schöner, als so ein Hack über die CLI, finde ich.

Gruß,
Stephan
Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro

TheMason76

Hallo budy,

erstmal danke für dein Code Schnipsel. Ich bin was Perl angeht nicht so wirklich fit.
Daher war für mich ein einfaches cat auf dem UDP Port die einfachste Lösung.
Zumal Linux ja 1001 Weg bietet und dieser Weg für mich am einfachsten erschien
weil das wirklich universell ist (soweit ich weiß ist auf jedem Linux System mit
Netzwerk ein /dev/udp/... vorhanden) und ich das ganze ursprünglich nur mal eben
mit einem Ubuntu getestet hatte und letzenendes auf die cat ... > /dev/udp/... gekommen bin.
Im Prinzip kopiere ich einfach nur ein UDP-Paket was ich als Datei habe auf einen UDP
Port auf einer angegebenen IP Adresse.
Aber mit dem Perl-Schnipsel probiere ich mal aus. Wie die Daten dahin kommen ist letztenendes
egal. Hauptsache ist das ich die jeweilige Datei (ich habe für jede Steckdose eine für einschalten und ausschalten,
diese habe ich per Paket Sniffer von der Handy App extrahiert) per UDP auf Port 80 an eine angegebene Adresse
geschubst bekomme. Nur weiß ich unter Perl eben nicht wie das geht. Danke soweit schonmal.
Kann ich dem Socket ohne weiteres ein Proto von 'udp' verpassen ? Eine Rückmeldung brauche ich
erstmal nicht.

budy

Moin,

Zitat von: TheMason76 am 26 Juni 2016, 23:06:25
Kann ich dem Socket ohne weiteres ein Proto von 'udp' verpassen ? Eine Rückmeldung brauche ich
erstmal nicht.

Ja, das müsste so gehen. Probiers mal aus uns wenn's nicht geht, dann sag nochmal Bescheid, aber meiner Meinung nach reicht es aus den Transport auf UDP zu stellen.

Gruß.
Stephan
Debian stretch, FHEM 5.9.
HM-CC-RT-DN, HM-ES-PMSw1-Pl, HM-LC-Dim1TPBU-FM, HMUARTLGW, HMLAN, HM-SEC-KEY, HM-SEC-RHS, HM-SEC-SC-2, HM-SEC-SCo, HM-SEC-SD-2, HM-OU-CFM-TW, div. HUEs, Wifilight, Ring Video Pro

Wernieman

Ansonsten ... wegen der shell-Probleme:
Versuche es doch mal nicht als root, sondern als fhem-user. Eventuell must Du nur in der passwd dem User noch eine shell zuweisen.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

fiedel

#14
Hattest du Ottos Tipp probiert?
ZitatGeht das Shellkommando bzw. geht der Perl (System) Ausdruck? Kann fhem das Kommando ausführen?
So setzt man in FHEM standartmäßig Shellbefehle ab.

Das wäre dann:
{system("cat /opt/fhem/FHEM/steckdose_an.pak > /dev/udp/192.168.2.70/80")}
oder
{system("sudo cat /opt/fhem/FHEM/steckdose_an.pak > /dev/udp/192.168.2.70/80")}

Gruß
Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423