Neue Remote-Software „StartRemote Suite“

Wie hier und da bereits angekündigt, habe ich eine kleine Programm-Lösung erstellt, die es auf einfache Art ermöglicht, auf einem anderen PC Programme oder Befehle zu starten.main_programs

Man kann sich eine unbegrenute Anzahl von Buttons erzeugen und diese mit Befehlen ausstatten, die auf einem anderen PC – auch üebr Internet – Programme oder Befehle starten. Dabei ist die Größe der Buttons sowie etwa unterliegende Grafiken frei definierbar. Man kann seine Buttonleiste auch immer im Vordergrund und/oder als schlankes Fenster ohne weitere Elemente darstellen.

Der Clou ist jedoch, dass man für den Betrieb über Internet keine Portweiterleitung im Router einrichten muss, was auch außerdem z.B. mit einem IP v6 Anschluß fast unmöglich ist.

Darüberhinaus ist ein Web-Interface in Entwicklung, das es ermöglicht, die Befehle systemunabhängig z.B. von jedem Mobil-Gerät aus absetzen zu können.

Ein kurzer Überblick

Die StartRemote Suite besteht aus 3 Programmen:

StartHelper ist der „Server“-Teil und läuft als Kommandozeilenprogramm auf dem zu steuerndem PC.

StartRemote ist die „Fernsteuerung“.

ngrokHelper ist ein Hilfsprogramm für die Fälle, dass keine Portweiterleitung eingerichtet werden kann/will. Es benutzt die Freeware „Ngrok„, die einen Tunnel zum Server-PC öffnet, und eine Portweiterleitung obsolet macht. Leider ändert ngrok bei jedem Start die PublicURL/Port und man müsste per Remote-Desktop oder Teamviewer eine Verbindung schaffen, um diese Werte abzulesen.

Dies macht ngrokHelper für Euch!

Was Ihr dazu benötigt, ist ein Webspace, auf dem php-Scripte laufen können. In der StartRemote-Suite wird das php – Script „ngrokurl.php“ mitgeliefert, das den aktuellen URL/Port von ngrok vom ngrokHelper mitgeteilt bekommt und von StartRemote abgefragt wird. Somit muss man sich um nichts kümmern und hat jedesmal die automatisch die aktuellen Verbindungsdaten.

Die StartRemote-Suite kann alle erdenklichen Befehle auf dem Remote-PC ausführen – wenn an diesem ein Benutzer angemeldet ist (kann man in Windows automatisch veranlassen). Eine Installation als Windows-Service ist auch denkbar – kommt auf Eure Reaktionen an…

Meine Motivation es zu realisieren, könnt Ihr am oberen Screenshot sehen:

Ich bin oft unterwegs und möchte mir von zu Hause TV-Programme in mein Hotelzimmer streamen. Dabei ist die Leitung oft zu langsam und der Stream unterbricht immer wieder. Als Quelle dient meine FritzBox, die Kabelprogramme streamen kann (mein SAT-Receiver kann das auch, aber die FitzBox läuft ja sowieso…). Um die Bitrate des Streams zu verkleinern, benutze ich VLC, das den Stream liest, kleiner rechnet und weiterstreamt.

Mit einer Portweiterleitung auf den Streaming-Port von VLC funktioniert das ganze bereits. Aber das Umschalten ist nervig: Immer wieder mit einer Remote-Software auf den Desktop gehen, VLC beenden, einen neuen Stream lesen und weiterstreamen…

Diesen Job übernimmt nun RemoteHelper. Mit einem Klick auf einen StartRemote – Button fordere ich immer wieder einen neuen Stream an, was in Sekunden funktioniert, ohne, dass ich mich remote auf den Server verbinden müsste. Daher die Senderlogos auf den Buttons im Screenshot.

Die StartRemote-Suite bietet noch einiges mehr an Optionen. Für die vollständige Anleitung, Tutorial-Video (ab 26.12.2018) und Download, geht bitte auf

http://75r.de/software/startremote

Werbeanzeigen

[UPDATE] Thermostatsteuerung mit ESP8266-01

Ein kleines Update zur Heizkörperthermostatsteuerung

Ich habe die Schaltung vereinfacht und die Transistoren weggelassen und das ganze für den ESP8266-01, also die kleine „Classic“-Platine, die nur 2 GPIOs hat, angepasst.

Das Serverscript hat nun eine Abfragemöglichkeit über den Parameter …?a=gt, mit dem man die zuletzt eingestellte Temperatur  – also den Ist-Zustand – abfragen kann.

Die beiden aktuell verwendeten lua – Scripte sind auch noch einmal angefügt.

Es muss mit ESP8266Flasher.exe NodeMCU geflasht werden, um luaScript zu verwenden. Hier meine Settings beim Flashen:

NodeMCU Flasher Settings

Esp8266Flasher.exe settings für ESP8266-01

Das aktuelle Layout ohne Transistoren:

 

ESP8266_classic_Thermostatsteuerung_2018_Steckplatine

Hier die beiden Scripte, die auf dem ESP8266 werkeln:

init.lua

print('Hello! init.lua started.')
wifi.setmode(wifi.STATION)
wifi.sta.config("MY_AP_NAME", "MY_WIFI_PASSWORD")
wifi.sta.connect()

tmr.alarm(0, 1000, 1, function()
 if wifi.sta.getip()==nil then
   print("connecting to AP...")
 else
   print("AP successfully connected.")
   print ("ip: ", wifi.sta.getip())
   tmr.stop(0)

   dofile("server_v4.lua")
 end
end)

server_v4.lua

p1=3 -- 1
p2=4 -- 2
gpio.mode(p1, gpio.OUTPUT);
gpio.mode(p2, gpio.OUTPUT);

wt=21
gt=0

srv=net.createServer(net.TCP)
print ("WEBSERVER started.")
srv:listen(80,function(conn)
 conn:on("receive", function(client,request)
 local c = ""
 local buf = "";
 local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
 if(method == nil)then
   _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
 end
 local _GET = {}
 if (vars ~= nil)then
   for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
     _GET[k] = v
   end
   if(_GET.t ~= nil)then
   wt = _GET.t
   gt = wt
   if _GET.p == "on" then
       gt=wt + 0.5
       c = " checked"
   end
   if wt == "off" then
       wt = 0
       gt = 0
       c = ""
   end
     print("Argument 't' was "..gt);
     settemp(gt)
 end
end

if(_GET.a == nil)then if(_GET.a == nil)then
  buf = buf.."HTTP/1.1 200 OK\n\n"
  buf = buf.."<html><head><title>Schlafzimmer Thermostat</title>";
  buf = buf.."<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">"
  buf = buf.."<!--[if lt IE 9]>http://html5shim.googlecode.com/svn/trunk/html5.js<![endif]-->"
  buf = buf.."<link rel=\"shortcut icon\" href=\"http://SOME_URL/favicon.ico\"></head>"
  buf = buf.."<body bgcolor=\"#D0D0D0\"><font face=\"arial\"><center><h1>SCHLAFZIMMER</h1><p>Temperature is set to "
  buf = buf..gt       
  buf = buf.."&ordm;</p><form action=\"?\">"
  buf = buf.."<input type=\"button\" style=\"height:70px;width:120px;font-size:40px;\" value=\"+\" onClick=\"javascript:document.getElementsByName('t')[0].value++;\"><br>"
  buf = buf.."Temp:&nbsp;&nbsp;&nbsp;<input style=\"height:50px;width:60px;font-size:40px;margin-top:8px;margin-bottom:8px;\" type=\"text\" name=\"t\" value=\""
  buf = buf..wt
  buf = buf.."\">&nbsp;&nbsp;&nbsp;&nbsp;"
  buf = buf.."<input style=\"transform: scale(4); -webkit-transform: scale(4);\" type=\"checkbox\" name=\"p\" value=\"on\""
  buf = buf..c
  buf = buf..">&nbsp;&nbsp;&nbsp;&nbsp;+ 0.5&ordm;" buf = buf.."<br><input type=\"button\" style=\"height:70px;width:120px;font-size:40px;\" value=\"-\" onClick=\"javascript:document.getElementsByName('t')[0].value--;\">"
  buf = buf.."<br><input type=\"button\" style=\"height:40px;width:120px;font-size:28px;margin-top:8px;color:red;\" value=\"OFF\" onClick=\"javascript:location.href='?t=off'\"><br><br>"
  buf = buf.."<input style=\"height:60px;width:120px;font-size:32px;\" type=\"submit\" value=\"Set\"></form></p>"
  buf = buf.."</center></font></body></html>"

if(_GET.a ~= nil)then
  if(_GET.a ~= nil)then
    action = _GET.a;
    if action == "gt" then
      buf = buf.."HTTP/1.1 200 OK\n\n"
      buf = buf..gt
    end
end

function pulse(dir, anz)
  z=gpio.read(p1)
  for i=1, anz*2, 1 do
   if z == 0 then
     z=1
   else
     z=0
   end
   if dir == "+" then
     gpio.write(p1, z);
     tmr.delay(10000); -- 10ms
     gpio.write(p2, z);
     tmr.delay(10000);
   else
     gpio.write(p2, z);
     tmr.delay(10000);
     gpio.write(p1, z);
     tmr.delay(10000);
   end
  end
end

function settemp(temp)
 print("Setting Temp to "..temp..".")
 tt = (temp*2)-9; 
 pulse("-", 60) --init
 pulse("+", tt)
end

Heizungsthermostatsteuerung mit ESP8266 für unter 5,- EUR

Um mir die Zeit zu vertreiben, bis die Teile für den 3D-Drucker eintreffen, habe ich mich ein bisschen mit chinesischen Chips beschäftigt.

Hierbei fiel mir der ESP8266 auf, den es in verschiedenen Versionen gibt.

Es ist ein Mikrocontrollermodul, welches WLAN eingebaut hat und sich ähnlich wie ein Arduino programmieren lässt. Er wird auch oft hergenommen, um dem Arduino WLAN beizubringen. Wenn es dann um simple Schaltvorgänge oder Auslesen von Sensoren geht, ist der Arduino oft überflüssig, denn das kann der 8266 auch, und das zum erstaunlichen Preis!

Out-of-the box besitzt er einen AT-Befehlssatz, ähnlich wie Modems. Bequemer geht es aber, wenn man die NodeMCU – Firmware flasht. Dann kann man das Modul mit lua-Scripten füttern, was bequemer ist und mehr Möglichkeiten bietet.

Das tolle: Der 8266 kann im 2,4 GHz WLAN wahlweise als LAN-Client, als WLAN-Accesspoint oder sogar beides gleichzeitig sein. Die Bedienung ist dabei kinderleicht. Er gibt z.B. eine Liste der Accesspoints in der Nähe aus und man verbindet ihn mit einem davon (wenn das Kennwort bekannt ist). Oder er wird als Accesspoint sichtbar und man verbindet z.B. sein Handy mit diesem und erhält von seinem integrierten DHCP-Server eine IP-Adresse. Mit ein paar Zeilen Code lässt sich ein simpler Webserver realisieren, über den man dann mit ihm interagiert. Sogar die WLAN-Reichweite ist beeindruckend. Sie entspricht zu hause etwa meinem Mobiltelefon.

Da es Varianten mit bis zu 9 GPIOs (Ein- und Ausgänge für Sensoren oder Schalter) gibt, ist z.B. denkbar, ihn im Hausflur zu installieren. Er überwacht per Taster oder Reedkontakt, zu welchen Zeiten die Tür geöffnet wird, besitzt einen Temperatur- und Lichtsensor und berichtet alle 15 Minuten die Messdaten zu einem SQL-Server im Netz. Daneben läuft ein Webserver, der auf Button-Action per Relais den Haustürsummer betätigt. All dies ist mit wenigen Codezeilen möglich und benötigt eben keinen zusätzlichen Arduino.

Die kleinste Variante ESP8266-01 hat 2 GPIOs und kostet in China ca. 1,70 EUR.

Nachteil des ganzen ist sein durch das ständig aktive WLAN sein Stromverbrauch, der immer um die 100 mA liegt. Damit würden 2 AA-Batterien nach zwei Tagen leer sein. Der 8266 benötigt also ein Netzteil. Außerdem läuft er mit 3,3V (auch an den Kommunikationspins!), was noch etwas an Bauteilen benötigt, aber nicht schlimm.

Inspiriert durch ein Youtube Video von Allan Turing habe ich an einen eq-3 Heizungsthermostat Model K 3 Leitungen an den Drehimpulsgeber, mit dem man den Thermostat manuell steuern kann, gelötet und nach außen geführt. Die nötigen Impulse auszugeben, um den Thermostat zu steuern, ist für den 8266 ein leichtes.

Mit einer einfachen Weboberfläche kann der Thermostat manipuliert werden. Also auch vom Smartphone aus, oder eben von der ganzen Welt aus.

In diesem Video ist der erste Versuchsaufbau zu sehen, noch ohne Webinterface, sondern nur selbstlaufend in einem Demo-Modus:

Hier die Schaltung dazu:

ESP8266-EX_02_Thermostatsteuerung_Steckplatine

Es wurde ein ESP8266-EX benutzt, was aber nicht nötig ist, da nur 2 Ausgänge benötigt werden. An diesen hängt übrigens ein NPN-Transistor, der den jeweiligen Drehgeberausgang im Rhytmus nach Masse schaltet.

Das rote Modul rechts ist bloß der USB-to-Serial-Converter zum Aufspielen des Scriptes. Zum Betrieb fällt es weg Zu sehen ist außerdem noch ein 5V to 3,3V Modul, was aus 5V 3,3V macht, wenn man kein Netzteil hat, was direkt 3,3V liefert.

Vielleicht mache ich noch ein Video mit dem laufenden Webinterface.

Wen das lua-Script interessiert, das auf dem 8266 werkelt, hier ist es:

p1=1 -- GPIO05 ganz aussen
p2=2 -- GPIO4
gpio.mode(p1, gpio.OUTPUT);
gpio.mode(p2, gpio.OUTPUT);
wt=21
srv=net.createServer(net.TCP)
print ("WEBSERVER started.")
srv:listen(80,function(conn)
 conn:on("receive", function(client,request)
 local c = ""
 local buf = "";
 local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
 if(method == nil)then
 _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
 end
 local _GET = {}
 if (vars ~= nil)then
 for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
 _GET[k] = v
 end
 if(_GET.t ~= nil)then
 wt = _GET.t
 gt = wt
 if _GET.p == "on" then
 gt=wt + 0.5
 c = " checked"
 end
 print("Argument 't' was "..gt);
 settemp(gt)
 end
 end
 buf = buf.."<html><center><h1> ESP8266 Thermostatsteuerung</h1>";
 buf = buf.."<p><form action=\"?\">Temp: <input style=\"height:50px;width:60px;font-size:40px;\" type=\"text\" name=\"t\" value=\""
 buf = buf..wt
 buf = buf.."\">&nbsp;&nbsp;&nbsp;&nbsp;<input style=\"transform: scale(3); -webkit-transform: scale(3);\" type=\"checkbox\" name=\"p\" value=\"on\""
 buf = buf..c
 buf = buf..">&nbsp;&nbsp;&nbsp;&nbsp;+ 0.5°<br><br><input style=\"height:60px;width:100px;\" type=\"submit\" value=\"Set\"></form></p></center></html>";

 client:send(buf);
 client:close();
 collectgarbage();

 end)
end)

function pulse(dir, anz)
 z=gpio.read(p1)
 for i=1, anz*2, 1 do
 if z == 0 then
 z=1
 else
 z=0
 end
 if dir == "+" then
 gpio.write(p1, z);
 tmr.delay(5000); -- 10ms
 gpio.write(p2, z);
 tmr.delay(5000);
 else
 gpio.write(p2, z);
 tmr.delay(5000);
 gpio.write(p1, z);
 tmr.delay(5000);
 end

 end
end

function settemp(temp)
 print("Setting Temp to "..temp..".")
 tt = (temp*2)-10;
 pulse("-", 60) --init
 pulse("+", tt)
end


Es fehlt nur das init.lua, was bei Inbetriebnahme der Schaltung zu meinem WLAN verbindet; das sind aber nur 5-6 langwelige Zeilen.