Forum: Haus & Smart Home ESPHOME - FLOAT to INT


von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Moin Leute, wie kann ich anstellen, das ich das Ergebnis von
"sensor:
  - platform: pulse_counter"
das als Ergebnis einen Wertebereich von 0 - 6000 hat (als FLOAT)
in einen Wertebereich von 0 - 100 (als INT) bekomme?
Plattform ist wie geschrieben ESPHOME

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Thomas G. schrieb:
> einen Wertebereich von 0 - 6000 hat (als FLOAT)

Wieso soll das float sein?
Dann müsste es 0.0 - 6000.0 heißen.
Das sind natürliche Zahlen und damit Int, genauer unsigned Int.

von Christian M. (christian_m280)


Lesenswert?

Rainer W. schrieb:
> Wieso soll das float sein?

Weil die Variable so deklariert wurde vielleicht!

Rainer W. schrieb:
> Dann müsste es 0.0 - 6000.0 heißen.

Nein!

Thomas G. schrieb:
> wie kann ich anstellen

Was hast Du denn schon probiert?

Gruss Chregu

von Brax (brax09)


Lesenswert?

Mit einem filter zB:
1
filters:
2
  - multiply: 0.016666
https://esphome.io/components/sensor/index.html#multiply

Oder mit einer lambda kannst Du Dir das Ergebnis umformen wie Du willst.
https://esphome.io/components/sensor/index.html#lambda

Ist dann noch float - könntest Du in der Darstellung machen oder - siehe 
lambda. Kommt drauf an, wie es weitergehen soll...

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Christian M. schrieb:
> Rainer W. schrieb:
>> Wieso soll das float sein?
>
> Weil die Variable so deklariert wurde vielleicht!

Dann kann man das auch bei den Konstanten deulich hinschreiben. Das hat 
etwas mit Stil zu tun.

> Rainer W. schrieb:
>> Dann müsste es 0.0 - 6000.0 heißen.
>
> Nein!
lambda¶
...
filters:
  - lambda: return x * (9.0/5.0) + 32.0;
Make sure to add .0 to all values in the lambda, otherwise divisions of 
integers will result in integers (not floating point values).

: Bearbeitet durch User
von Benedikt L. (Firma: Dem Ben seine Leiche) (dembenseineleiche) Flattr this


Lesenswert?

| float
| int

muss doch klappen!

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Das brachte dann die Lösung:
globals:
   - id: rpm
     type: int
     restore_value: no
     initial_value: '1'

sensor:
  - platform: pulse_counter
    pin:
      number: D8
    unit_of_measurement: 'RPM'
    accuracy_decimals: 0
    id: _speed
    name: FanSpeed
    update_interval: 1s
    filters:
      - lambda: return (x / 2);


fan:
  - platform: speed
    id: fanid  # .state .speed
    name: fan
    output: fan_speed

lambda: |-
      id(rpm) = id(_speed).state;
      ...
      it.printf(55,22, id(font1), "%u rpm", id(rpm)); // rpm

von Brax (brax09)


Lesenswert?

Thomas G. schrieb:
1
> lambda: |-
2
>       id(rpm) = id(_speed).state;
3
>       ...
4
>       it.printf(55,22, id(font1), "%u rpm", id(rpm)); // rpm

Kannst Dir vermutlich (ungetestet) die globals-Definition sparen und 
statt dessen direkt ein int anlegen:
1
       int rpm = id(_speed);
2
       ...
3
       it.printf(55,22, id(font1), "%u rpm", rpm);

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Kann ich mir vermutlich insgesamt sparen, da die Graph-Funktion 
anscheinend keine Variablen akzeptiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.