[Ungelöst, aber geschlossen] nc/telnet im Scripting Engine stdout immer null

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
Nucom AG
Beiträge: 33
Registriert: 15.04.2019, 14:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

[Ungelöst, aber geschlossen] nc/telnet im Scripting Engine stdout immer null

Beitrag von Nucom AG » 29.10.2019, 14:39

Hallo Miteinander

Ich versuche per NC (oder Telnet falls möglich) den Status von einem EXSYS EX-6011 (https://www.exsys.it/wp-content/uploads/ex-6011.pdf) abzufragen.

Dieser liefert auf dem Port 100 jeweils 8-Bits zurück. Die ersten 4 sind für den Status der Outputs, die anderen für den Status der Inputs Ports.

Ich experimentiere aktuelle mit dem Befehl "nc -n 192.168.XXX.XXX 100 -w 1". Da dieser mir den gewünschten Output liefert, und anders als beim Telnet nach 1 Sekunde die Verbindung auch wieder schliesst.

Soweit so gut, jedoch funktioniert dieser Befehl per Shell auf dem Tinkerboard normal, aber sobald ich ihn über die Homematic Script Engine probiere, scheint es nicht zu funktionieren.

Hier ist das aktuelle Script:

Code: Alles auswählen

var IP = "192.168.XXX.XXX";
var PORT = "100";
var Position = "4";

! Position 0-3 == Output
! Position 4 == Input 1
! Position 5 == Input 2
! Poisiton 6 == Input 3
! Position 7 == Input 4

var Befehl = "nc -v -n "#IP#" "#PORT#" -w 1";

var Info;
var StdErr;
WriteLine(Befehl); ! Vollständigen Befehl ausgeben
system.Exec(Befehl, &Info, &StdErr); ! Befehl ausführen
WriteLine(Info); ! Ergebnis ausgeben
WriteLine(StdErr); ! Fehler ausgeben

var Resultat = Info.Substr(Position, 1); ! Das Bit von der korrekten Position extrahieren
WriteLine("Resultat:"#Resultat); ! Bit ausgeben
Das Ergebnis ist:
nc -n 192.168.250.XXX.XXX -w 1
null


Erwartetes Ergebnis:
nc -n 192.168.250.XXX.XXX -w 1
11110111
Resultat:0



Ich habe es auch versucht über eine File Redirection ins /tmp/test.txt zu lösen, in der Shell, werden die 8 Bits korrekt ins File geschrieben, über die Homematic Script Enginen bleibt es erneut leer.

Was mich auch stört, ist wie schnell das Ergebnis "null" kommt, da ich beim nc einen Timeout von 1 Sekunde gesetzt habe (-w 1).

Ich bin mir nicht ganz sicher was für eine Art Problem das ist, denn ich benutze nc Ebenfalls um ein sr201 Netzwerk Relay zu schalten (jedoch per UDP), also der NC-Befehl an sich funktioniert aus der Scripting Engine.

Irgendjemand hiermit Erfahrungen gemacht?

MfG

Fabian
Zuletzt geändert von Nucom AG am 04.11.2019, 08:06, insgesamt 3-mal geändert.

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: nc/telnet im Scripting Engine stdout immer null

Beitrag von alchy » 30.10.2019, 10:36

Parameter -v mit hinzunehmen und zu Info auch StdErr augeben.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Nucom AG
Beiträge: 33
Registriert: 15.04.2019, 14:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: nc/telnet im Scripting Engine stdout immer null

Beitrag von Nucom AG » 30.10.2019, 13:05

Hallo Alchy

Danke für den Tipp. Habe oben den Code aktualisiert.

Ergebnis in der Shell:
# nc -v -n 192.168.XXX.XXX 100 -w 1
192.168.XXX.XXX (192.168.XXX.XXX:100) open
11110111
Ergebnis in der Homematic Engine
nc -v -n 192.168.XXX.XXX 100 -w 1
null
192.168.XXX.XXX (192.168.XXX.XXX:100) open
Es kommt lediglich die erste Zeile im StdErr zurück.
//edit: Bin gerade am umstellen auf CuxD….

MfG

Fabian

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: nc/telnet im Scripting Engine stdout immer null

Beitrag von alchy » 30.10.2019, 14:05

-v -v gibt noch mal mehr :mrgreen:

mmh, da muss sich mir was suchen, was mir netcat auch eine solche Ausgabe ausgibt.
Ich hatte es irgendwann mal mit HM-Script benutzt um IP Bereiche zu scannen ...

was sagt denn z.B. wget zu der Anfrage?

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Nucom AG
Beiträge: 33
Registriert: 15.04.2019, 14:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: nc/telnet im Scripting Engine stdout immer null

Beitrag von Nucom AG » 30.10.2019, 15:42

Hallo Alchy

Ich habs mal mit CuxD Probiert, mit dem gleichen Ergebnis :cry:

Mit dem doppel-verbose liefert er mir:
Shell:
# nc -v -v -n 192.168.XXX.XXX 100 -w 1
192.168.XXX.XXX (192.168.XXX.XXX:100) open
11110111
net timeout
sent 0, rcvd 10
Script-Engine:
nc -v -v -n 192.168.XXX.XXX 100 -w 1
null
192.168.XXX.XXX (192.168.XXX.XXX:100) open
sent 0, rcvd 0

Beim wget:
Shell:
# wget --no-http-keep-alive --tries=3 -t1 -q -O - 192.168.XXX.XXX:100
11110111
11110111
Hängt sich auf für immer, trotz -t1 (Timeout 1)
Script-Engine
wget --no-http-keep-alive --tries=3 -t1 -q -O - 192.168.XXX.XXX:100
Kein weiterer Output, Script hängt sich auf wie in der Shell.
mmh, da muss sich mir was suchen, was mir netcat auch eine solche Ausgabe ausgibt.
Ich könnte den Port sonst aus dem Internet erreichbar machen, wenn du es mal direkt mit diesem Relay Testen willst.

//edit: Ich habe jetzt einfach einen Raspberry dort Platziert, und hole die Infos nun von dort ab.
Ich habe ein Lokales Script auf dem Raspberry, der Minütlich den Status des EXSYS Adapters abfragt, und diesen danach in eine .txt Schreibt, welche via Webserver Exposed ist, diese hole ich dann von meiner Homematic ab, und werte den Inhalt aus.

Ich wollte mit dem ganzen im Endeffekt eine Systemvariable auf true/false setzen, um zu ermitteln, ob ich nun heizen oder kühlen muss.
Hier sonst der Funktionsfähige Code fürs HM-Script (Programmiert/getestet auf Raspberrymatic)

Code: Alles auswählen

var IP = "192.168.XXX.XXX"; ! IP Adresse der Homematic im Keller
var Path = "/status/status.txt"; ! Pfad zur Statusdatei
var Fullpath ="http://"#IP#Path;
var SystemVariable ="Heizen / FreeCooling";
var Heizen="heizen";
var Cooling="cooling";

! ################################################
WriteLine("Hole: "#Fullpath);

var Ergebnis;
var stdErr;
var Befehl="curl "#Fullpath#"";
system.Exec(Befehl, &Ergebnis, &Fullpath)
WriteLine(Ergebnis);

var SystemVar =dom.GetObject(SystemVariable);

if(SystemVar)
{
  WriteLine("Setze Systemvariable");
  integer heizen;
  integer cooling;
  heizen = Ergebnis.Find(Heizen);
  if(heizen > -1)
  {
    WriteLine("Setze Heizen");
    SystemVar.State(false);
  }
  cooling = Ergebnis.Find(Cooling);
  if(cooling > -1)
  {
    WriteLine("Setze Cooling");
    SystemVar.State(true);
  }
  if(heizen <= -1 && cooling <= -1)
  {
    WriteLine("Unbekannter Wert! Kann keine Systemvariable setzen");
  }
  
}
else
{
  WriteLine("Systemvariable nicht vorhanden!");
}
MfG

Fabian

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“