NEWS
socket io - state lesen und setzen
-
@apollon77 sagte in socket io - state lesen und setzen:
Warum nehmt ihr getStates? Ich meinte oben getState (Einzahl). Dann wäre es direkt gegangen
Ganz einfach, Unwissenheit. Auf der socket.io Readme im Github Repo steht nur was von getStates, nichts bzgl. getState. Da scheint bei @liv-in-sky aber irgendwas weiterhin nicht zu passen, weil es bei ihm anscheinend weiterhin nicht funktioniert.
@HeinrichB
Hier wurde die grundsätzliche Vorgehensweise diskutiert. Den Text für den Button kann man ja individuell ergänzen.
Bei der Zeile mit setState einfach darunter noch einmal setState Funktion aufrufen. Dort dann den gewünschten Text in eine objID schreiben. True / False Anzeige klappt wie das togglen an sich. Aber richtige freie Texte, da wirst du wohl noch eine Bedingung einfügen müssen. -
moin - alles gut - jetzt läuft es auch bei mir - nochmals dank für deine hilfe und bemühungen
@apollon77 mal eine theoretische frage: das ganze könnte man doch auch mit rest api also dem simpleapi adapter lösen - wahrscheinlich etwas umständlicher - müßte aber funktionieren
achja wegen getstates vs. getstate - selbe antwort wie @GiuseppeS - war das erste mal, dass ich socket kommunikation angewendet habe - bisher habe ich alles über simpleapi gmacht, was von außerhalb iobroker kommt (z.b. tasker) -
@GiuseppeS said in socket io - state lesen und setzen:
Hier wurde die grundsätzliche Vorgehensweise diskutiert. Den Text für den Button kann man ja individuell ergänzen.
Das ist schon klar, mir ging es darum, ob dies vom Konzept schon gehen sollte oder ich dafür sorgen muss.
Bei der Zeile mit setState einfach darunter noch einmal setState Funktion aufrufen. Dort dann den gewünschten Text in eine objID schreiben. True / False Anzeige klappt wie das togglen an sich. Aber richtige freie Texte, da wirst du wohl noch eine Bedingung einfügen müssen.
Gut, dann steuere ich die Buttonbeschriftung passend dynamisch
Wenn ich je Button einen anderen DP antriggern will und nicht nur den einen DP setzen will, muss ich dann das Skript duplizieren?
Danke
-
@GiuseppeS sagte in socket io - state lesen und setzen:
zitat:
Bin auch kein ITler und mit JS erst seit iobroker unterwegs. Aber diese Möglichkeiten mit iobroker, VIS und Co. sind einfach genial.kann ich nur unterstützen - die jungs machen einen klasse job
-
@HeinrichB ich denke nicht - man sollte den datenpunkt als variable in das script übergeben können und nicht erst im scipt definieren - wie erwähnt wir waren erst beim grundsätzlichen - jetzt kommt die umsetzung
-
@liv-in-sky Alles klar. Ich bin schon "ruhig" und lese/lerne. Danke
-
@HeinrichB momentan wird ein "this,value" an das script übergeben
<button value="true" onClick="setOnClickCustom(this.value)">BtnDevice</button>
in der function dann (val)
function setOnClickCustom(val) {
so kann auch der datenpunkt übergeben werden, der ja in der tabelle auch verwendet wird
-
Hallo
also this.value ist ja der Wert value (oben value=true) und der wird in der setOnClick.... auf einen DP gesetzt. Soweit ja auch verstanden.
Wenn ich nun zwei Geräte habe und dann immer nur value=true übergeben, dann habe ich eine 2:1 Zuordnung und nicht auflösbar.
Aber wie gesagt:Das sind nur fragen und ich will Eure Umsetzung nicht stören. Ich werde jetzt erstmal passiv weiter mitlesen, wie Eure Umsetzungen laufen
Danke
-
@HeinrichB ich habe das this.value nicht mehr drin - brauche ich momentan nicht
wie der wert momentan ist, wird im script ja gelesen (getStates) und dann getoggelt (setState)
bei mir steht meist ON OFF drin in der tabelle und nicht true /falseein problemchen ist noch, dass die eigentliche tabelle erst den geschalteten wert anzeigt, wenn das schedule wieder läuft, was die tabelle erzeugt
ich habe ein iobroker- java-script - das erzeugt eine tabelle - diese tabelle beinhaltet unser neues script mit dem button - wenn ich nun den button drücke, bleibt der wert in der tabelle unverändert - erst wenn das iobroker script wieder durch den schedule eine neue tabelle erzeugt, wird der neue wert angezeigt
damit das aber sofort angezeigt wird, müßte man wohl einen triggerpunkt auf true setzen , damit das iobroker javascript sofort läuft und eine neue tabelle erstellt
@GiuseppeS siehst du das ähnlich ? -
@liv-in-sky Mir geht es nicht um den Text als solches, mir geht es darum, wenn ich eine Tabelle mit N Geräten habe und die alle mit dem Button an/aus (on/off etc) geschaltet werden sollen. In der Skriptfunktion steht aber genau EIN statischer DP drin, auf den alles dann geht: also N:1 Zuordnung
Oder ich kapiere es nicht
-
@HeinrichB die statische var des datenpunktes löscht du raus und statt dessen kommt er über eine variable
nur zur veranschaulichung:
.... <button style="border:none; background-color:transparent; color:white; font-size:1em; text-align:left" value="toggle" onclick="setOnDblClickCustom("0_userdata.0.Tasker_Bool")">{toggle}</button> </td> </tr> </table> <script> function setOnDblClickCustom(objID) { // var objID = "0_userdata.0.Tasker_Bool"; servConn.getStates(objID, (error, states) => { console.log(states); servConn.setState(objID, !states[objID].val); }); } </script>
oben beim aufruf ist jetzt der datenpunkt drin und wird übergeben an setOnDblClickCustom
unten im script gibt es keine statische def der variablen objID mehr -
Danke:-)
Ich arbeite mich da durch -
So, ich habe mal bisschen was ausprobiert und nun etwas entwickelt, dass xakt macht,
was ich brauche. Mag etwas handfest sein und unelegant, aber ich kann alles aus dem
Skript in der HTML-Tabelle ansprechen.
Geht alles sicher alles eleganter, aber ich weiss halt nun, wo ich selbst was anpassen kannDanke an @liv-in-sky und @GiuseppeS
<table border="1"> <tr> <td class="HeaderFormat" align="center">Gerät</td> <td class="HeaderFormat" align="center"><b>Heute</b></td> <td class="HeaderFormat" align="center"><b>Gestern</b></td> <td class="HeaderFormat" align="center"><b>Gesamt</b></td> <td> <button value="true" onClick="setOnClickCustom(value, 'unit')">{v:0_userdata.0.TestDPUnit;v == "true" ? "An":"Aus"}</button> </td> </tr> <tr> <td class="LineFormat" align="center"><b>SolarHaus</b></td> <td class="LineFormat" align="center"><b>{hs100.0.192_168_2_112.totalNow}kWh</b></td> <td class="LineFormat" align="center"><b>{0_userdata.0.daily_earning_solar_house}kWh</b></td> <td class="LineFormat" align="center"><b>{0_userdata.0.total_earning_solar_house}kWh</b></td> <td> <button value="true" onClick="setOnClickCustom(value, 'solar')">{v:0_userdata.0.TestDPSolar;v == "true" ? "An":"Aus"}</button> </td> </tr> </table> <script> function setOnClickCustom(val, device) { var objID; if (device == "unit") { objID = "0_userdata.0.TestDPUnit"; } if (device == "solar") { objID = "0_userdata.0.TestDPSolar"; } servConn.getStates(objID, (error, states) => { console.log(states); servConn.setState(objID, !states[objID].val); }); } </script>
-
@HeinrichB
Deine Buttons übergeben den Wert "true". Ist aber unnötig, da unten in der Funktion nicht weiter verarbeitet.
Stattdessen kannst du den value der Buttons auf "unit" bzw. "solar" ändern, und diesen übergeben.@liv-in-sky
Weil ich mit dynamischen Tabellen arbeite und viele Buttons darin nutze habe ich es anders gelöst:
Buttons übergeben als value eine eindeutige "ID". Diese ID wird innerhalb der Tabelle mit der dblClick-Function inkl. setState in einer objID geschrieben.
In meinem Javascript (nicht VIS), dass die dynamische Tabelle erzeugt, reagiere ich auf die Aktualisierung der objID und führe entsprechend Aktionen aus (z.B.: wenn ID == Btn-Row1-Col2 dann toggle objID_XY und generiere Tabelle).- Auf diese Art stehen mir alle Javascript-Funktionen unkompliziert zur Verfügung (außerhalb VIS in Scrip-Engine Adapter)
- Mein HTML-Code beinhaltet bei X Buttons nicht X Funktionen sondern immer nur eine Funktion
- Ich benötige nur eine objID, in die der Button-Value (= Button-ID) geschrieben wird
Was eleganteres ist mir nicht eingefallen.
Aber in diesem Thread wurde die Fragestellung des Eröffnungspost geklärt. Im Thread, in dem wir gestern gestartet waren, hatte ich meinen Tabellenaufbau grob dargestellt.
-
@GiuseppeS said in socket io - state lesen und setzen:
Deine Buttons übergeben den Wert "true". Ist aber unnötig, da unten in der Funktion nicht weiter verarbeitet.
Stattdessen kannst du den value der Buttons auf "unit" bzw. "solar" ändern, und diesen übergeben.Danke. Läuft
-
Danke für die Infos hier.
Hier ein Anwendungsbeispiel: https://forum.iobroker.net/topic/30552/tipp-in-vis-in-html-widget-getstate-nutzen-zur-anzeige