NEWS
vis-Skript - CSS-Klassen in Abhängikeit von DP zuschalten
-
Hallo Zusammen,
aktuell schalte ich in meiner vis einen Nachtmodus über ein Skript ein, dass mir ab einer bestimmten Uhrzeit bestimmte CSS-Klassen aktiviert.
if((hour >= 21) || (hour <= 6)) { $("#vis_container").addClass("nightmode"); }
Anstatt der Uhrzeit würde ich gerne einen DP nutzen mit dem ich den Nachtmodus aktivieren kann: 0_userdata.0.Eigene_Objekte.vis.Nachtmodus
Folgendes habe ich bereits ausprobiert, jedoch ohne Erfolg:
if (getState("0_userdata.0.Eigene_Objekte.vis.Nachtmodus").val === true) { $("#vis_container").addClass("nightmode"); } //ODER if (("0_userdata.0.Eigene_Objekte.vis.Nachtmodus").val === true) { $("#vis_container").addClass("nightmode"); }
Kann mir bitte jemand auf die Sprünge helfen?
-
ein beispiel für das abfragen eines dp und auch für das setzen:
setInterval(function(){ Self.servConn.getStates(['0_userdata.0.CONTROL-OWN.ECHO8.Echo2Player-PP','javascript.0.YouTube.whichDevice'], (error, states) => { /*console.log(states); */ if (states['javascript.0.YouTube.whichDevice'].val != 2) { if (x.duration > 0 && !x.paused) { vis.setValue('0_userdata.0.CONTROL-OWN.ECHO8.Echo2PlayerStatus',true); isRunning=true; } else { vis.setValue('0_userdata.0.CONTROL-OWN.ECHO8.Echo2PlayerStatus',false); isRunning=false; /* console.log("paused")*/} .... .... } } ); /* ende getState*/ }, 5000) /* ende Interval*/ }, timeout12);
das gibt es nicht in der vis:
if (("0_userdata.0.Eigene_Objekte.vis.Nachtmodus").val
-
warum machst du das nicht per binding direkt in vis?
du klickst in vis irgendwo hin, so das kein widget selektiert ist
dann siehst du rechts die Eigenschaften.
Dort öffnest du den Abschnitt CSS-Allgemein i welchem sich das Feld css klasse befindet
dort könntest du dann den folgenden Text eintragen{value:javascript.0.hintergrundmodus;value=="night"?"night":"day"}
was bedeutet, wenn im datenpunkt das wort night drin steht, wird dem iobroker container die css klasse night hinzugefügt, sonst day
danach kannst du deine css klassen wie gehabt im css-reiter definieren
https://forum.iobroker.net/topic/12320/gelöst-css-für-widget-background/3
-
Vielen Dank für den Hinweis, jedoch passt das nicht ganz zu meiner Architektur. Ich verwende zu fast jedem Widget andere Werte im Nachtmodus. Mit dem Skript überschreibe ich dann ab einer bestimmten Uhrzeit die Werte aus den eigentlichen CSS-Klassen mit den Werten aus den .nightmode CSS-Klassen. Anbei ein Beispiel:
.textbox { font-size: 10px; padding: 10px 15px 30px; box-shadow: 0px 0px 20px #cfcfcf; border-radius: 8px; z-index: 5; background: #fff; border: 0px; }
.nightmode .textbox { background: #000; box-shadow: 0px 0px 0px #333; }
@liv-in-sky
Ich bin dank deines Beispiels mit meinem Skript zwar etwas weiter gekommen sodass ich jetzt entsprechend den Uhrzeiten (ohne ein zusätzliches Java-Skript) einen Datenpunkt direkt aus dem vis-Skript geschalten bekommevar date = new Date(); var hour = date.getHours(); setTimeout("document.location.reload();",600000); if((hour >= 19) || (hour <= 18)) { $("#vis_container").addClass("nightmode"); vis.setValue('0_userdata.0.Eigene_Objekte.vis.Nachtmodus',true); } else { vis.setValue('0_userdata.0.Eigene_Objekte.vis.Nachtmodus',false); }
Somit bekomme ich mein Problem jetzt über einen Umweg gelöst.
Dennoch wäre es für mich sehr interessant wie der Code aussehen würde wenn die Wenn-Bedingung nicht die Uhrzeit sondern der Wert eines Datenpunktes wäre. Das habe ich jetzt trotz des Beispiels leider nicht abgeleitet bekommen.Hintergrund: ich würde gerne je nach dem ob der Nachtmodus aktiviert ist einige Widgets anzeigen oder nicht (das bekomme ich jetzt mit der o.g. Anpassung hin) und außerdem wäre es schön den Nachtmodus zusätzlich zur Zeit auch per DP ein- und ausschalten zu können (das fehlt mir noch, dazu würde ich die if-Abfrage bezogen auf einen DP im vis-skript benötigen)
Folgendes habe ich ausprobiert, jedoch ohne Erfolgt:
if (states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val == true) { $("#vis_container").addClass("nightmode"); }
Wenn das funktionieren würde hätte ich zum einen meine nightmode-Klassen bei DP=true und zusätzlich würde ich diesen DP par Java-Skript über die Uhrzeit steuern.
-
denke, es müßte so aussehen
Self.servConn.getStates(['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'], (error, states) => { /*console.log(states); */ if (states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val == true) { $("#vis_container").addClass("nightmode"); } } ); /* ende getState*/
damit das ganze aber auch wirklich getriggert wird, muss du eine interval function außenrum machen - so wird alle 15 sek gecheckt, wie der dp steht.
setInterval(function(){ Self.servConn.getStates(['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'], (error, states) => { /*console.log(states); */ if (states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val == true) { $("#vis_container").addClass("nightmode"); } } ); /* ende getState*/ }, 15000) /* ende Interval*
habe das ganze nicht getestet - das überlasse ich dir
-
funktioniert leider nicht. im ioB-Log wird leider auch nichts ausgegeben.
wollte den vis.adapter mal zur Überprüfung auf debug stellen aber das kennt er anscheinend nicht
"State "system.adapter.vis.0.logLevel" has no existing object, this might lead to an error in future versions"Aber trotzdem vielen Dank für die Mühe!
-
@prorun
dann könntest du noch ein html widget anlegen,
dort ein scriptblock rein
dann per binding einer variable den wert des datenpunkts zuweisen,
auswerten und mit jquery addClass den entsprechenden Knoten seine Klasse zuweisen -
console.log wird z.b. in chrome in den entwicklertools unter konsole angezeigt !
wenn du in den entwicklertools bist, kannst du die seite refreshen und unter konsole wirden dir auch alle fehler angezeigt - sonst wüßte ich nicht, wie man debugggen könnte
lass dir mal die states ausgeben - innerhalb der getStaetes function
z.b.
console.log(states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val);
-
@OliverIO
Vielen Dank für die guten Tipps. Würde es aber gerne vorerst über das Skript versuchen wollen.@liv-in-sky
da kommt im Log nix an. nutze zwar firefox aber der hat ebenfalls die Entwicklerkonsole an bord. sehe alle möglichen state-initialisierungen da drin und auch einen "ws connection error" der mich etwas stutzig macht aber keine Log-Ausgabe die zu unserem Skript passen könnte.habe es jetzt wie folgt im skript stehen:
Self.servConn.getStates(['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'], (error, states) => { console.log(states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val); if (states['0_userdata.0.Eigene_Objekte.vis.Nachtmodus'].val == true) { $("#vis_container").addClass("nightmode"); } } ); /* ende getState*/
-
habe nochmal getestet mit einem dp von mir:
setInterval( () => { Self.servConn.getStates(['0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2'], (error, states) => { var date = new Date(); var sek = date.getSeconds(); console.log('der dp ist: '+states['0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2'].val +' Sekunde: '+sek); if (states['0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2'].val == true) { console.log("jetzt im Script in if - true"); } else {console.log("jetzt im Script in if - false");} vis.setValue('0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2',!states['0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2'].val) } ); /* ende getState*/ }, 5000)
hier die logs im entwicklertool in chrome: