Hallo Zusammen,
ich möchte gerne in meinen Gardena R40LI eine ES8266 Board mit WIFI installieren und am Motherboard anschliessen, damit ich über FHEM Befehle mittels Post/Get den Roboter steuern kann.
Es gibt im Netz eine gute Anleitung dazu mit den HEXcode, aber leider mehr mit dem Fokus auf der Hardware "LOXONE" und wie man es auf dieser Plattform realisiert >:(
https://www.loxwiki.eu/pages/viewpage.action?pageId=48137811
Ich war in der Lage auf dem ESP9266 das Sketch zu installieren und mit dem WIFI zu verbinden. Ich kann nun mittels einem Browser (siehe Bild Anhang) Befehle absetzen. Ebenso hat der Programmier vom Sketch erwähnt, dass man direkt Befehle absetzen kann (siehe auch unten)
Meine Frage hier wäre.
Gibt es im FHEM eine Möglichkeit HTTP Befehle direkt an den ESP zusenden, wie auf dem Web Formular quasi ohne das Web Formular einsetzen zu müssen?
Wenn ich mir das HTML Coding ansehen sind folgende Funktionen im Header aufgebaut. Die Funktion "function con() " baut beispielsweise die Verbindung zum ESP auf.
Gruss, Markus
______________________________________________________________________
<html><head><title>dihav SerialPort over WiFi - HTML Interface</title></head><body style="background-color:#1C2128;text-align:center;line-height:250%"><br><div style="width:500;padding:10;margin:auto;box-shadow:0 0 6 2 rgba(0,0,0,0.2);border-radius:10;background-color:#8EA9CC"><style>input{width:100%} select{width:100%} .b2{width:50%} .b4{width:25%} </style><script language=javascript>
var art, rfc = 0;
function con() {
var s='bdrt=' + frm.bdrt.value + '&dbt=' + frm.dbt.value + '&sbt=' + frm.sbt.value + '&prty=' + frm.prty.value;
var req = new XMLHttpRequest();
req.onload = function(e) {
if (req.status == 200) if (req.responseText == 'OK') {
frm.disbtn.disabled = false;
frm.conbtn.disabled = true;
if (frm.ars.value != 0) art = setInterval(rec, frm.ars.value);
}
}
req.open('POST', 'con?' + rfc.toString(), true);
rfc++;
req.send(s);
}
function dis() {
var req = new XMLHttpRequest();
req.onload = function(e) {
if (req.status == 200) if (req.responseText == 'OK') {
frm.disbtn.disabled = true;
frm.conbtn.disabled = false;
clearTimeout(art);
}
}
req.open('GET', 'dis?' + rfc.toString(), true);
rfc++;
req.send(null);
}
function arschng() {
if (frm.disbtn.disabled) return;
clearTimeout(art);
if (frm.ars.value != 0) art = setInterval(rec, frm.ars.value);
}
function rec() {
if (frm.disbtn.disabled) return;
var req = new XMLHttpRequest();
req.onload = function(e) {
if (req.status == 200) if (req.responseText.startsWith('OK')) {
frm.recvd.innerHTML += dt2txt(req.responseText.substr(2), frm.rectp.value);
}
}
req.open('GET', 'rec?' + rfc.toString(), true);
rfc++;
req.send(null);
}
function send(data) {
if (frm.disbtn.disabled) return;
var req = new XMLHttpRequest();
req.onload = function(e) {
if (req.status == 200) if (req.responseText == 'OK') {
frm.sndhst.innerHTML += dt2txt(data, frm.dttp.value);
}
}
req.open('POST', 'snd?' + rfc.toString(), true);
rfc++;
req.send(data);
}
function snddt() {
var d = '', v = frm.snd.value, t = frm.dttp.value, p = '', i;
if (t != 0) v += ' ';
for (var k = 0; k < v.length; k++)
if (t == 0) {
d += v.charCodeAt(k).toString(16);
} else if (v.charAt(k) == ' ') {
if ((p != '') && (t == 1)) i = parseInt(p, 16);
if ((p != '') && (t == 2)) i = parseInt(p);
if (!isNaN(i)) {
if (i < 0) i = 0;
if (i > 255) i = 255;
if (i < 16) d += '0';
d += i.toString(16);
}
p = '';
} else
p += v.charAt(k);
if (frm.apnd.value == 1) d += '0d';
if (frm.apnd.value == 2) d += '0a';
if (frm.apnd.value == 3) d += '0d0a';
send(d);
}
function dt2txt(data, typ) {
var r = '', i;
for (var k = 0; k < data.length; k += 2) {
i = parseInt(data.substr(k, 2), 16);
if (typ == 0) r += String.fromCharCode(i);
if ((typ == 1) && (i < 16)) r += '0';
if (typ == 1) r += i.toString(16) + ' ';
if (typ == 2) r += i.toString() + ' ';
}
return(r);
}
____________________________________________________________
Step 10: Directly Use WiFi in Your Program
If you want to make a program that directly connects to this device without using the software downloaded from step 6, use the following protocol, I've made for this device.
Each [] is a byte.
Baud rate on port 2321 is a 4-byte value that most significant byte will be sent first.
Connect:
HTTP (Port 80):
Request: POST con
bdrt=####&dbt=#&sbt=#&prty=#
Response: OK or ER
Port 2321:
Request: [1][bdrt][bdrt][bdrt][bdrt][dbt][sbt][prty]
Response:
- or [1]
Disconnect:
HTTP (Port 80):
Request: GET dis
Response: OK
Port 2321:
Request: [2]
Response: [1]
Receive Data:
HTTP (Port 80):
Request: GET rec
Response: OK...data(hex)... or ER
Port 2321:
Data bytes will be sent to a server created on the PC on port 2321.
Send Data:
HTTP (Port 80):
Request: POST snd
...data(hex)...
Response: OK or ER
Port 2321:
Request: [3][datasize(max255)]...data...
Response: - or [1]
Test Connection:
Port 2321:
Request: [4]
Response: [44]
Nein bisher leider noch nicht. Bei dir?
Anscheinend muss man nur GET und POST Requests absenden. Von daher, sollte es mit HTTPMOD möglich sein
Alternativ mit curl in myUtils
Mein Material (Flachbandkabel und Pfostenstecker) ist noch unterwegs, trotzdem habe ich mich mal etwas eingelesen.
Für mein Projekt benötige ich folgende Befehle:
#Manuell:
#02-0E-01-03-D2-03
system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-03-D2-03"
#Auto:
#02-0E-01-04-51-03
system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-04-51-03"
#Home:
#02-0E-01-02-8C-03
system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-02-8C-03"
#Start:
#02-0E-01-01-6E-03
system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-01-6E-03"
#Stop:
#02-0E-01-00-30-03
system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-00-30-03"
Versuche deshalb mal in die FHEM-Commandozeile folgendes einzugeben (curl muss installiert sein auf deinem RPI):
IP 192.168.x.y durch die deines ESP ersetzen
{system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-02-8C-03"}
und
{system "curl -s -k http://192.168.x.y/send?cmd=02-0E-01-01-6E-03"}
Danach sollte der Robotermäher zurück zur Basis fahren..
Bei den curl Parameter (-s -k) bin ich mir nicht ganz sicher, ob diese benötigt werden. Das werde ich testen, sobald mein Material hier ist.
Viel Erfolg!
Wenn das so ist, und dazu keine Authentifizierung nötig ist, kann man das super einfach mit HTTPMOD abbilden:
define R40li HTTPMOD 192.168.x.y/send?cmd=%%code%% 0
attr R40li replacement01Mode text
attr R40li replacement01Regex %%code%%
attr R40li get01Name Manuell
attr R40li get01Replacement01Value 02-0E-01-03-D2-03
attr R40li get02Name Auto
attr R40li get02Replacement01Value 02-0E-01-04-51-03
attr R40li get03Name Auto
attr R40li get03Replacement01Value 02-0E-01-02-8C-03
attr R40li get04Name Auto
attr R40li get04Replacement01Value 02-0E-01-01-6E-033
Ich habe selbst kein Gardena. Aber wenn Du das HTTPMOD wie oben definierst, und dann die Log mit verbose 5 zeigst, könnte man weiter gehen. Selbst das Login kann man einfach in HTTPMOD einbauen.
Hallo, habe eine Anleitung zur Automatisierung des Gardena R40li mit einem ESP8266 in folgendem Beitrag hinterlegt: https://forum.fhem.de/index.php/topic,111669.0.html