Moin!
Ich habe einen Ultraschallsensor in meinen Pelletofen gebaut. Dieser misst den Stand der Pellets in cm. Funktioniert soweit ganz gut.
Nun würde ich anstelle des Farbwechsels bei bestimmten Werten gern anstatt der cm Angabe die Wörter "voll, halbvoll, nachfüllen" bei bestimmten Bereichen in der FTUI angeben.
Das war bisher mein Code:
<td><div data-type="label" data-device="Pelletmenge" data-get="SR04_Distance" data-pre-text="Pelletmenge (" data-post-text=" cm)" class="tall inline left"></div></td><td><div data-type="label" data-device="Pelletmenge" data-get="SR04_Distance" data-fix="1" data-limits='[20,21,75]' data-colors='["green","yellow","#FF0000"]'class="tall right"></div></td>
Funktioniert soweit einwandfrei.
Nun hätte ich wie gesagt ganz gern:
0-20cm das Wort "voll" in grün
21-75cm das Wort "halbvoll" in gelb
ab 75cm das Wort "nachfüllen" in rot
So, bisher bin ich so weit gekommen:
<td><div data-type="label" data-device="Pelletmenge" data-get="SR04_Distance" data-pre-text="Pelletmenge (" data-post-text=" cm)" class="tall inline left"></div></td><td><div data-type="label" data-device="Pelletmenge" data-get="Pellethoehe" data-substitution='["^([0-19]*[\\.,][\\d]*)$","voll","^([22-50]*[\\.,]?[\\d]*$)","halbvoll","^([51-99]*[\\.,]?[\\d]*$)","leer"]' data-limits-part="(\d*).*" data-limits='[0,5]' data-colors='["green","yellow","#FF0000"]'class="tall right"></div></td>
Problem:
Es wir so immer nur "halbvoll" angezeigt, unabhängig vom Reading.
Das Reading ist immer eine ganze Zahl von 1 - 99
Wo ist mein Denkfehler?
Hast du die RegEx mal getestet (https://regex101.com/)?
data-substitution='["^([0-19]*[\\.,][\\d]*)$","voll","^([22-50]*[\\.,]?[\\d]*$)","halbvoll","^([51-99]*[\\.,]?[\\d]*$)","leer"]'
Zitat von: Burt_Gummer am 23 November 2023, 02:14:27Nun hätte ich wie gesagt ganz gern:
0-20cm das Wort "voll" in grün
21-75cm das Wort "halbvoll" in gelb
ab 75cm das Wort "nachfüllen" in rot
Das Reading ist immer eine ganze Zahl von 1 - 99
Versuch mal, evtl klappt dies besser (ungetestet):
data-substitution='["^([0-9]|[1][0-9]|20)$","voll","^([2][1-9]|[3-6][0-9]|[7][0-4])$","halbvoll","^([7][5-9]|[8-9][0-9])$","nachfüllen"]'
Zitat von: yersinia am 23 November 2023, 08:17:02Hast du die RegEx mal getestet (https://regex101.com/)?
data-substitution='["^([0-19]*[\\.,][\\d]*)$","voll","^([22-50]*[\\.,]?[\\d]*$)","halbvoll","^([51-99]*[\\.,]?[\\d]*$)","leer"]'
Zitat von: Burt_Gummer am 23 November 2023, 02:14:27Nun hätte ich wie gesagt ganz gern:
0-20cm das Wort "voll" in grün
21-75cm das Wort "halbvoll" in gelb
ab 75cm das Wort "nachfüllen" in rot
Das Reading ist immer eine ganze Zahl von 1 - 99
Versuch mal, evtl klappt dies besser (ungetestet):
data-substitution='["^([0-9]|[1][0-9]|20)$","voll","^([2][1-9]|[3-6][0-9]|[7][0-4])$","halbvoll","^([7][5-9]|[8-9][0-9])$","nachfüllen"]'
Das scheint zu funktionieren, würde gern aber noch die Grenzwerte anpassen.
Kannst du mir das Zahlengebrösel evtl. mal erklären?
Wie ergibt sich daraus das?
0-20cm
21-75cm
ab 75cm
Will ich jetzt zum Beispiel die Werte folgendermaßen ändern:
0-30cm
31-60cm
ab 61cm
Das Zahlenwirrwarr in den Klammern ergibt für mich 0 Sinn, sorry.
Die erste 20 ja und dann?
Möchte das gern auch verstehen und nicht nur abkopieren
Farbwechsel von Grün auf Gelb auf Rot wäre dann noch ein Träumchen :)
EDIT:
Glaube ich bin da halbwegs durchgestiegen?
([0-9]|[1][0-9]|[2][1-9]|30) 0-30
([3][1-9]|[4][0-4]) 21-44
([4][5-9]|[5-9][0-9]) 45-99
Nun noch der Farbwechsel
So, habs selber hinbekommen.
Hier der Code, falls es denn jemanden interessieren sollte:
<td><div data-type="label" data-device="Pelletmenge" data-get="SR04_Distance" data-fix=0 data-pre-text="Pelletmenge (" data-post-text=" cm)" class="tall inline left"></div></td><td><div data-type="label" data-device="Pelletmenge" data-get="Pellethoehe" data-substitution='["^([0-9]|[1][0-9]|[2][0-9]|30)$","voll","^([3][1-9]|[4][0-7])$","halbvoll","^([4][8-9]|[5-9][0-9])$","nachfüllen"]' data-limits='[1,31,48]' data-colors='["green","yellow","#FF0000"]' class="tall right"></div></td>
Spannend wäre nun noch, die Zentimeter vom data-get Device in % umzurechnen.
Dazu bräuchte ich allerdings auch einen Anschubser
Der Sensor geht erst ab 25cm (10cm sind eh Luft vom Sensor bis zu den Pellets), ergo wären 0-25cm 100%
50cm wäre dann kurz vor leer, würde sagen 5%.
Zitat von: Burt_Gummer am 23 November 2023, 19:28:43Das Zahlenwirrwarr in den Klammern ergibt für mich 0 Sinn, sorry.
Die erste 20 ja und dann?
Möchte das gern auch verstehen und nicht nur abkopieren
=> http://www.regex101.com (http://www.regex101.com/)
Zitat von: Burt_Gummer am 23 November 2023, 21:29:35Spannend wäre nun noch, die Zentimeter vom data-get Device in % umzurechnen.
Dazu bräuchte ich allerdings auch einen Anschubser
Der Sensor geht erst ab 25cm (10cm sind eh Luft vom Sensor bis zu den Pellets), ergo wären 0-25cm 100%
50cm wäre dann kurz vor leer, würde sagen 5%.
Das würde ich eher in einem FHEM userReading (https://wiki.fhem.de/wiki/UserReadings) im Device selbst definieren bzw berechnen und dann in FTUI nur noch anzeigen.
Zitat von: yersinia am 24 November 2023, 08:06:43Das würde ich eher in einem FHEM userReading (https://wiki.fhem.de/wiki/UserReadings) im Device selbst definieren bzw berechnen und dann in FTUI nur noch anzeigen.
Die Idee mit dem Userreading hatte ich auch schon, nur hakt es bei mir mit der Berechnung aus. Keine Idee wie ich das machen kann.
Anbei ein Denkanstoß (ungetestet):
fuellstandRel:SR04_Distance.* {
my $min = 25;
my $max = 50;
my $v = 0;
if(ReadingsNum($name,"SR04_Distance",0) < $min) {
$v = 100;
} elsif (ReadingsNum($name,"SR04_Distance",0) > $max) {
$v = 0;
} else {
$v = (1 - (ReadingsNum($name,"SR04_Distance",0) / $max)) * 100;
}
return sprintf("%.1f", $v);
},
Zitat von: yersinia am 24 November 2023, 13:59:27Anbei ein Denkanstoß (ungetestet):
fuellstandRel:SR04_Distance.* {
my $min = 25;
my $max = 50;
my $v = 0;
if(ReadingsNum($name,"SR04_Distance",0) < $min) {
$v = 100;
} elsif (ReadingsNum($name,"SR04_Distance",0) > $max) {
$v = 0;
} else {
$v = (1 - (ReadingsNum($name,"SR04_Distance",0) / $max)) * 100;
}
return sprintf("%.1f", $v);
},
Da scheint aber noch was in der Berechnung falsch zu sein?
setstate Pelletmenge 2023-11-24 23:09:30 Pelletprozent 42.8
setstate Pelletmenge 2023-11-24 23:12:30 SR04_Distance 28.6
Pellets sind eigentlich noch voll mit 28.6cm.
Das können ja keine 42,8% sein
Das soll ja quasi rückwärts anzeigen.
25cm = 100%
50cm = 5% (0% würden auch gehen)
...niemand mit Mathe Studium hier?
Mit meinen begrenzten 3 Satz Kenntnissen komme ich leider nicht weiter.
Nur für die Atomphysiker hier:
Habs selbst rausgefunden.
Echt enttäuschend, wenn ich mir überlege, wie oft ich hier schon angegangen wurde, wegen meiner "dummen" Fragen.
Pelletprozent:SR04_Distance.* {my $min = 25;my $max = 50; my $v = 0; if(ReadingsNum($name,"SR04_Distance",0) < $min) {$v = 100;} elsif (ReadingsNum($name,"SR04_Distance",0) > $max) {$v = 0;} else {$v = (100- (1- (1 - ((ReadingsNum($name,"SR04_Distance",0) - $min ) / ($max - $min)))) * 100) } return sprintf("%.1f", $v);}
Zitat von: Burt_Gummer am 25 November 2023, 14:08:44...niemand mit Mathe Studium hier?
Mit meinen begrenzten 3 Satz Kenntnissen komme ich leider nicht weiter.
Zitat von: Burt_Gummer am 26 November 2023, 17:00:14Nur für die Atomphysiker hier:
Habs selbst rausgefunden.
Echt enttäuschend, wenn ich mir überlege, wie oft ich hier schon angegangen wurde, wegen meiner "dummen" Fragen.
Interessante Wortwahl und Tonlage für Jemanden, welcher unentgeltlich Hilfe für nicht-kommerzielle Software von nicht-kommerziellen Nutzern in deren Privatzeit erbittet und sich scheinbar nicht im Stande sieht, intellektuelle Eigenleistung aufzubringen.
Allerdings ist es schön, dass du einen individuellen Lösungsansatz gefunden hast und diesen mit anderen Nutzern teilst.