NEWS
[gelöst]iFrame Widget mit HTML/js-Datenaustausch zu iob
-
ist die html seite separat?
ich würde mir in vis eine view bauen
in der dann deine daten, die regelmäßig aus dem iobroker aktualisiert werden sollen, enthalten sind.diese view würde ich dann per iframe in deiner html seite "einblenden".
dadurch wird der ganze mechanismus bereitgestellt, der vollautomatisch dann die daten aktualisiert ohne das du die html seite neu laden musst.die daten direkt aus der html seite abzurufen ist leider etwas aufwändiger, da du mehr oder weniger den mechanismus aus vis nachbauen musst (websocket erzeugen, mit iobroker verbinden, datenpunkte abonnieren, dann auf gemeldete ereignisse reagieren, html in deiner webseite aktualisieren mit den gemeldeten daten)
die andere möglichkeit wäre, die daten regelmäßig zu pollen, also automatisch einen reload der seite zu initieren, was aber dann entsprechende last auf den client und den server/iobroker erzeugt.
@oliverio
hmmm, HTML-Seite separat? kann ich jetzt nicht beurteilen, da kenne ich mich viel zu wenig aus.
Ich vermute ja. Ich kann die webseite auf meinem Windows-PC unter Firefox anschauen (und debuggen):
Die View, in der diese HTML-Seite per iFrame Widget eingebettet ist, sieht dann so aus:

Jetzt möchte ich abhängig von dem inhalt des iobroker-Objekts "SP" (boolean) in der HTML-Karte etwas modifizieren: die Farbe der Linie zwischen dem blauen und dem roten Marker.
Das habe ich mit dem o.g. Code auch geschafft. Aber wenn ich auf "SP" drücke und das Objekt von true <->false umschalte passiert (verständlicherweise) nichts in dem getrennt programmierten HTML/js System.
- websocket erzeugen, etc. ... das kriege ich mit meinem rudimentären Grundwissen nicht hin
- regelmässig pollen fällt m.M. wegen der zusätzlichen Rechenlast aus (nur Raspi 4!)
Deshalb kam ich auf die Idee, daß es vielleicht einen Weg über die Systemgrenzen hinweg gibt, über den ich vom ioBroker in's HTML/js System eingreifen kann.
in ioBroker skripten habe ich ja sowas zur Verfügung (und schon erfolgreich benutzt) z.B.
// Trigger bei Wertänderung des Verbrauchs on("solarlog.0.status.conspac", function(dp) { update_solar_p_netz(); });meine Idee war jetzt "solarlog.0.status.conspac" durch "http://192.168.27.147:8087/mqtt.0.rot_LP" o.Ä. zu ersetzen und das script im HTML/js System laufen zu lassen
oder eben ein ioBroker script zu schreiben das die Info in's HTML/js System pushedIhr merkt an meiner Ausdrucksweise, daß ich an dieser Stelle so gut wie keine Ahnung habe ... wenn das nicht geht dann dann sagt's mir bitte und ich lasse es ... ich kann gut mit dem bisher erreichten leben ;-)
Bin gespannt auf eure Kommentare, vielen Dank im Voraus
WillyIoBrok
-
@oliverio
hmmm, HTML-Seite separat? kann ich jetzt nicht beurteilen, da kenne ich mich viel zu wenig aus.
Ich vermute ja. Ich kann die webseite auf meinem Windows-PC unter Firefox anschauen (und debuggen):
Die View, in der diese HTML-Seite per iFrame Widget eingebettet ist, sieht dann so aus:

Jetzt möchte ich abhängig von dem inhalt des iobroker-Objekts "SP" (boolean) in der HTML-Karte etwas modifizieren: die Farbe der Linie zwischen dem blauen und dem roten Marker.
Das habe ich mit dem o.g. Code auch geschafft. Aber wenn ich auf "SP" drücke und das Objekt von true <->false umschalte passiert (verständlicherweise) nichts in dem getrennt programmierten HTML/js System.
- websocket erzeugen, etc. ... das kriege ich mit meinem rudimentären Grundwissen nicht hin
- regelmässig pollen fällt m.M. wegen der zusätzlichen Rechenlast aus (nur Raspi 4!)
Deshalb kam ich auf die Idee, daß es vielleicht einen Weg über die Systemgrenzen hinweg gibt, über den ich vom ioBroker in's HTML/js System eingreifen kann.
in ioBroker skripten habe ich ja sowas zur Verfügung (und schon erfolgreich benutzt) z.B.
// Trigger bei Wertänderung des Verbrauchs on("solarlog.0.status.conspac", function(dp) { update_solar_p_netz(); });meine Idee war jetzt "solarlog.0.status.conspac" durch "http://192.168.27.147:8087/mqtt.0.rot_LP" o.Ä. zu ersetzen und das script im HTML/js System laufen zu lassen
oder eben ein ioBroker script zu schreiben das die Info in's HTML/js System pushedIhr merkt an meiner Ausdrucksweise, daß ich an dieser Stelle so gut wie keine Ahnung habe ... wenn das nicht geht dann dann sagt's mir bitte und ich lasse es ... ich kann gut mit dem bisher erreichten leben ;-)
Bin gespannt auf eure Kommentare, vielen Dank im Voraus
WillyIoBrok
so habe ich dich verstanden
ich habe eine funktionierende HTML-Seite aus den ioBroker Benutzerdaten in einem iFrame Widget visualisiert.
@willyiobrok sagte in iFrame Widget mit HTML/js - Datenaustausch zu iob objekten:
@oliverio
hmmm, HTML-Seite separat? kann ich jetzt nicht beurteilen, da kenne ich mich viel zu wenig aus.und hast du hier ja auch erklärt
Das habe ich mit dem o.g. Code auch geschafft. Aber wenn ich auf "SP" drücke und das Objekt von true <->false umschalte passiert (verständlicherweise) nichts in dem getrennt programmierten HTML/js System.
dann musst du dein aktuelles setting genauer erklären. dann habe ich es noch nicht verstanden.
wenn jemand von einer html-seite spricht, dann verstehe ich da etwas ausserhalb von iobroker
wenn du etwas in iobroker bspw mit vis visualisiert, dann hätte ich das schlüsselwort vis oder view erwartet.also welche seite, hast du wo eingebunden. welche visualisierung verwendest du?
Gerne kannst du das was du hast exportierte view oder html hier posten, dann kann man sich das besser vorstellen
Deshalb kam ich auf die Idee, daß es vielleicht einen Weg über die Systemgrenzen hinweg gibt, über den ich vom ioBroker in's HTML/js System eingreifen kann.
ja das gibt es
aber halt so wie oben geschriebender on befehl im javascript adapter macht das genau so, websocket zum iobroker und dann informiert der aktiv, wenn der javascript adapter was machen soll.
das polling könnte man relativ klein halten indem immer alle paar sekunden die api für den datenpunkt abgefragt und verglichen wird ob sich da etwas geändert hat.
-
so habe ich dich verstanden
ich habe eine funktionierende HTML-Seite aus den ioBroker Benutzerdaten in einem iFrame Widget visualisiert.
@willyiobrok sagte in iFrame Widget mit HTML/js - Datenaustausch zu iob objekten:
@oliverio
hmmm, HTML-Seite separat? kann ich jetzt nicht beurteilen, da kenne ich mich viel zu wenig aus.und hast du hier ja auch erklärt
Das habe ich mit dem o.g. Code auch geschafft. Aber wenn ich auf "SP" drücke und das Objekt von true <->false umschalte passiert (verständlicherweise) nichts in dem getrennt programmierten HTML/js System.
dann musst du dein aktuelles setting genauer erklären. dann habe ich es noch nicht verstanden.
wenn jemand von einer html-seite spricht, dann verstehe ich da etwas ausserhalb von iobroker
wenn du etwas in iobroker bspw mit vis visualisiert, dann hätte ich das schlüsselwort vis oder view erwartet.also welche seite, hast du wo eingebunden. welche visualisierung verwendest du?
Gerne kannst du das was du hast exportierte view oder html hier posten, dann kann man sich das besser vorstellen
Deshalb kam ich auf die Idee, daß es vielleicht einen Weg über die Systemgrenzen hinweg gibt, über den ich vom ioBroker in's HTML/js System eingreifen kann.
ja das gibt es
aber halt so wie oben geschriebender on befehl im javascript adapter macht das genau so, websocket zum iobroker und dann informiert der aktiv, wenn der javascript adapter was machen soll.
das polling könnte man relativ klein halten indem immer alle paar sekunden die api für den datenpunkt abgefragt und verglichen wird ob sich da etwas geändert hat.
ok, ich versuch's nochmal mit meinen laienhaften Worten (bin C/C++ Microcontroller-Programmierer, habe nur sehr wenig mit html und js gemacht) ;-)
ja, ich habe eine getrennte und unabhängige HTML - Webseite, bestehend aus den beiden Files
"Rotor.html" und "distDir2.js"
Diese Files habe ich mit Hilfe der ioBroker "Dateien"-Funktion auf den ioBroker Raspberry 4 in den Benutzerdaten-Bereich geladenZum Anzeigen des Ganzen habe ich über den vis editor ein View gebaut, in dem das Widget iFrame benutzt wird.
Darüberhinaus werden hier noch einige andere ioBroker Objekte mit Hilfe verschiedener Widgets angezeigt.Wenn ich jetzt in die Weltkarte tippe (mit Maus oder Touchscreen) dann wird ein zweiter Marker gesetzt und zwischen den beiden Markern eine Linie gezogen.
Darüberhinaus wird eine Richtung von Marker1 zu Marker2 errechnet, die an das iobrokersystem zur Weiterverarbeitung übergeben wird (HTML/js System -> ioBroker System):// Rückmeldung der Ergebnisse an ioBroker ------------------------------------------ function reportResult(distance, direction) { if (distance!=0) { fetch(`http://192.168.27.147:8087/set/0_userdata.0.distance?value = ${encodeURIComponent(distance)}`, { method: "GET" }); fetch(`http://192.168.27.147:8087/set/0_userdata.0.direction?value = ${encodeURIComponent(direction)}`, { method: "GET" }) ; // muß gelöscht werden, wenn die response Zeilen aktiviert werden ... /* .then(response => response.json()) // Antwort als JSON parsen .then(data => console.log(data)) // Daten verarbeiten .catch(error => console.error('Fehler:', error)) ; */ }Die Weiterverarbeitung in ioBroker funktioniert in diesem Falle (gefühlt) sofort, alles gut.
Was ich jetzt zusätzlich wollte ist halt die Gegenrichtung (ioBroker System -> HTML/js System), die ich jetzt irgendwie recht kompliziert wegen Timingproblemen (siehe 1.Post) hingekriegt habe.
Das was noch fehlt werde ich wohl oder übel per polling einmal pro ? sekunden realisieren müssen, das sehe ich jetzt auch so - danke für die "Meinungsbildung" ;-)
Hoffe, das war jetzt verständlicher...
-
ok, ich versuch's nochmal mit meinen laienhaften Worten (bin C/C++ Microcontroller-Programmierer, habe nur sehr wenig mit html und js gemacht) ;-)
ja, ich habe eine getrennte und unabhängige HTML - Webseite, bestehend aus den beiden Files
"Rotor.html" und "distDir2.js"
Diese Files habe ich mit Hilfe der ioBroker "Dateien"-Funktion auf den ioBroker Raspberry 4 in den Benutzerdaten-Bereich geladenZum Anzeigen des Ganzen habe ich über den vis editor ein View gebaut, in dem das Widget iFrame benutzt wird.
Darüberhinaus werden hier noch einige andere ioBroker Objekte mit Hilfe verschiedener Widgets angezeigt.Wenn ich jetzt in die Weltkarte tippe (mit Maus oder Touchscreen) dann wird ein zweiter Marker gesetzt und zwischen den beiden Markern eine Linie gezogen.
Darüberhinaus wird eine Richtung von Marker1 zu Marker2 errechnet, die an das iobrokersystem zur Weiterverarbeitung übergeben wird (HTML/js System -> ioBroker System):// Rückmeldung der Ergebnisse an ioBroker ------------------------------------------ function reportResult(distance, direction) { if (distance!=0) { fetch(`http://192.168.27.147:8087/set/0_userdata.0.distance?value = ${encodeURIComponent(distance)}`, { method: "GET" }); fetch(`http://192.168.27.147:8087/set/0_userdata.0.direction?value = ${encodeURIComponent(direction)}`, { method: "GET" }) ; // muß gelöscht werden, wenn die response Zeilen aktiviert werden ... /* .then(response => response.json()) // Antwort als JSON parsen .then(data => console.log(data)) // Daten verarbeiten .catch(error => console.error('Fehler:', error)) ; */ }Die Weiterverarbeitung in ioBroker funktioniert in diesem Falle (gefühlt) sofort, alles gut.
Was ich jetzt zusätzlich wollte ist halt die Gegenrichtung (ioBroker System -> HTML/js System), die ich jetzt irgendwie recht kompliziert wegen Timingproblemen (siehe 1.Post) hingekriegt habe.
Das was noch fehlt werde ich wohl oder übel per polling einmal pro ? sekunden realisieren müssen, das sehe ich jetzt auch so - danke für die "Meinungsbildung" ;-)
Hoffe, das war jetzt verständlicher...
ja, danke, viel verständlicher.
probier mal einmal die sekunde und schau auf die systemlast.
ich denke das wird schon gehen. -
ja, danke, viel verständlicher.
probier mal einmal die sekunde und schau auf die systemlast.
ich denke das wird schon gehen.@oliverio
Das mit dem Pollen hat prima geklappt!
Danke für die Hilfe! :-) -
Hallo zusammen,
meine SW hat bis heute gut funktioniert.
Aber jetzt bekomme ich folgende Fehlermeldung:
Object { error: 'error: no value found for "0_userdata.0.direction". Use /set/id?value=1 or /set/id?value=1&wait=1000' }
Ich vermute, daß der HTML-Call nicht mehr funktioniert:
fetch(`http://192.168.27.147:8087/set/0_userdata.0.direction?value = ${encodeURIComponent(direction)}`, { method: "GET" }) .then(response => response.json()) // Antwort als JSON parsen .then(data => console.log(data)) // Daten verarbeiten .catch(error => console.error('Fehler:', error));Ich habe gestern mehrere Adapter (welche?) auf den neuesten Stand gebracht, vielleicht ist da irgendetwas in der Verbindung zwischen ioBroker und meinem HTML-File kaputtgegangen?
kann das mit dem Update des web-adapters zu tun haben?bin im Moment ratlos ...
-
Noch eine Zusatzinfo: Habe das Ganze wieder zum Laufen gebracht, indem ich ein ioBroker-Backup von vorgestern eingespielt habe.
Empirisch habe ich herausgefunden, daß es wohl an dem Simple-Api Adapter liegt:
Ich konnte leider mit der Warnung nichts anfangen ...

Weiss jemand, was ich machen muß, nachdem ich auf eine Version >3 upgedated habe?
Wie kriege ich meinen "own local port" wieder?
-
Noch eine Zusatzinfo: Habe das Ganze wieder zum Laufen gebracht, indem ich ein ioBroker-Backup von vorgestern eingespielt habe.
Empirisch habe ich herausgefunden, daß es wohl an dem Simple-Api Adapter liegt:
Ich konnte leider mit der Warnung nichts anfangen ...

Weiss jemand, was ich machen muß, nachdem ich auf eine Version >3 upgedated habe?
Wie kriege ich meinen "own local port" wieder?
kann die fehlermeldung leider auch nicht interpretieren.
Schau mal hier noch.
zwischen 2.8.0 und 3.0.7 sind noch ein paar mehr Änderungen
https://github.com/ioBroker/ioBroker.simple-api?tab=readme-ov-file#changelog -
ok, danke für den Link.
sofern "web extension" dasselbe bedeutet wie "Web-Adapter-Erweiterung" dann habe ich die web extension nicht aktiviert, das kann also nicht die Ursache sein.
Ich habe die Versionen durchprobiert - beim Übergang von 2.8.0 auf 3.0.0 passiert's.
mit 2.8.0 geht's noch, mit >3.0.0 nicht mehr.
ich glaube, da muß ich anders rangehen ... aber wie ?
-
konnte es in einem anderen Thread lösen:
Es waren beim Fetch-Aufruf 2 spaces zuviel, hier ist der korrekte Aufruf, der auch mit den neueren simple-Api-Versionen funktioniert:
// sende die Himmelsrichtung an den ioBroker/mqtt-Server, um den Rotor entsprechend anzusteuern fetch(`http://192.168.xx.xx:8087/set/0_userdata.0.direction?value=${encodeURIComponent(direction)}`, { method: "GET" }) .then(response => response.json()) // Antwort als JSON parsen .then(data => console.log(data)) // Daten verarbeiten .catch(error => console.error('Fehler:', error));Vielen Dank für die Hilfe!
Gruß
WillyIoBrok
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden