Hallo liebe Fhem-Freunde!
Wir sind gerade dabei erste Versuche zu unternehmen ein eigenes Frontend für Fhem zu programmieren.
Das ganze wollten wir via Ajax-Request lösen, indem wir uns zum Beispiel das Ergebnis von jsonlist2 oder xmllist liefern lassen.
Nun stoßen wir allerdings auf das Problem, dass unser Cross-Origin Request blockiert wird.
Unser Minimalrequest sieht zur Zeit so aus:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:7072", true);
xhr.withCredentials = true;
xhr.send();
xhr.send() wird blockiert, mit der Nachricht:
"The Same Origin Policy disallows reading the remote resource at http://localhost:7072."
Wir haben schon probiert CORS in FHEMWEB zu aktivieren, aber wissen nicht so wirklich wo man das Attribut setzen muss. Haben es in der Datei fhemweb.pm an der einzig uns logisch erscheinenden Stelle auf 1 gesetzt, doch es half leider nichts.
Exzessives Googlen bringt uns nicht weiter. Wir würden uns sehr freuen wenn uns ein erfahrener Fhemer auf die Sprünge helfen könnte.
Viele Grüße,
klosterm
Vielleicht solltest ihr eure Entscheidung für AJAX generell nochmal überdenken. Beschäftigt euch mal mit Fronthem. Das ist eine Websocket-Schnittstelle für FHEM und Websockets sind für solche Frontends doch deutlich besser geeignet als AJAX.
Vielen Dank für den Tipp, marvin!
Wir schauen uns das mal an :D
Edit:
Wir haben nun auf unserer fhem-Installation einen Websocket eingerichtet und können auch schon mithilfe von fhem_websocket.js auf unseren fhem-Server zugreifen. (Status unseres fronthemDevices wird als connected angegeben).
Unsere Frage ist jetzt wie wir Befehle an den fhem-Server richten können. fhem.sendCommand() liefert zwar keinen Fehler, wird aber anscheinend vom Server einfach ignoriert und es kommt auch kein return value an, beispielsweise beim jsonlist2-Command.
Kannst du uns vllt an dieser Stelle nochmal auf die Sprünge helfen? Vielleicht liegt es am Befehlsformat oder wir müssen unserem Device noch die passenden Rechte geben?
Viele Grüße,
klosterm
An dieser Stelle nochmal ein kleiner "push", da der Beitrag immer weiter in den Untiefen des Forums versinkt und das Problem weiterhin besteht.
Wir wären sehr dankbar, wenn sich jemand kurz mit dem Problem befassen könnte, um uns einen Impuls zu geben, woran es zur Zeit scheitert.
Die Verbindung über Web-Sockets funktioniert soweit einwandfrei (danke nochmal für den Tipp!), die Befehle kommen auch beim Server an, dieser gibt jedoch nichts zurück.
Wir freuen uns über jegliche Art von Hilfe, damit klosterm und ich das Projekt weiter fortsetzen können, da wir zur Zeit ziemlich auf dem Schlauch stehen.
Hallo,
der push war völlig ok.
Wo kommt denn das "fhem.sendCommand()" her ?
Könnt Ihr bitte kurz schildern wo Ihr steht, gern mit codefragmenten oder pseudo.code ?
vg
jörg
Vielen Dank für deine Antwort, Jörg!
Der Befehl sendCommand kommt aus der JS-Bibliothek "fhem_websocket.js", zu finden hier:
https://raw.githubusercontent.com/ntruchsess/fhem-mirror/websockets/fhem/www/fhem_websocket.js
In der Funktion selbst wird der send()-Befehl auf der bestehenden Verbindung zum WebSocket aufgerufen.
fhem.sendCommand = function(cmd) {
con.send(JSON.stringify({
type: 'command',
payload: cmd
}));
};
Unser Codefragment sieht zur Zeit so aus:
[...]
<script src="scripts/fhem_websocket.js" type="text/javascript"></script>
<script>
var fhem = new fhem();
openCon = function () {
fhem.secure = false;
fhem.connect("127.0.0.1", "2121");
}
sendCommand = function() {
var input = "shutdown";
fhem.sendCommand({
command: input
});
console.log("Sent command");
}
fhem.onconnected = function() {
console.log("Connected to websocket.");
fhem.subscribeEvent("all");
fhem.list();
}
</script>
[...]
<p><input type="button" value="open" onclick="openCon();"/></p>
<p><input type="button" value="send" onclick="sendCommand();"/></p>
[...]
openCon() funktioniert soweit, zumindest wird auf der Konsole "Connected to websocket." ausgegeben, das heißt die onconnected wird ausgeführt. localhost wird auch in fhem in den WebSockets als connected aufgeführt.
Nur beim sendCommand() passiert einfach nichts. Fhem ignoriert dies einfach. An dieser Stelle hängen wir gerade fest! :(
Schon mal vielen Dank für deine Mühen!
Grüße,
klosterm und bluebrink
ja ok, so was hatte ich vermutet. Ihr werdet ja unterschiedliche Transport evaluieren.
fronthem und fhem_websocket von Norbert sind ganz unterschiedliche Dinger.
Bei fhem_websocket bin ich nicht so im Thema, ntruchness (Norbert) liefert da sicher gern details. Soweit ich weiß kapselt ntruchness tatsächlich die fhem JSON strings in einem websocket, dafür braucht Ihr aber noch "sein" fhem modul.
fronthem ist aus der Anbindung von smartvisu (googelt das schnell) entstanden - die Schnittstelle in fhem (modul fronthem) ist generisch und auch für andere frontends offen.
fronthem trennt funktion und design so: im fronthend ist ein button (eine anzeige etc) ein "Ding". Im fronthemDevice (modul) gibt es einen converter der vom user konfiguriert wird. Dort wird den "button" eine fhem aktion zugeordnet. Für fronthem könnt Ihr Euch das existierende Frontend smartvisu.de beispielhaft anschauen. Dieses frontend existiert unabhängig von fhem und hat mit fhem (oder mir) nichts zu tun. Fronthem verbindet dieses frontend mit fhem.
Für fronthem könnt Ihr Euch also (für ws Kommunikation) an smartVisu codetechnisch orientieren - aber natürlich existieren auch andere Schnittstellen zu fhem (nativ json, xml, cors, websockets ntruchness) - das müsst Ihr für Euch entscheiden.
vg
jörg