NEWS
Values >0 & <1 werden von Widgets als False interpretiert
-
Ich steige derzeit von CCU.IO/DashUI auf IOBroker/VIS um und bin dabei nun auf folgendes Problem gestoßen:
Unter DashUI wurden in den Widgets Werte zwischen >0 und <1 grundsätzlich in True gewandelt. Nur exakt 0 wurde in False gewandelt. Dadurch konnte man Bool-Widgets auch wunderbar auf Level-Datenpunkte anwenden, um bspw. einen eingeschalteten Dimmer mit einem Bool-Widget zu signalisieren. In VIS ist dies leider nicht mehr möglich, da Werte <1 in False gewandelt werden. Ein also nicht auf 100% laufender Dimmer kann so nur als ausgeschaltet signalisiert werden.
Hat jemand hierfür eine Lösung bzw. gibt es ein Widget bei dem ich in Abhängigkeit von unterschiedlichen Wertebedingungen unterschiedlichen HTML-Code ausführen kann?
-
Die Dimmer und Rolladen in ioBroker sind von 0 bis 100.
Das wundert mich, dass die Widgets nicht klar kommen.
Welches Widget meinst du genau?
-
Das Problem sind die Level-Datenpunkte der Homematic-Devices, welche mit dem Wertebereich 0-1 und nicht 0-100 arbeiten. 25% Helligkeit ergibt somit den Level = 0,25.
Beispiel-Widget: Basic-Bool-HTML-CTRL. Liegt die Helligkeit eines Dimmers bspw. bei 25%, so wird dennoch der False-HTML-Code ausgeführt, da der Level-Datenpunkt = 0,25 ist, was anscheinend als False interpretiert wird.
-
Also geht es dir nur um bool Widgets?
Ich habe auch bulb on/off Widgets in einer View für meine lampen. Hier ist das Widget nur bei 100% dimmung auf on.
Ist aber im Prinzip eine "missbräuchliche" Nutzung
Gruß
Rainer
-
Ja, es geht nur um die Bool-Widgets. Als missbräuchlich sehe ich es eigentlich nicht. Per Definition ist FALSE=0 und TRUE=1. Wenn man es also genau nehmen wollte, dann dürfte bei einer Dezimalzahl zwischen 0 und 1 weder der True, noch der False-Zweig ausgeführt werden.
Da wir hier aber über Automationssyteme, die nicht nur aus Schaltern, sondern auch aus Dimmern/Jalousien etc. bestehen sprechen und es hier ja um die Visualisierung dieser Komponenten geht, sehe ich es persönlich so, das 0=FALSE ist und >0=TRUE. Dezimalzahlen zwischen 0 und 1 als FALSE einzustufen, halte ich aber definitiv für den ungeeignetsten Weg. Da würde mir spontan überhaupt kein Anwendungsfall einfallen. Es ist ja auch konträr zum Verhalten unter DashUI.
Falls man hieran nichts ändern kann/möchte: Ich nutze heute ein HTML-BOOL-CTRL-Widget um Schaltaktoren und Dimmer (Letzter Helligkeitszustand) einzuschalten und gleichzeitig zu symoblisieren, ob der Aktor/Dimmer aktiv/inaktiv. Hierbei nutze ich wie gesagt das HTML-BOOL-CTRL und habe jeweils im HTML-False bzw. HTML-True-Zweig die Texte "AN" bzw. "AUS" mit den unterschiedlichen Farben definiert. Somit ein einfacher Weg einen Toggle-Button zu bauen. Ich möchte hier auf keinen Fall mit Grafiken arbeiten, sondern bei reinem Text bleiben.
Gibt es denn ein Control-Widget bei dem ich in Abhängigkeit des Wertes eines Datenpunktes unterschiedlichen HTML-Code ausführen kann. Wichtig dabei ist, das wirkliche Bedingungen (>,=,<) genutzt werden können und nicht nur eine fixe Werteliste wie bspw. beim Widget Basic-HTML8, denn zwischen 0 und 1 liegen beim Leveldatenpunkt ja 99 Werte und nicht nur 8.
-
Das Problem sind die Level-Datenpunkte der Homematic-Devices, welche mit dem Wertebereich 0-1 und nicht 0-100 arbeiten. 25% Helligkeit ergibt somit den Level = 0,25.
Beispiel-Widget: Basic-Bool-HTML-CTRL. Liegt die Helligkeit eines Dimmers bspw. bei 25%, so wird dennoch der False-HTML-Code ausgeführt, da der Level-Datenpunkt = 0,25 ist, was anscheinend als False interpretiert wird. `
Also bei allen meinen Aktoren mit Level-Werten werden die Dezimal-Werte aus der CCU in Prozentwerte (Integer) umgesetzt sodass die States nur Werte zwischen 0 und 100 haben. Damit das klappt ist beim State als native Einheit (Native unit) der Wert "100%" eingetragen. Dann erfolgt die Umrechnung sowohl durch hm-rpc als auch hm-rega automatisch.
Was hast du denn für einen Aktor? Vielleicht wird dieser Typ falsch initialisiert und es fehlt dort die entsprechende Eintragung.
-
Ich habe angeregt durch deine Frage die Sinnhaftigkeit dieses Tuns hinterfragt.
Klar wäre es schön, wenn ich bei bulb on/off sehen würde, ob noch Licht an ist. (Dafür habe ich das Widget ja primär). Dazu müsste dann bei jedem Wert >0 der Wert des Widgets true sein.
Es liesse sich jetzt vortrefflich streiten, was die falschere Auslegung von true/false ist, oder ob gar gerundet werden sollte.
Aber jetzt nutze ich das Widget auch um die noch abgeschalteten Lampen auszuschalten.
Soweit ist auch noch alles gut.
Aber man kann dann die Lampen auch wieder anschalten. Und das wäre IMHO der Wert über dem cutoff, bei dem false auf true springt.
In dem von dir gewünschten Fall also fast aus, glimmend
Wie hast du das geregelt
@mule:Ich nutze heute ein HTML-BOOL-CTRL-Widget um Schaltaktoren und Dimmer (Letzter Helligkeitszustand) einzuschalten und gleichzeitig zu symoblisieren, ob der Aktor/Dimmer aktiv/inaktiv. `
Dass der Dimmer auf letzten Level geht?Gruß
Rainer
-
Es liesse sich jetzt vortrefflich streiten, was die falschere Auslegung von true/false ist, oder ob gar gerundet werden sollte. `
Theoretisch ja, aber in der Praxis sollte die Variante genutzt werden, die am häufigsten vorkommt. Und die heute implementierte Variante ist meiner Meinung nach eben nicht praxisrelevant. Zumindest fehlt mir die Fantasie, wie und wo die derzeitige Variante wirklich einen Nutzen darstellen kann. Ich denke auch, das HQ für DashUI bewusst und nicht per Zufall die von mir angesprochene Variante implementiert hatte.Wie hast du das geregelt
@mule:Ich nutze heute ein HTML-BOOL-CTRL-Widget um Schaltaktoren und Dimmer (Letzter Helligkeitszustand) einzuschalten und gleichzeitig zu symoblisieren, ob der Aktor/Dimmer aktiv/inaktiv.
Dass der Dimmer auf letzten Level geht?
Ich muss zugeben, das meine Ausführung im Bezug auf Dimmer nicht ganz vollständig waren. Bei Dimmern nutze ich lediglich ein Basic-Bool-HTML-Value Widget zur Anzeige des An/Aus-Status. Darüber liegt dann ein komplett transparentes Bool-CTRL Widget um eine Variable zu toggeln, welche denn entweder Level auf 0 oder OldLevel auf 1 setzt. Bei reinen Schaltaktoren reicht dann natürlich ein Bool-HTML-CTRL Widget. -
Ich habe mal für dich Licht angemachtEs sind eigentlich alles Schaltaktoren, lediglich die Deckenbeleuchtung in wohn und Esszimmer sind gedimmt.
Dies bulb on/off gehen tatsächlich erst an, wenn auf 100% gedimmt ist.
Aber wo willst du den einschaltlevel setzen, wenn die "Kontrollleuchte" bereits beim leisesten Glimmen leuchten soll?
Gruß
Rainer
-
Um wie viele gedimmte Lampen geht es denn?
Man könnte auch für jede Lampe einen Datenpunkt per Skript erzeugen, der auf true steht, sobald der Dimmer nicht ganz aus ist.
Umgekehrt könnte man auch über diesen Datenpunkt den Dimmer per Skript ganz ausschalten oder auf einen definierten Wert (letzter Wert vor aus // 50% // …).
-
Ich habe mal für dich Licht angemacht `
So richtig erleuchtet bin ich jedoch noch nicht , denn ich verstehe nicht wozu man einen Indikator für "Lampe = An" benötigt, der aber nur bei einer Helligkeit von 100% anspringt? Was ist der Sinn und Zweck dahinter? Liegt es an meinem dicken Brett vor dem Kopf oder hat es keinen richtigen Zweck?Aber wo willst du den einschaltlevel setzen, wenn die "Kontrollleuchte" bereits beim leisesten Glimmen leuchten soll? `
Aus ist Aus, alles andere, ob wenig oder viel Glimmen ist An. Wusste bisher nicht, das es diesbezüglich zwei Meinungen geben kann?! Wenn ein Gerät Strom verbraucht, dann sagt man doch auch nicht, das es keinen Strom verbraucht nur weil es wenig oder sehr wenig (was ja zudem auch noch relativ ist) Strom verbraucht. Nur bei 0,0 Volt verbraucht es eben keinen Strom.Danke für den Hinweis. Ja, so könnte es gehen. Aber ich gebe die Hoffnung noch nicht auf, das es auch direkt mit irgendeinem Widget geht. Auch wenn ich selbst ein derartiges Widget bisher noch nicht gefunden habe. Aber vielleicht habe ich ja etwas übersehen oder das TRUE/FALSE-Verhalten wird doch noch zu DashUI kompatibel angepasst
Ich habe auch bereits einen (halben) Workaround per Notification gefunden, da man dort richtige Bedingungen definieren kann. Leider lässt sich da aber der Text nicht zentrieren, sondern wird absolut positioniert. Das ist bei Toggle-Buttons mit unterschiedlicher Größe lästig, da man dann immer die absoluten Werte je nach Größe anpassen muss.
-
denn ich verstehe nicht wozu man einen Indikator für "Lampe = An" benötigt, der aber nur bei einer Helligkeit von 100% anspringt? `
Hatte ich ja in einem vorigen Post geschrieben, dass mir das erst durch diese Diskussion bewusst wurde, dass das Widget gar nicht im gedimmen Zustand on anzeigt.Insofern wäre deine Version schon sinnvoll.
Im anderen Teil reden wir anscheinend aneinander vorbei.
> Aus ist Aus, alles andere, ob wenig oder viel Glimmen ist An. Wusste bisher nicht, das es diesbezüglich zwei Meinungen geben kann?! Wenn ein Gerät Strom verbraucht, dann sagt man doch auch nicht, das es keinen Strom verbraucht nur weil es wenig oder sehr wenig (was ja zudem auch noch relativ ist) Strom verbraucht. Nur bei 0,0 Volt verbraucht es eben keinen Strom.
das ist absolut unstrittig.Das Widget dient auch der Bedienung für "boolsche" Schaltaktoren. On/off!
Wenn das Widget bei <0,1% dimmung von true auf false schaltet, würde es im Umkehrschluss die Lampe beim Versuch sie anzuschalten nur auf 0,1% Dimmen. In dem Funktionsumfang, den das Widget jetzt hat, geht der Dimmer auf 100%, also volles Licht.
Gruß
Rainer
-
Was hast du als min und was als max eingestellt?
Hier ist die Funktion die entscheided ob aus oder an ist:
isFalse: function (val, min, max) { if (min !== undefined && min !== null && min !== '') { if (max !== undefined && max !== null && max !== '') { return val != max; } else { return val == min; } } if (val === undefined || val === null || val === false || val === 'false' || val === 'FALSE' || val === 'False' || val === 'OFF' || val === 'Off' || val === 'off' || val === '') return true; if (val === '0' || val === 0) return true; var f = parseFloat(val); if (f.toString() !== 'NaN') return !f; return false; },
Wenn du tätsächlich 0 bis 1 hast (was ich überhaupt nicht glaube (hast du im admin gecheckt?)) dann sollte es gehen, wenn du min auf 0 setzts und max lehr läst.
-
Was hast du als min und was als max eingestellt?
Wenn du tätsächlich 0 bis 1 hast (was ich überhaupt nicht glaube (hast du im admin gecheckt?)) dann sollte es gehen, wenn du min auf 0 setzts und max lehr läst. `
Danke für den Hinweis, aber bei dem Widget Basic-Bool-HTML-Value tauchen im VIS-Editor die Felder für min und max gar nicht auf (allerdings sind sind sie in der XML-Struktur des Widgets vorhanden). Nur beim entsprechenden Control-Widget tauchen min und max im Editor auf. Oder verstehe ich Dich falsch bzw. welchen Admin wovon meinst Du?Edit: Wenn ich die Control-Variante des Bool-HTML Widgets nehme, dann kann ich min = 0 und max = NULL im VIS-Editor setzen und es funktioniert dann auch wir von Dir geschrieben. Nur leider hilft mit die Control-Variante hier nicht weiter, ich benötige nur das reine Bool-HTML-Version ohne "Klick"-Möglichkeit und hier sind min und max leider im VIS-Editor nicht vorhanden. Sicherlich könnte ich jetzt einfach die XML-Definition per Hand ändern, aber das ist sicherlich kein sauberer Weg und bei einer Änderung würde ja wahrscheinlich alles wieder überschrieben werden.
denn ich verstehe nicht wozu man einen Indikator für "Lampe = An" benötigt, der aber nur bei einer Helligkeit von 100% anspringt? `
Hatte ich ja in einem vorigen Post geschrieben, dass mir das erst durch diese Diskussion bewusst wurde, dass das Widget gar nicht im gedimmen Zustand on anzeigt.Insofern wäre deine Version schon sinnvoll. `
Oh, dann hatte ich Dich falsch verstanden.denn ich verstehe nicht wozu man einen Indikator für "Lampe = An" benötigt, der aber nur bei einer Helligkeit von 100% anspringt?
Wenn das Widget bei <0,1% dimmung von true auf false schaltet, würde es im Umkehrschluss die Lampe beim Versuch sie anzuschalten nur auf 0,1% Dimmen. In dem Funktionsumfang, den das Widget jetzt hat, geht der Dimmer auf 100%, also volles Licht.
Ich befürchte auch, das wir aneinander vorberreden: Ich nutze ja bei den Dimmern das Basic-HTML-Bool Widget zweimal je Dimmer:1.) Zur Anzeige des Status auf Basis des Datenpunkt Level. Hierbei eben mit dem Wunsch das der Input der gewählten ObjektID/des Datenpunkts "Level" in der Weise 0 = False und alle anderen Werte = True interpretiert wird. Sozusagen die input-Richtung des des Widgets.
2.) Zur Steuerung soll natürlich beim Klick wie gehabt ein "richtiges" True = 1 an die gewählte ObjektID/den Datenpunkt (in meinem Fall eine Variable über die dann Level = 0 bzw. OLDLevel = 1 getoggelt gesetzt wird)
Verschiedene Dimmstufen gehen damit natürlich nicht, aber dafür sind die Bool-Widgets ja auch nicht ausgelegt. Dies, wie auch die Farbeinstellung bei LED-Stripes, löse ich mit einer "Subview". Da man aber meist doch nur eine Defaulteinstellung für Farbe und Helligkweitswert nutzt (zumindest ist es bei uns so) reicht An/Aus auf der Mainview vollkommen aus.
-
aber bei dem Widget Basic-Bool-HTML-Value tauchen im VIS-Editor die Felder für min und max gar nicht auf `
Auch wenn min und max nicht gesetzt sind (oder nicht gesetzt werden können) dann ist dieses Kode aktiv:isFalse: function (val) { if (val === undefined || val === null || val === false || val === 'false' || val === 'FALSE' || val === 'False' || val === 'OFF' || val === 'Off' || val === 'off' || val === '') return true; if (val === '0' || val === 0) return true; var f = parseFloat(val); if (f.toString() !== 'NaN') return !f; return false; },
Und als Ergebnis fur 0.1 kommt definitiv true.
welchen Admin wovon meinst Du? `
48_2016-08-25_22_48_51-camera_uploads.png -
Auch wenn min und max nicht gesetzt sind (oder nicht gesetzt werden können) dann ist dieses Kode aktiv: `
Ich glaube ich habe die Ursache für das Problem gefunden: Ich habe ja alle meine Views aus DashUI per Import/Export übernommen. Hierbei wurden für das BOOl-HTML Widget auch min (=0) und max (=1) übernommen (oder bei der Migration erzeugt?):"w00084": { "tpl": "tplValueBool", "data": { "hm_id": "3728", "digits": "", "factor": 1, "min": 0, "max": 1, "step": 0.01, "html_false": "LED-Decke", "html_true": "LED-Decke", "filterkey": "Licht", "visibility-cond": "==", "visibility-val": 1, "signals-cond-0": "==", "signals-val-0": true, "signals-icon-0": "/vis/signals/lowbattery.png", "signals-icon-size-0": 0, "signals-blink-0": false, "signals-horz-0": 0, "signals-vert-0": 0, "signals-hide-edit-0": false, "signals-cond-1": "==", "signals-val-1": true, "signals-icon-1": "/vis/signals/lowbattery.png", "signals-icon-size-1": 0, "signals-blink-1": false, "signals-horz-1": 0, "signals-vert-1": 0, "signals-hide-edit-1": false, "signals-cond-2": "==", "signals-val-2": true, "signals-icon-2": "/vis/signals/lowbattery.png", "signals-icon-size-2": 0, "signals-blink-2": false, "signals-horz-2": 0, "signals-vert-2": 0, "signals-hide-edit-2": false, "oid": "hm-rpc.0.MEQ1782284.1.LEVEL" }, "style": { "left": 9, "top": "235px", "text-shadow": "rgba(0, 0, 0, 0.9) 3px 3px 4px", "font-family": "serif", "text-align": "center", "color": "rgb(0, 0, 0)", "font-size": "16px", "line-height": "55px", "background-color": "rgb(50, 50, 50)", "border-width": "1.6px", "border-style": "solid", "border-color": "rgb(200, 200, 200)", "border-radius": "10px", "height": 55.8, "width": 117.80000000000001, "z-index": "0" }, "widgetSet": "basic"
Wenn ich nun aber ein neues Bool-HTML Widget über den VIS-Edit anlege, dann fehlen hier die min und max Einträge und die Definition sieht wie folgt aus und damit funktioniert es dann auch:
"w00048": { "tpl": "tplValueBool", "data": { "oid": "nothing_selected", "visibility-cond": "==", "visibility-val": 1, "signals-cond-0": "==", "signals-val-0": true, "signals-icon-0": "/vis/signals/lowbattery.png", "signals-icon-size-0": 0, "signals-blink-0": false, "signals-horz-0": 0, "signals-vert-0": 0, "signals-hide-edit-0": false, "signals-cond-1": "==", "signals-val-1": true, "signals-icon-1": "/vis/signals/lowbattery.png", "signals-icon-size-1": 0, "signals-blink-1": false, "signals-horz-1": 0, "signals-vert-1": 0, "signals-hide-edit-1": false, "signals-cond-2": "==", "signals-val-2": true, "signals-icon-2": "/vis/signals/lowbattery.png", "signals-icon-size-2": 0, "signals-blink-2": false, "signals-horz-2": 0, "signals-vert-2": 0, "signals-hide-edit-2": false }, "style": { "left": "214px", "top": "629px" }, "widgetSet": "basic" }
Es ist somit wohl ein Problem der Migration von DashUI zu VIS. Kann ich min und max bei den betreffenden Widgets einfach manuell entfernen oder sind dadurch Probleme zu erwarten?
-
Ich habe nun die XML-Definition der entsprechenden Widgets manuell bearbeitet und max = "" gesetzt. Damit funktioniert es wie beschrieben. Es funktioniert im Übrigen nicht, wenn man min und max aus der XML-Definition entfernt. Es werden dann anscheinend irgendwelche Defaultwerte genommen (0 und 1?).
Das manuelle Ändern der XML-Datei ist ja aber keine saubere Lösung. Wäre es möglich auch bei reinen Value-Widgets min und max im VIS-Editor einzublenden?