Abfrage mit Netcat in Dummy schreiben

Begonnen von rico5588, 11 März 2017, 23:49:56

Vorheriges Thema - Nächstes Thema

rico5588

Hallo,

habe mir eine Relais Karte erstanden und möchte den Status der Eingänge und Ausgänge in einen Dummy Schreiben.
abrufen geht mit folgenden Befehl.
{ system("echo getr | /bin/nc 192.168.9.97 1234 ")}
Als Ergebnis erhalte ich "getr11000000" je nach dem welche Relais an sind.
Wie kann ich in einem at oder Notify diesen Befehl Ausführen und das Ergebnis in ein Dummy Schreiben.
Das hier funktioniert leider nicht.

define RelaisEinfahrtStatusAT at +*00:00:20  {\
my $Rel1 =Value{ system("echo getr | /bin/nc 192.168.9.97 1234 ")};;;; \
Log 3, "ist: $Rel1";;;;\
fhem("set RelaisEinfahrtStatus $Rel1")}
attr RelaisEinfahrtStatusAT room Relay

Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

dev0


my $Rel1 = qx("echo getr | /bin/nc 192.168.9.97 1234");; \


Da der Aufruf aber blockierend ist, würde ich eher einen cron job laufen lassen, der den ermittelten Wert an FHEM übergibt.

rico5588

Guten Morgen,

kannst du eine Anleitung empfehlen? So richtig habe ich keinen Plan wie ich das machen kann.
Ein fertiges Modul gibt es aber nicht zufällig schon? Nicht das ich es mir zu kompliziert mache!

MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

dev0

Du kannst aus einem shell script Werte direkt an FHEM übergeben, ohne zusätzliches Modul:

echo setreading <device> <reading> <value> | nc localhost 7072

rico5588

Wo kann man sich ein Beispiel ansehen.
Aktuell würde ich
#!/bin/bash
echo getr | /bin/nc 192.168.9.97 1234

in eine test.sh einfügen und dann?
Denn Aufruf in einen cronjob und dann?
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

rico5588

#5
könnte nochmal Hilfe gebrauchen mit dem Bash script.

#!/bin/sh
StatusRelais1=$(echo R1 | /bin/nc 192.168.9.97 1234 2>&1)
echo $StatusRelais1
if  [ "$StatusRelais1" = "Relayon 1" ]
        then re1="on"
        else  re1="off"
fi
echo $re1
(echo "Password"; echo "setreading RelaisEinfahrt1 state "$re1"") |nc "192.168.9.54" 7072


(als $StatusRelais1 erhalte ich "Relayon 1")
(als $re1 erhalte ich "off")
geht so weit super nur der Status bleibt immer "off"
Irgendwie wird "Relayon 1" nicht erkannt.
Tipps??

MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

rico5588

Habe es hinbekommen,

habe immer "sh test.sh" aufgerufen das hat nicht funktioniert.
mache es nun mit "bash test.sh" da geht es nun einwandfrei.
anbei noch mein script, hat sich noch ein paar mal geändert.
#!/bin/bash
# Daten von Relaiskarte an Fhem senden
secs=3600
SECONDS=0
#Schleife für 60 Minuten starten
while (( SECONDS < secs ));
do
#Daten von Relaiskarte holen
Getr=$(echo getr | /bin/nc <IP-Relaiskarte> <Port-Relaiskarte> 2>&1)
Geti=$(echo geti | /bin/nc <IP-Relaiskarte> <Port-Relaiskarte> 2>&1)
#Daten aufbereiten und in Variable schreiben
# und nur bei Änderungen des status zu fhem senden
R1=${Getr:6:8}
R2=${Geti:6:8}
re1=$R1$R2
if  [[ "$re2" = "$re1" ]]
        then echo $re1
        else
re2=$re1
(echo "Password FHEM";
echo "setreading RelaisEinfahrtStatus state "$re1"" ;
echo "exit") | nc "IP-FHEM" 7072
echo re1 $re1
fi
done


Vielleicht hilft es jemandem...
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Wernieman

1. durch die 1. Zeile:
#!/bin/bash
wird schon der passende "Interpreter" geladen. also ein bash script.sh ist eigentlich "Doppelgemoppelt", es reicht ein /script.sh. Wenn Unix dieses so nicht will, dürfte es nicht als ausführbar markiert seion, es hilft ein chmod +x script.sh. das x steht für Ausführbar (execut)

2. Warum so eine Zeile?
(echo "Password FHEM";
echo "setreading RelaisEinfahrtStatus state "$re1"" ;
echo "exit")

Du kannst es zusammenfassen:
echo -en "Password FHEM\nsetreading RelaisEinfahrtStatus state $re1\nexit")
das \n steht für "Enter"

3. (Ergänzung zu 2.) Folgendes ist komisch.
echo "setreading RelaisEinfahrtStatus state "$re1"" ;
das siehr für den echo aus wie
echo "string1" $re1"string2" ;
also das $re ist nicht innerhalb des Strings. Wenn Du dort die " haben willst, must Du sie maskieren, z.B. mit \"

4. (und Wichtig)
Du lässt eine Schleife ziemlich lange laufen.  Wie kommst Du darauf, das die Bedingung "SECONDS < secs" sich mal ändert? SECONDS wird innerhalb der Schleife nicht geändert.

Außerdem kann Unix seeeehr schnell sein. Eventuell solltest Du noch irgendwo ein "sleep" einbauen ...
- 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

rico5588

Hallo
zu1.
chmod +x test2.sh
Habe ich versucht erhalte aber immer nach dem aufruf /test2.sh
Datei oder Verzeichnis nicht gefunden...
zu 2.
Ok ist jetzt kürzer (Habe noch net soviel Ahnung von Bash etc...)
zu3.
scheint auch ohne zu gehen...
zu4. das ist ein Problem was ich bisher völlig übersehen habe....
ohne eine Pause mit sleep blockiere ich mir die Relaiskarte fast 100%, mit sleep 1s wird es deutlich besser....
Ich hatte die Schleife eingebaut da ich den Status der Relaiskarte im Sekundentakt abfragen möchte, ein Cronjob aber minimal 1 minute hat.
irgendwie ist das alles nocht nicht das richtige.

MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Wernieman

1)
Wenn Du /test.sh aufrufst, ist es kein Wunder, das der Rechner nichts findet. / = root und dort liegt bestimmt Dein Script nicht. Da gehört ein . davor, welcher für das aktuelle Verzeichnis steht, also ./test.sh

3)
Wie schon geschrieben: Möchte FHEM dort ein " oder nicht ....

4)
Warum willst Du so schnell abfragen?

Und wenn Du alle Sec brauchst, dann würde ich es auch als kompletten selbständigen Deamon und nicht als Cron-Job laufen lassen. Es hat schon seinen Grund, warum der cron in der Mindesteinstellung 1Minute kann.
- 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

rico5588

1) das ist doch ziemlich dämlich von mir....geht nun
2) scheinbar nein, da ich deine Zeile verwendet habe und es geht
echo -en "Password FHEM\nsetreading RelaisEinfahrtStatus state $re1\nexit")
4) die Relaiskarte hat 8 Eingänge, diese wollte ich nutzen um Bewegungsmelder oder Taster anzuschliessen und damit Aktionen auszuführen...
leider geht es scheinbar nicht so wie gedacht, da die menge der Abfragen die Karte Blockiert. Jedoch für einen Taster ich ja das Signal binnen Millisekunden (theoretisch) erfassen können müsste.
Die Relaiskarte  selber kann scheinbar nicht senden(sagen Eingang 1 ist on)

Was meinst du mit Daemon?
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Wernieman

Ein Deamon ist ein dauernd laufender Hintergrundprozess. z.B. Apache, fhem, .... eben ein Dienstbares Helferlein


Deine Relaikarte hat also Eingänge, die belibige Werte haben können. Diese willst Du pollen, da die Karte selber nicht Bescheit gibt, wenn sich etwas ändert?

Deshalb fragst Du die Karte ab mit:
echo getr | /bin/nc <IP-Relaiskarte> <Port-Relaiskarte>

1) Da gerade der Netzaufbau relativ viele Resourcen fordert, kann man dieses Verbinden und hinterher es auseinanderfummeln?
echo -en "getr\ngetl\n"  | /bin/nc <IP-Relaiskarte> <Port-Relaiskarte>

2) Oder eine Dauerhafte Verbindung (mit einer Hochsprache) aufbauen?

3) Gibt es eine Info, ob sich überhaupt etwas geändert hat?
Sorry, aber ohne mehr Input kann ich schlecht Helfen = Output bringen ...
- 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

rico5588

Hier mal noch ein link was die Karte alles so kann...
https://www.loxforum.com/forum/faqs-tutorials-howto-s-aa/55068-relay-board-controlled-over-http-post-is-not-working
dort unter Post 11
Leider gibt es diese nicht immer im Netz zukaufen, daher kann ich gerade keine Link dazu schicken...
Vielleicht hilft das ja noch
http://www.ebay.de/itm/322246717616?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Wernieman

(5) the burst mode read status
Send string DUMP, then returns the status of all relays state and input, and finally OK to knot
bundle.


wie ist die Ausgabe von:
echo "DUMP" | nc
- 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

rico5588

das ist die Antwort auf DUMP

relayon 1
relayoff 2
relayoff 3
relayoff 4
relayoff 5
relayoff 6
relayoff 7
relayoff 8
IL 1
IH 2
IL 3
IL 4
IL 5
IL 6
IL 7
IL 8
OK

wobei Relai1 "an" und Eingang2 "ein" ist.
Da war mir getr und geti einfacher hier kommt dann als Antwort 000001000....und soweiter.
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly