Homeassistant wether.home daten verwenden

Nival

-
Moderator
Hast Du es schon mit .state dahinter, also it.printf(150 ,0, id(digit_font), "%s.1f °C", id(forecast_temperature).state); versucht?
 

Mallown

Member
vielen dank für deine Hilfe, aber für den Moment war es das, der ESp hat sich weggehängt, ich kann nix mehr übertragen, werd die Tage mal sehen was das ist. Ich wünsche Dir noch nen schönes Wochenende...
 

Nival

-
Moderator
der ESp hat sich weggehängt
Oh - das ist aber nicht schön, hoffe, der kriegt sich wieder ein. Das mit dem .state konntest Du dann vermutlich nicht mehr testen?

Ich wünsche Dir noch nen schönes Wochenende...
Danke, Dir auch! Und hey, immerhin hast Du einen Sensor mit der richtigen Ausgabe angelegt, von da aus sollte es eigentlich nurnoch ein kleiner Schritt sein... wird es dann hoffentlich auch (und azrael783 kann nen bisschen die Hände über dem Kopf zusammenschlagen ohne dass es schon gelöst ist).
 

Mallown

Member
ich konnte das noch testen, brachte aber keine Änderung, vielleicht hat er ja noch nen neuen Ansatz. denke auch ist nicht mehr viel.....🤞
 

Nival

-
Moderator
Ansonsten halt noch ein wenig die ESP-Dokus wälzen, ein paar Optionen fallen einem da bestimmt noch ein... wäre nicht das erste Problem, dass wir hier mit try & error gelöst haben (und eh der einzige Grund, weshalb ich angefangen habe mich mit HA zu beschäftigen) :D
 

azrael783

Active member
Uff, den vielen Text habe ich jetzt mal grob überflogen. Ich vermute, dass er sich an dem Leerzeichen hinter dem "f" stört "%s.1f °C" stört. Ich gebe es ohne das "C" wie folgt an: "%s.1f°" und das funktioniert.
Das "if" Konstrukt mit .has_state() soll vermeiden, dass wenn der Wert mal nicht vorhanden ist - weil HA zb grade neu startet - etwas falsch dargestellt wird, aber ich glaube das hattet ihr ja bereits geklärt.
 

Mallown

Member
Sorry, ich konnte das erst heute ausprobieren, und ich bekomme weiterhin diese Fehlermeldung
Code:
/config/esphome/clean-101.yaml: In lambda
function: /config/esphome/clean-101.yaml:72:68: warning: format '%f' expects argument of type 'double', but argument 6 has type 'esphome::homeassistant::HomeassistantSensor*' [-Wformat=]     
it.printf(150 ,0, id(digit_font), "%.1f°C", id(forecast_temperature));                                                           
                                                                                       ^
 
Zuletzt bearbeitet von einem Moderator:

Mallown

Member
Das bekomme ich dann nach dem Upload
Code:
[14:21:09][D][homeassistant.sensor:024]: 'sensor.forecast': Got state 11.40 [14:21:09][D][sensor:125]: 'Vorhersage von Home Assistant': Sending state 11.40000  with 1 decimals of accuracy

Das ist genau die Temperatur, die mir auch im Dashboard angezeigt wird....
 
Zuletzt bearbeitet von einem Moderator:

Mallown

Member
Habe jetzt auch noch mal mit Argument als string versucht, selbes Ergebnis:
Code:
/config/esphome/clean-101.yaml: In lambda function:
/config/esphome/clean-101.yaml:72:67: warning: format '%s' expects argument of type 'char*', but argument 6 has type 'esphome::homeassistant::HomeassistantSensor*' [-Wformat=]     
it.printf(150 ,0, id(digit_font), "%.1s°", id(forecast_temperature));
 
Zuletzt bearbeitet von einem Moderator:

Mallown

Member
Ich nehme alles zurück!!
Ich weiß nicht sicher warum es jetzt geht, aber Azrael783, dein Code läuft jetzt.... es geschehen noch Wunder, und komplett mit dem C und dem Leerzeichen dazwischen. wenn ich jetzt z.B. die Vorhersage der Höchst-Temperatur von morgen möchte, dann mache ich das genauso wie mit dem templow, richtig, nur eben mit der entsprechenden Variable..... DANKE, Ihr habt mir sehr geholfen. Leider verstehe ich noch nicht wirklich was Ihr mir da gegeben habt haha
 

Nival

-
Moderator
Sehr schön!

Leider verstehe ich noch nicht wirklich was Ihr mir da gegeben habt
An welcher Stelle hängt es denn?

Und wenn Du magst, für den nächsten User der das gleiche Problem hat gerne nochmal den kompletten aktuellen Code posten, bevorzugt auch als Code (Sprache YAML) formatiert :)
1653569912322.png
 

Mallown

Member
Ne, also, ich versteh eben nicht, was ich da, warum mache. Sonst läuft das und ich hab es auch hinbekommen beide Temperaturen, von morgen mir anzeigen zu lassen.
ok, das mit dem code mache ich dann noch....
 

Mallown

Member
ok,
das ist MEIN ;) configuration. yaml in HOMEASSISTANT, um den Weatherforecast in ESPHOME anzuzeigen Low and Hight_temperatur für den nächsten Tag:

YAML:
  - platform: template
      sensors:
        forecastlow:
          value_template: >
               {{ state_attr('weather.home', 'forecast')[0]['templow'] }}
          friendly_name: VorhersageLow
        
        forecasthigh:
          value_template: >
               {{ state_attr('weather.home', 'forecast')[0]['temperature'] }}
          friendly_name: VorhersageHigh


Und nun der ESPHOME-Code um das ganz auf einer Punktmatrix mit MAX7219 Treiber-IC darzustellen.

YAML:
  - platform: homeassistant
    id: forecastlow
    name: "Vorhersage min von Home Assistant"
    entity_id: sensor.forecastlow
 
  - platform: homeassistant 
    id: forecasthigh
    name: "Vorhersage max von Home Assistant"
    entity_id: sensor.forecasthigh


# Example configuration entry
spi:
  clk_pin: GPIO14
  mosi_pin: GPIO12

display:
  - platform: max7219digit
     cs_pin: GPIO15
    num_chips: 8
    scroll_delay: 20s
    intensity: 0
    lambda: |-
      it.scroll( true, max7219digit::STOP, 350, 5000, 5000);
      it.strftime(10, 0, id(digit_font), "%H:%M", id(hass_time).now());
      it.printf(38, 0, id(digit_font), "Uhr    ");
      if (id(forecastlow).has_state()) {
      it.printf(71, 0, id(digit_font), "Vorh min: %.1f°C ", id(forecastlow).state);
          }
      if (id(forecasthigh).has_state()) {
      it.printf(155, 0, id(digit_font), " max: %.1f°C ", id(forecasthigh).state);
          }   
      it.strftime(222, 0, id(digit_font), " _%d-%h-%y_ ", id(hass_time).now() );
      
font:     
  - file: "pixelmix.ttf"
    id: digit_font
    size: 8
 

Nival

-
Moderator
Sehr schön! Dann versuch ich das mal so auseinanderzunehmen dass es hoffentlich verständlich ist - mit der Vorwarnung, dass ich in Sachen HA selber Laie bin, ich hab mich da nur als Programmierer ein bisschen reingedacht ;)

Möglicherweise wäre das auch alles ohne den Code in HA möglich gewesen, aber da wir beide nicht wissen wie man verschachtelte Attribute unter - platform: homeassistant anspricht eben mit diesem kleinen Umweg.

Das - platform: template verwenden wir, da wir hier innerhalb von value_template: > quasi beliebige Ausgaben aus allem erzeugen können, das innerhalb von HA erreichbar ist (auch mehrzeilige Ausgaben, dafür muss daran nur ein Bindestrich angehängt werden: value_template: >-).

Da wir hier den Wert von einem Attribut brauchen wird mit state_attr() gearbeitet, hier eben für die Entität weather.home mit dem Attribut forecast. Da dieses Attribut verschachtelt ist müssen wir die einzelnen Unterpunkte mit Zahlen ansprechen, also 0 für morgen, 1 für übermorgen... und dadrin dann den genaueren Wert wie templow oder temperature wählen (kleine Randbemerkung, bei dem friendly_name: dürftest Du auch Leerzeichen verwenden).

Soweit, an dieser Stelle hast Du zwei neue Sensoren in HA, die Du ganz beliebig weiterverwenden kannst, egal wo.

In ESP nehmen wir diese beiden Sensoren dann eben wieder auf, das ist quasi eine Objektdeklaration - also dort werden zwei Objekte mit den Namen forecastlow und forecasthigh mit beliebigem Inhalt befüllt, in diesem Fall die Inhalte der beiden angelegten Sensoren, an die kommen wir dank - platform: homeassistant heran, damit ist klar, wohin man sich wenden muss, um die Sensorenwerte zu bekommen.

Den Teil des Codes den Du selber gebastelt hast verstehst Du selber am besten (ich vermute, dort wird auch positioniert?), aber mittels dem id() kannst Du eben an die vorher definierten Objekte heran, mittels .state an den Wert davon.

Letzteres dürfte nötig sein, weil dieses Objekt nicht nur den zugewiesenen Wert beinhaltet, sondern noch zusätzliche Eigenschaften / Funktionalitäten - welche genau kann ich Dir nicht sagen, aber beispielsweise das has_state() besagt, dass es eine mit eingebaute Funktion hat, die aufgerufen werden kann um zu informieren, ob sie aktuell einen Zustand / Wert besitzt.

Das ist wie wenn Du zwar den Fahrer für das Auto aussuchst (die Werte aus HA), aber Reifen, Motor, Türen, die Eigenschaft fahren zu können und alles andere hat das Auto schon von sich aus. Wenn Du dann also den Fahrer "ausgeben" möchtest macht es wenig Sinn, das gesamte Auto inklusive Fahrer in die Ausgabe zu werfen, ich meine, das war zwischenzeitlich das Problem.

Ich hoffe, das ist verständlich genug / beantwortet alle Fragen, falls nicht, gerne noch nachhaken. Mir wird (aus mir völlig unverständlichen Gründen!) öfter mal nachgesagt, ich würde zu technisch erklären... :unsure:

Achja, noch eine Randbemerkung, vielleicht hilft Dir das auch beim Verständnis: Wenn etwas mit () dahinter aufgerufen wird ist es eine Funktionalität - also state_attr() oder id() - das würde den Funktionalitäten wie "fahren" oder "bremsen" entsprechen, wie genau das funktioniert und was dabei passiert musst Du garnicht wissen, Hauptsache, es tut wie es soll / gibt die gewünschten Dinge oder Informationen aus - während Dinge ohne Klammern Eigenschaften entsprechen, also z.B. [0]['templow'] oder .state, das kann man direkt "angucken" - wie die Farbe eines Autos oder die Anzahl der Türen.
 

Zurzeit aktive Besucher

Neueste Beiträge

Letzte Anleitungen

Statistik des Forums

Themen
647
Beiträge
9.532
Mitglieder
239
Neuestes Mitglied
Timyboy
Oben