Hallo,
Ich möchte den Wert des POWER Readings von meiner AVM Steckdose 546e farblich an den Wert anpassen.
Unter 10W --> BLAU
über 10W --> ROT
über 1600W --> GELB
dafür habe ich folgenden Code benutzt:
<div class="narrow"
data-type="label"
data-device="FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9"
data-get="power"
data-limits='[10,1000,1600]'
data-colors='["blue","red","yellow"]'>
</div>
Leider wird die Leistung aber nur in weiss dargestellt.
Habe ich die Benutzung des Widgets Label falsch verstanden?
Oder liegt es an dem "W" welches im Reading übermittelt wird?
Die Ausgabe ist "0.71 W" wobei ich aber kein "data-unit" Attribut vergeben habe. EDIT: Während des Schreibens hat die Heizung eingeschaltet und ist auf "591.58 W" hoch gefahren.
Die Raw Def lautet:
defmod FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 FBDECT FritzBox_AHA:24_65_11_CA_FD_E9 powerMeter,switch
attr FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 IODev FritzBox_AHA
attr FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 alias prise_cabanne_Fritz_546e
attr FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 event-min-interval power:120
attr FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 room FBDECT
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 on
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 AIN 24:65:11:CA:FD:E9
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 FBNAME Powerline-Cabanne
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 FBPROP powerMeter,switch
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 FBTYPE FRITZ!Powerline 546E
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 ID 20001
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 devicelock no
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 energy 3361 Wh
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 fwversion 06.50
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 locked no
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 mode manuell
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 power 591.58 W
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 present yes
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 state on
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 voltage 228.982 V
Danke für eure Erklärungen
@jumperger
Vermutlich hilf das Attribut data-part ...
data-part="1"
Weder bei FBDECT, noch beim Widget SYMBOL, kann ich ein Attribut data-part in der Wiki oder Commandref finden.
Wo kann ich dazu Infos finden?
Zitat von: jumperger am 19 November 2019, 10:51:09
Habe ich die Benutzung des Widgets Label falsch verstanden?
Wieso
Widget SYMBOL?
Info zu
data-type="label" gibt's unter https://wiki.fhem.de/wiki/FTUI_Widget_Label (https://wiki.fhem.de/wiki/FTUI_Widget_Label) ...
Du nutzt aber kein Widget symbol, sondern label
https://wiki.fhem.de/wiki/FTUI_Widget_Label
Zu spät...
Schande über mein Haupt :-[
Zur Erklärung des Fehlers, über dem Label liegt ein Symbol ( heating aus der oa ) welches ich ebenfals rot und blau einfärben wollte, hat aber auch nicht geklappt, deswegen der Versuch mit Label da dies in den Wiki-Beispielen zu Label fast 1:1 aufgeführt ist.
Ich hatte jetzt auf die Schnelle versäumt dass ich mein Code-Beispiel auf Label begrenzt habe.
Mit Widget Symbol musst Du mit Regex in data-states arbeiten.
data-states='"[0-9]","[1-9][0-9]|1[0-6][0-9]{2}","1[1-6][0-9]{2}"'
Danke für die RegEx, ich werde mich also auch dahingehen einlesen.
Jetzt aber zum Label und dem data-part welches ich eingefügt habe, hier der jetzige Code:
<div class="narrow"
data-type="label"
data-device="FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9"
data-get="power"
data-part="1"
data-limits='[10,1000,3600]'
data-colors='["blue","red","yellow"]'>
</div>
wenn das Reading jetzt 609,32 W übermittelt, wird dann durch data-part="1" nur das erste "Wort" des Readings übernommen, also 609,32 ?
Dann müsste doch das data-limits greifen mit dem Wert 1000 und entsprechen die Farbe ROT aus data-colors genommen werden ?
Leider ist dem nicht so, 609,32 wird in Blau dargestellt , aber ohne das "W" , also hat data-part funktioniert.
Könnt ihr mir helfen meinen Denkfehler zu finden?
data-part="([\d,]+).*"
Aber... ich weiss nicht wann data-part greift: vor data-limits, ohne nur zur Formattierung nach data-limits
Ansonsten bleibt immer die Lösung, den Wert in einem userReading zu formattieren (W weg nehmen), und dieses userReading statt power in TabletUI zu benutzen
kurze Zusatzinfo, die Heizung hat jetzt ausgeschaltet und es werden nur noch 0.78W verbraucht.
Jetzt wird das Label (0.78) weiss dargestellt, also keine meiner Farben im data-colors
Vielleicht liegt mein Problem ja im Verständniss und der Syntax des data-limits
EDIT 1: wenn ich bei data-part die "1" durch "([\d,]+).*" ersetze wird "0" angezeigt anstatt 0.78
EDIT 2: wenn ich in data-limits='[0,1000,3600]' einsetze anstatt '[10,1000,3600]' wird der Wert (0 oder 0,78) blau eingefärbt.
Wie ist das zu erklären ? Wie funktioniert data-limits ?
EDIT 3: ein aktueller Verbrauch von 619,27 W wird auch blau dargestellt 🙁 bei data-limits='[0,1000,3600]'
kann es sein dass das Reading ein Textformat hat und kein numerisches und somit der Limit-vergleich nicht greift?
Naja.... wird der Wert im Reading mit Koma oder mit Punkt dezimal getrennt? Einmal schreibst Du Koma, einmal Punkt.... Werden Wert und "W" mit Leerzeichen getrennt oder nicht? Usw.
Natürlich muss man die Regex entsprechend schreiben. Und gegebenfalls greift data-limits nicht (mit Punkt ist es numerisch, mit Koma ist es nicht)
Hättest Du ein "list" vom Device geliefert, hätten wir schon alles gesehen
Wenn Koma, musst Du tatsächlich ein userReading kreieren
EDIT: eigentlich hat meine vorgeschlagene Regex wenig Sinn, da sie davon ausgeht, dass der Wert mit Koma getrennt ist. Aber wenn es tatsächlich Koma ist, kann es nicht gehen
EDIT2: statt ein userReading kann man es vielleicht mit data-substitution lösen
Wenn 619,27 W (also... Koma und Leerzeichen)
data-substitution="s/([\d]+),([\d]*).W/$1\.$2/g"
@jumperger
data-limits unterstützt die "ab"-Theorie; es wird also der größte Eintrag gesucht, bei dem der darzustellende Wert größer oder gleich ist als der Vergleichswert.
- Sollte ein solcher Eintrag existieren, wird die dazu passende Einfärbung vorgenommen.
- Existiert kein solcher Eintrag, dann bleibt es bei der Standard-Einfärbung.
Um mit einem Reading (fast) alle Fälle durchspielen zu können, habe ich bei mir testweise folgende 4 Widget-Definitionen verwendet. In Deinem Fall würde ich das Reading energy nutzen. Bei Verwendung aller 4 Definitionen könnte eine Ausgabe ähnlich aussehen wie im angehängten Screenshot.
Es wird nur die erste Stelle verwendet:
<div data-type="label" data-device="FBDECT_FritzBox_AHA_24_65_11_CA_FD_E9"
data-get="energy"
data-part="(.).*"
data-limits='[0,10,100,1000,10000]'
data-colors='["gray","green","yellow","red","orange"]'
class="bigger">
</div>
Es werden nur die ersten beiden Stellen verwendet:
<div data-type="label" data-device="FBDECT_FritzBox_AHA_24_65_11_CA_FD_E9"
data-get="energy"
data-part="(..).*"
data-limits='[0,10,100,1000,10000]'
data-colors='["gray","green","yellow","red","orange"]'
class="bigger">
</div>
Es werden nur die ersten drei Stellen verwendet:
<div data-type="label" data-device="FBDECT_FritzBox_AHA_24_65_11_CA_FD_E9"
data-get="energy"
data-part="(...).*"
data-limits='[0,10,100,1000,10000]'
data-colors='["gray","green","yellow","red","orange"]'
class="bigger">
</div>
Es werden nur die ersten vier Stellen verwendet:
<div data-type="label" data-device="FBDECT_FritzBox_AHA_24_65_11_CA_FD_E9"
data-get="energy"
data-part="(....).*"
data-limits='[0,10,100,1000,10000]'
data-colors='["gray","green","yellow","red","orange"]'
class="bigger">
</div>
Für Deinen power-Fall sollte bei passend definierten limit-Werten eigentlich
data-part="1" reichen; alternativ könnte man auch
data-part="(.*) W" oder eine der vielfältigen RegExp-Varianten verwenden.
@amenomade
wie oben in der RawDef gezeigt wird der power-Wert mit "." und Leerzeichen vor dem "W" ausgegeben.
setstate FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9 2019-11-19 09:43:22 power 591.58 W
mit den RegEx hab ich noch einen ziemlichen Berg vor mir. :o
@OdfFhem
"ab"-Theorie, das habe ich noch nie gehört und da wäre ich nie drauf gekommen. SUPER Dank für die Info.
Für
Unter 10W --> BLAU
über 10W --> ROT
über 1600W --> GELB
wäre also das data-limit='[0,10,1600]' mit data-colors='["blue","red","yellow"]'
ich werde das heute abed sofort testen danke
Danke OdfFhem.
Mit deiner Erklärung zur "ab"- Theorie klappt es ganz genau.
<div data-type="label" class="top-space"
data-device="FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9"
data-get="power"
data-part="1"
data-limits='[0,10,1600]'
data-colors='["blue","red","yellow"]'
>
</div>
Jetzt bleibt noch das Problem des Widget-Symbol in dem es kein data-part und data-limit gibt
@jumperger
In Anlehnung an Deine label-Definiton wird es vermutlich mit dieser symbol-Definition funktionieren:
<div data-type="symbol" class="top-space"
data-device="FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9"
data-get="power"
data-part="1"
data-states='[0,10,1600]'
data-colors='["blue","red","yellow"]'>
</div>
Ob die class hier richtig ist, keine Ahnung ...
den data-part gibt es aber nicht im widget-Symbol https://wiki.fhem.de/wiki/FTUI_Widget_Symbol
bei data-states, müssten da die Werte nicht auch genau 0 10 1600 sein? was sie natürlich nicht sind.
Ich hatte gedacht, in Anlehnung an den Tip von amenomade, ein userReading zu bauen, welches 3 Codes (entsprechend der 3 Leistungsbereiche) ausspucken würde und anhand derer die Farbe zu setzen.
Im Wiki war folgendes Beispiel:
attr HM_XXXXXX userReadings Statenum
{
if(ReadingsVal("HM_XXXXXX","state","") eq "closed") {return 0}
elsif (ReadingsVal("HM_XXXXXX","state","") eq "tilted") {return 1}
elsif (ReadingsVal("HM_XXXXXX","state","") eq "open") {return 2}
else {return -1}}
bei mir müsste ja dann in der Art sein: z.B. eq "closed" wird ein <10
if(ReadingsVal("FBDECT_XXXXXX","power","") <10) {return BLAU} ...
wobei "power" ja nicht als solches verwendet werden kann da es ein String ( 0.78 W ) ist und kein numerischer Wert.
Also denke ich dass ,"power", durch eine Bereinigungsformel ersetzt werden muss.
Wie das geht gikt es jetzt heraus zu finden.
Zitat von: jumperger am 20 November 2019, 20:36:34
den data-part gibt es aber nicht im widget-Symbol https://wiki.fhem.de/wiki/FTUI_Widget_Symbol
Gibt es mittlerweile doch
Zitatif(ReadingsVal("FBDECT_XXXXXX","power","") <10) {return BLAU} ...
wobei "power" ja nicht als solches verwendet werden kann da es ein String ( 0.78 W ) ist und kein numerischer Wert.
Dann ReadingsNum statt ReadingsVal
Aber es sollte schon funktioniertn, wie OlfFhem es geschrieben hat. Hab es sogar getestet
Ich versuche nun diesen Code:
data-type="symbol" data-device="FBDECT_FritzBox_AHA_XX_XX_XX_XX_XX_E9"
data-get="power"
data-icon="oa-sani_heating"
data-background-icon="fa-circle"
data-part="1"
data-states='[0,10,1600]'
data-background-colors='["blue","red","yellow"]'
Bei aktuel ausgeschalteter Heizung funktionierts, mal sehen ob es auch rot wird wenn sie anspringt. Oder ich laufe lieber in den Schuppen und drehe das Thermostat höher. ;D
Das nenn ich doch mal TATKRÄFTIGE Unterstützung !!!!!!!!!!!
:D :D :D :D :D ES KLAPPT :D :D :D :D :D
Vielen vielen Dank für eure Unterstützung .
Um nicht einfach nur dumm abzuschreiben möchte ich euch fragen ob ihr mir erklären könnt wieso das mit data-states in der Form klappt.
Denn dass es klappt ist ein Beweis dass ich nicht verstanden habe wie data-states richtig funktionieren.