Data van Home Assistant trekken naar ESP8266

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
Mijn vraag
Beste tweakers.

Ik monitor mijn waterverbruik met een ESP8266 en stuur de data via MQTT naar een server met Home Assistant. Echter wanneer ik de ESP reset of van nieuwe software voorzie (want ik ben er nog mee bezig) dan ben ik de data van vandaag kwijt. het gaat dan vooral om het aantal liters dat ik tot dan toe (en die dag) heb gebruikt. De data staat op HA. Is het mogelijk (en simpel) om de data die op HA staat op te vragen in de ESP8266 software?

Relevante software en hardware die ik gebruik
ESP8266, Home assistant op een dedicated server.

Wat ik al gevonden of geprobeerd heb
Wanneer ik subscribe op het topic krijg ik die info alleen als er daadwerkelijk verkeer is. dus niet de laatste waarde. Dat is wat ik wil opvragen. Wat is de laatste waarde die in HA is opgeslagen?

Voor een korte uitleg over mijn watermeter: beach_a in "Is deze watermeter uitleesbaar?"

Uw hulp wordt zeer gewaardeerd..

Gezien DIY insteek een schopje naar MME

[ Voor 2% gewijzigd door Septillion op 27-03-2025 18:31 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • FredvZ
  • Registratie: Februari 2002
  • Laatst online: 21:04
beach_a schreef op woensdag 26 maart 2025 @ 19:01:
Wanneer ik subscribe op het topic krijg ik die info alleen als er daadwerkelijk verkeer is. dus niet de laatste waarde.
Ook niet als je persistent publiceert op je MQTT-server?

Je zou in HA ook automatisering maken die triggert op het online komen van je ESP, zodat HA op dat moment de laatste waarde publiceert op MQTT.

Spel en typfouten voorbehouden


Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
Bedankt @FredvZ
Je zou in HA ook automatisering maken die triggert op het online komen van je ESP, zodat HA op dat moment de laatste waarde publiceert op MQTT.
Ik ben nog niet zo los in HA. Hoe aan te pakken?

Acties:
  • 0 Henk 'm!

  • Septillion
  • Registratie: Januari 2009
  • Laatst online: 18:14

Septillion

Moderator Wonen & Mobiliteit
@beach_a Dus je doet de software 100% zelf? of ESPhome?

Indien eerste, sla het periodiek op in EEPROM/flash.

Indien laatste, zorg dat state opgeslagen wordt (bv restore_state: yes voor globals bijvoorbeeld).

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
@Septillion Ja eigen software. Ik heb gedacht aan periodiek opslaan, en dat doe ik ook elk uur, maar wil de flash niet teveel belasten. Ik zal ook elke 24h de boel opslaan want dan zal ik toch resetten naar 0 (vwb gebruik/dag). Dat uitlezen bij een restart en vandaar verder gaan.

Maar ik dacht zo dat HA de laatste data heeft opgeslagen, dat moet dan toch ook weer bereikbaar zijn? Of is dat een opgave? HA is niet zo goed met low level begrijp ik.

[ Voor 23% gewijzigd door beach_a op 26-03-2025 21:39 ]


Acties:
  • 0 Henk 'm!

  • lolgast
  • Registratie: November 2006
  • Laatst online: 22:21
Als je het MQTT bericht met ‘retain’ verstuurt wordt het toch gewoon opgeslagen op de MQTT server en kun je de laatste waarde ophalen zodra je je weer abonneert op het betreffende topic?

Acties:
  • 0 Henk 'm!

  • Septillion
  • Registratie: Januari 2009
  • Laatst online: 18:14

Septillion

Moderator Wonen & Mobiliteit
@beach_a Nee, het uit HA trekken is niet per se makkelijk.

Maar flash kan aardig wat hebben, alle devices op ESPhome bijvoorbeeld werken door het periodiek in flash te zetten.

Andere optie is, gewoon terug naar 0 gaan. Als de state class op total increasing staat dan zal het Energy dashboard netjes doortellen. En voor jezelf kan je denk ik daar binnen HA een utility meter op kunnen maken die dan gewoon doortelt.

Je zou inderdaad ook de MQTT retain kunnen misbruiken als storage.

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
@lolgast @Septillion
Dank voor de pointers. Ik heb de waarde nu op retain gezet en ik zie ook dat dat werkt. Echter nu probeer ik in de setup vh programma deze retained value op te vragen door te subscriben en een mqtt_client.loop() te draaien. Maar wat ik ook probeer ik krijg helemaal niks terug. Moet ik eerst iets publiceren voordat het subscriben aanslaat? Ik zou bijv de waterflow op 0 kunnen publiceren en dan wachten op het antwoord.

Ga ik straks even proberen.. Eerst de gitaar versterker proberen te repareren...... Veel projecten.

Acties:
  • 0 Henk 'm!

  • Septillion
  • Registratie: Januari 2009
  • Laatst online: 18:14

Septillion

Moderator Wonen & Mobiliteit
@beach_a Als het goed is zou je bij een subscribe op een topic waar een retained bericht in zit die gelijk terug moeten krijgen.

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
mmh ik doe iets fout, ik krijg niks terug. Ik heb al zoveel gewijzigd her en der dat ik geen code kan publiceren. Heeft iemand een voorbeeld code voor ESP8266 waarin in de setup een retained value opgevraagd kan worden op HA?

Acties:
  • 0 Henk 'm!

  • franssie
  • Registratie: Februari 2000
  • Laatst online: 21:27

franssie

Save the albatross

Waarom wil je die client side oppakken? Is het niet logischer om het totaal bij HA te laten en alleen de delta's (verbruik) naar HA te sturen met een totaal dat je alleen gebruikt en opslaat in de ESP en HA voor debugging / controle als het teveel uit elkaar gaat lopen?

franssie.bsky.social | 🎸 Niets is zo permanent als een tijdelijke oplossing | Een goed probleem komt nooit alleen | Gibson guitar Fender Guitar God Damn Guitar


Acties:
  • 0 Henk 'm!

  • M66B
  • Registratie: September 2007
  • Niet online
Ik weet niet zeker wat je zoekt, maar ik denk 'restore'?

code:
1
2
3
4
5
6
7
8
9
10
11
sensor:
  - platform: integration
    id: water_total_relative
    name: "Water total relative"
    state_class: total_increasing
    device_class: water
    unit_of_measurement: "liters"
    accuracy_decimals: 1
    sensor: water_pulse
    time_unit: min
    restore: true


Hier alle yaml:

https://gist.github.com/M...184b610f4360e3126f56fe7e9


Overigens kun je naar mijn idee beter een proximity sensor gebruiken, zie bijvoorbeeld hier:

https://www.pieterbrinkma...t-and-a-proximity-sensor/

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
Overigens kun je naar mijn idee beter een proximity sensor gebruiken, zie bijvoorbeeld hier:
Zal ook goed werken. Mijn overweging was: "Wat heb ik nog in de kast liggen aan onderdelen en kan ik daar wat mee". Daarnaast ben ik elektronicus en dus al snel geneigd zelf iets te ontwerpen.

Het is me uiteindelijk toch gelukt om bij opstart/reset het aantal gebruikte liters van vandaag op te vragen op HA. Eigenlijk had ik al alle ingredienten maar kwam er pas later achter dat je toch even moet wachten op het antwoord van HA.

Dus voor hen die het interesseert:

Publish de getallen die je evt later wilt opvragen op HA met een 'retain' value.

Voorbeeld: (met pubsubclient.h)

code:
1
2
3
sprintf(mqtt_value, "%i", metercounter);
tee.printf("Sending topic %s with value %s\n\r", "Watermeter/used_liters", mqtt_value);
mqtt_client.publish("Watermeter/used_liters", mqtt_value, true); // retained value


Ik gebruik een tee-fork zodat ik zowel naar Telnetstream als Serial stream. Vandaar 'tee.printf()';

In de setup vraag ik deze retained value op:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// setup mqtt
  mqtt_client.setServer(mqtt_broker, mqtt_port);
  mqtt_client.setCallback(mqttCallback);
  broker_connected = connectToMQTTBroker();
  tee.printf("Setup: Brokerconnected = %i\n", broker_connected);
  mqtt_client.subscribe("Watermeter/used_liters");
  tee.printf("subscribed to Watermeter/used_liters\n\n");
  while (messagereceived < 0) {
    mqtt_client.loop();
    tee.println("In da loop");
    delay(1000);
  }
  mqtt_client.unsubscribe("Watermeter/used_liters");
  metercounter = atoi(payloadstring);
  tee.printf("Metercounter: %i L/min\n\n", metercounter);


De 'while' loop is hier blocking, ik ga daar nog een timeout aan toevoegen denk ik.

En voor de volledigheid de callback functie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void mqttCallback(char *topic, byte *payload, unsigned int length) {
    tee.print("Message received on topic: ");
    tee.println(topic);
    tee.print("Message:");
    for (unsigned int i = 0; i < length; i++) {
      tee.printf("i, x, %i, %x\n", i, payload[i]); 
      //        tee.print((char) payload[i]);
      payloadstring[i] = (char) payload[i];
    }
    payload[length] = '\0';
    payloadstring[length] = '\0';
//    strcpy(payloadstring, char * payload);
    tee.printf("\npayload = %s\n", payload);
    tee.printf("\npayloadstring = %s\n", payloadstring);
    tee.println();
    tee.println("-----------------------");
    messagereceived = 1;
}


Er staan nog wat teveel debug statements tussen, ik moest even nadenken hoe ik van een BYTE array naar een char array zou converteren. Ik ben voor de simpele oplossing gegaan.

Acties:
  • 0 Henk 'm!

  • Oon
  • Registratie: Juni 2019
  • Niet online

Oon

Als je die data in HA hebt, kun je dan niet beter de states REST API (/api/states/<entity_id>) gebruiken?
Dan hoef je niet async op het antwoord over MQTT te wachten

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
@Oon Ik ben nog niet erg los in HA, maar dit klinkt wel als een mogelijk andere oplossing.

Wanneer ik in de browser dit probeer:

http://192.168.1.102:8123...atermeter_watermeter_used

krijg ik een 401: Unauthorized

Acties:
  • 0 Henk 'm!

  • Oon
  • Registratie: Juni 2019
  • Niet online

Oon

beach_a schreef op zaterdag 29 maart 2025 @ 17:52:
@Oon Ik ben nog niet erg los in HA, maar dit klinkt wel als een mogelijk andere oplossing.

Wanneer ik in de browser dit probeer:

http://192.168.1.102:8123...atermeter_watermeter_used

krijg ik een 401: Unauthorized
Ja je moet wel een auth header meegeven, de token daarvoor kun je onder je profiel in Home Assistant vinden.
En dan zoiets als dit (van het internet geplukt, dus geen idee of het helemaal werkt, maar het ziet er wel logisch uit):

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void sendToHomeAssistant() {
  WiFiClient client;
  HTTPClient http;
  
  // Your Home Assistant API endpoint
  String url = "http://192.168.1.102:8123/api/states/sensor.watermeter_watermeter_used";
  
  // Start HTTP connection
  http.begin(client, url);
  
  // Add headers
  http.addHeader("Authorization", "Bearer YOUR_LONG_LIVED_TOKEN"); // Replace with your actual token
  
  tee.println("Sending HTTP request to Home Assistant");
  
  // Send GET request
  int httpResponseCode = http.GET();
  
  // Check response
  if (httpResponseCode > 0) {
    tee.printf("HTTP Response code: %d\n", httpResponseCode);
  } else {
    tee.printf("Error on HTTP request. Error code: %d\n", httpResponseCode);
  }
  
  // Close connection
  http.end();
}

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
@Oon Thanks ik ga me erin verdiepen. Moet dan de publish wel op 'retain' blijven staan? Of pakt ie dan de laatst bekende waarde(s)?

Acties:
  • 0 Henk 'm!

  • Oon
  • Registratie: Juni 2019
  • Niet online

Oon

beach_a schreef op zaterdag 29 maart 2025 @ 18:10:
@Oon Thanks ik ga me erin verdiepen. Moet dan de publish wel op 'retain' blijven staan? Of pakt ie dan de laatst bekende waarde(s)?
Deze REST API van Home Assistant vraagt gewoon de meest recente state van de sensor in HA op, daarmee omzeil je dus MQTT voor het ophalen van de state.
Zolang de state in HA staat gaat dat dus goed

Acties:
  • 0 Henk 'm!

  • Septillion
  • Registratie: Januari 2009
  • Laatst online: 18:14

Septillion

Moderator Wonen & Mobiliteit
Zelf zou ik niet voor de methode via de APi gaan. Want dan heb je in HA geen mogelijkheid meer om het device netjes als unavailable te melden (via last will) indien deze offline gaat. Immers als je dat doet dan is de state die je dan opvraagt 'unavailable'.

Dus naar mijn idee op volgorde van mooiste oplossing:
- Gewoon naar flash schrijven
- Don't bother en gewoon weer bij 0 beginnen en het sommen door HA laten doen
- MQTT retain misbruiken
- Niet 'unavailable' zetten en state via een tweede communicatiemethode ophalen uit HA.

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
- Gewoon naar flash schrijven
Dat is wellicht idd het mooiste. Ik kan het elders opzoeken maar hoe vaak kun je flash in een ESP8266 schrijven voordat je in de problemen komt?

Mijn waterverbruik is vooral de douche en doortrekken WC. Ik kan het zo programmeren dat tijdens een bepaalde flow de boel optelt en na de flow (flow=0 L/min) de data wordt opgeslagen. Dan heb je misschien 20x-30x per/dag een write naar flash. Bovendien -zo heb ik begrepen- doet LittleFS ook zelf aan optimalisatie. Als het in de orde van 50.000x is voordat flash gaat mopperen dan ben ik mijn leven wel gedekt :-)

Acties:
  • 0 Henk 'm!

  • beach_a
  • Registratie: Januari 2015
  • Laatst online: 22:52
Overigens is het me gelukt de restApi aan de praat te krijgen. Werkt ook goed.Moest even de goede 'include' erin zetten en in HA/profile een 'long lived acces token' aanmaken. Daarna liep het.

En er stond er al een long lived access token in, maar de 'vloek' die ik dan nodig heb in het program kon ik zo snel niet opvragen in HA. Dat is een enorme string met Heeeel veel karakters.

Acties:
  • 0 Henk 'm!

  • Septillion
  • Registratie: Januari 2009
  • Laatst online: 18:14

Septillion

Moderator Wonen & Mobiliteit
Je zou het in de datasheet moeten kunnen vinden. Volgens mij wordt bijvoorbeeld vaak de W25Q32 gebruikt, die specificeren 100k als minimum. En dat zal echt het gegarandeerde bare minimum zijn. Modern flash kan best wel wat hebben :)

Persoonlijk zou ik het lekker bij MQTT houden, rest api is toch een van de minst mooie manieren om iets in HA te krijgen.
Pagina: 1