Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StromGedacht von TransnetBW #809

Open
Andr3asB opened this issue Jan 16, 2023 · 22 comments
Open

StromGedacht von TransnetBW #809

Andr3asB opened this issue Jan 16, 2023 · 22 comments
Assignees
Labels
InProgress Repo missing Adapter seesm to be ready but dev did nogt yet release it to repositories

Comments

@Andr3asB
Copy link

Andr3asB commented Jan 16, 2023

StromGedacht (App auf iOS und Android) zur Verfügung gestellt von TransnetBW. Die Informationen, die bisher in der App verfügbar sind, sollten in IoBroker zur Verfügung stehen, um auf Visualisierungen optisch zu warnen und automatisiert im SmartHome entsprechend Geräte (Wärmepumpen, Ladegeräte, Wallboxen, ...) zu pausieren.
Zur API und ob eine API existiert ist derzeit nicht bekannt.

Infos: https://www.stromgedacht.de

Implementierungen in andere SmartHome-Systeme sind nicht bekannt.

@Hypfer
Copy link

Hypfer commented Jan 16, 2023

Ich habe mir das mal angeschaut. Leider ist das Flutter RE tooling nicht dort wo man es haben wollen würde, weshalb all diese Informationen exklusiv durch angestrengtes auf den output von strings libapp.so starren sowie stumpfes raten entstanden sind.

Folgende Endpunkte konnten identifiziert werden:

https://stromgedacht-prod.azurewebsites.net/api/regions/3/states?from=2023-01-13T00:00:00.000Z&to=2023-01-17T00:00:00.000Z
Der eigentlich relevante Endpunkt. Er antwortet mit einer JSON Payload:

Spoiler (klick mich)
[
  {
    "dateTime": "2023-01-14T00:00:00Z",
    "worstState": 1,
    "gridSituationId": null,
    "states": [
      {
        "dateTime": "2023-01-14T00:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T01:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T02:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T03:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T04:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T05:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T06:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T07:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T08:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T09:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T10:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T11:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T12:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T13:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T14:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T15:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T16:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T17:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T18:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T19:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T20:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T21:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T22:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-14T23:00:00Z",
        "state": 1
      }
    ]
  },
  {
    "dateTime": "2023-01-15T00:00:00Z",
    "worstState": 3,
    "gridSituationId": null,
    "states": [
      {
        "dateTime": "2023-01-15T00:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T01:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T02:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T03:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T04:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T05:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T06:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T07:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T08:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T09:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T10:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T11:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T12:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T13:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T14:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T15:00:00Z",
        "state": 2
      },
      {
        "dateTime": "2023-01-15T16:00:00Z",
        "state": 3
      },
      {
        "dateTime": "2023-01-15T17:00:00Z",
        "state": 3
      },
      {
        "dateTime": "2023-01-15T18:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T19:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T20:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T21:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T22:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-15T23:00:00Z",
        "state": 1
      }
    ]
  },
  {
    "dateTime": "2023-01-16T00:00:00Z",
    "worstState": 1,
    "gridSituationId": null,
    "states": [
      {
        "dateTime": "2023-01-16T00:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T01:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T02:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T03:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T04:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T05:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T06:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T07:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T08:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T09:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T10:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T11:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T12:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T13:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T14:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T15:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T16:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T17:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T18:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T19:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T20:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T21:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T22:00:00Z",
        "state": 1
      },
      {
        "dateTime": "2023-01-16T23:00:00Z",
        "state": 1
      }
    ]
  }
]

Daneben gibt es auch noch

https://stromgedacht-prod.azurewebsites.net/api/globalPush
für alles unter dem App Menüpunkt Meldungs-Verlauf
https://stromgedacht-prod.azurewebsites.net/api/stories?languageCode=de
für die Kacheln unten und
https://stromgedacht-prod.azurewebsites.net/api/regions/3
mit generellen Informationen über die ausgewählte Region. Die API ist wohl multi-tenant fähig

Authentifizierung wird nicht benötigt. Keine magischen Header, keine Session o.ä.

Damit das auch so bleibt und sich der Anbieter nicht dazu gezwungen sieht das ganze zu deaktivieren, wäre es sehr wichtig, sorgsam mit der API umzugehen. Hier gilt es, sinnvolle und insbesondere nicht überzogen große Werte für polling-rate und Zeitfenster zu wählen.

Da das ganze sowieso nur forecasting zu sein scheint, dürfte wahrscheinlich ein request alle 24h schon ausreichen.

@Andr3asB
Copy link
Author

Folgendes habe ich noch gefunden: Die API der TransnetBW wird also kommen, wann scheint aktuell noch offen zu sein.
image

@Andr3asB
Copy link
Author

Ich habe keine Ahnung wie man einen IoBroker Adapter schreibt, weiß aber, dass es da auch diverse Anleitungen gibt (ich glaube ich habe da auch ein mal ein YT-Video gesehen.

Für einen Prototypen habe ich mit die Daten jetzt mal mit NodeRed gezogen (da bin ich +/- fit drin), angereichert und nach IoBroker geschrieben. Der Flow sieht recht einfach aus:
image

In IoBroker landen die Werte unter 0_userdata.0.[...] in dieser Form:
image
Die gelben Einträge werden von NodeRed ergänzt um die "states" für den Nutzer verständlich zu machen
"stateJetzt" zeigt unter "Heute" den Status zur aktuellen Stunde an, "recommendationJetzt" den entsprechenden lesbaren Wert.

Mit dem Wert von "Heute.StateJetzt" kann man seine Verbraucher triggern oder die Optik der Visualisierung anpassen:

  • SG-Ready Geräte schalten
  • Wallboxen schalten
  • Waschmaschinen/Trockner pausieren
  • Visu.Theme.Background: state=1 ~> default || state=2 ~> green || state=3 ~> red
  • usw.

Für die Entwicklung ist es hilfreich die URL (https://stromgedacht-prod.azurewebsites.net) von stromgedacht-prod auf stromgedacht-dev anzupassen, damit immer eine auswahl an unterschiedlichen States kommt.

Welche Überlegungen haben die anderen hier noch?

@Andr3asB
Copy link
Author

Um vorbereitende manuelle Arbeiten rechtzeitig zu erledigen, wie z.B.

  • die Waschmaschine/den Wäschetrockner rechtzeitig zu befüllen und auf "Fernstart" zu stellen,
  • das E-Auto anzuschließen,
  • usw.

kann man sich über ("Heute.WorstState" != 1 OR "Morgen.WorstState" != 1) beim Tageswechsel per Messenger benachrichtigen lassen, dass eine Empfehlung in den nächsten 48 Stunden ansteht.

@PastCoder
Copy link

Die API ist nun wohl verfügbar: https://www.stromgedacht.de/api-info/

@klassisch
Copy link

Ja, die API ist verfügbar. Funktionsumfang ist überschaubaur. Doku und Beispiele: https://www.stromgedacht.de/api-docs
Berücksichtigt man das jeweilige Datum und gibt man heute am 2023-05-06 im Browser z.B.
https://api.stromgedacht.de/v1/states?zip=70173&from=2023-05-5T00%3A00%3A00%2B02%3A00&to=2023-05-07T23%3A59%3A59%2B02%3A00
ein , dann erhält man ein JSON
{"states":[{"from":"2023-05-05T00:00:00+02:00","to":"2023-05-07T23:59:59+02:00","state":1}]}

Die States sind wie in der App definiert:
1 = grüner Zustand: Normalbetrieb – Du musst nichts weiter tun
2 = gelber Zustand: Verbrauch vorverlegen – Strom jetzt nutzen
3 = oranger Zustand: Verbrauch reduzieren, um Kosten und CO2 zu sparen
4 = roter Zustand: Verbrauch reduzieren, um Strommangel zu verhindern

@ANierbeck
Copy link

Hi,
bin per Zufall über die Anfrage nach diesem Adapter gestolpert, nachdem ich hiermit schon angefangen habe:
https://github.com/ANierbeck/iobroker-stromgedacht
Obacht, ist die erste Version. Irgendwie funzt das mit den Integrationstests noch nicht so wie ich es mir vorstelle.
Daher Nutzung auf eigene Gefahr ;)

@Andr3asB
Copy link
Author

Das sind wunderbare News! Ich hatte auch geplant den Adapter mit Hilfe von Github CoPilot zu starten aber irgendwie fehlt immer die Zeit dazu sich intensiver mit dem Thema zu beschäftigen.
Kann ich beim Testen (oder was anderem) unterstützen?

@ANierbeck
Copy link

Muss noch hinterlegen, dass es in einem bestimmten Zeitintervall (vermutlich 1h) regelmäßig pollt.
Es gibt 4 zustände:
-1 supergrün
1 grün
2 gelb
3 Rot

Im Objektbaum werden für diese zustände die jeweiligen Start/End Zeiten aufgelistet.
Die Konfiguration des Adapters ist "rudimentär"
ZipCode für die PLZ
und wieviele Stunden im Voraus geschaut werden soll, maximal 48h möglich

@ANierbeck
Copy link

Würde sagen, bin jetzt mit der ersten 0.0.1 Version zufrieden.
Auch die Integrationstests funktionieren endlich.

@Andr3asB
Copy link
Author

@ANierbeck, glückwunsch zum lauffähigen Adapter! Ich hab die Version 0.0.2 bei mir jetzt mal installiert und er scheint zu laufen! - Ich sehe Werte bei grün und supergrün.
Wie hast Du Dir denn die Visualisierung oder Automation gedacht?
Ich könnte mir vorstellen, dass ich den aktuellen Status und einen Countdown bis zum Ende der Phase in der Visualisierung darstellen will - dazu bräuchte es aber ein Objekt, das immer die aktuelle Phase oder die Farbe der aktuellen Phase zurückgibt. Meinst Du das lässt sich realisieren?

@ANierbeck
Copy link

@Andr3asB, Automatisierung sollte per cron laufen, da bin ich noch am analysieren, warum es das gerade nicht macht.
Für meinen "use-case" bisher hätte es gereicht herauszufinden, ob jetzt eine supergrün- oder grün-phase ist.
An Visualisierung hab ich erst mal noch nicht gedacht 🤔

@ANierbeck
Copy link

ANierbeck commented Dec 30, 2023

Version 0.0.6 (korrigiert auf 0.0.6) müsste jetzt auch ordentlich mit cron laufen.
Was mich noch irritiert hatte, dass im Cron die Prozesse bis zum nächsten Neustart durchlaufen. Scheint aber so zu sein, es sei denn man killt den Prozess selber (Adapter).

@mcm1957
Copy link
Collaborator

mcm1957 commented Dec 30, 2023

Version 0.0.5 müsste jetzt auch ordentlich mit cron laufen. Was mich noch irritiert hatte, dass im Cron die Prozesse bis zum nächsten neustart durchlaufen. Scheint aber so zu sein, es sei denn man killt den Prozess selber (Adapter).

Der Adapter ist ein scheduled Adapter. Allerdings steht nirgends im Adaptercode dass er sich nach Erledigung seiner Aufgaben beenden soll ... (-> https://github.com/ioBroker/ioBroker.js-controller/blob/master/packages/controller/doc/classes/AdapterClass.md#terminate

Ein Return von onReady terminiert den Adapter nicht, da ja beliebige asnchrone Funktionen aktiv sein könnten. Die Beendigung muss der Adapetr explizit anfordern sobald er alle Aufgaben erledigt hat. Ansonsten gibts beim nächsten Start eine Fehlermeldung dass der Adapter schon läuft ...

Bitte aber die Diskussion von hier ins Adapter Verzeichnis verlegen. Sollte es Fehler geben im Adapterverzeichnis ein Issue öffnen.

Falls gewunschen kann ich gener ein Review des Adapters durchführen sobald eine Aufnahme ins offizielle Repository gewunschen ist. Siehe https://github.com/ioBroker/ioBroker.repositories#requirements-for-adapter-to-get-added-to-the-latest-repository

@ANierbeck
Copy link

Update zu 0.1.0:

  • läuft stabil, auch cron
  • time-series sind hinzugefügt, damit kann man wenn man möchte das ganze visualisieren. Ein bsp. wie man mit lovelance es machen kann ist im README.

@klassisch
Copy link

Vielen Dank! Habe nun auch getestet:
Instanzeneinstellungen 48h gewählt:
grafik

In den Objekten: 24
grafik

Ist das ein anderes Objekt? oder wird das einfach noch nicht richtig übernommen?

@ANierbeck
Copy link

Hi,
meine Vermutung ist, das in diesem Falle die configuration für den ersten Lauf noch nicht übernommen wurde.
Ab jedem weiteren sollte hier an dieser stelle das gleiche stehen wie in der configuration.

@mcm1957
Copy link
Collaborator

mcm1957 commented Jan 3, 2024

Ich wiederhole nochmals:

Bitte aber die Diskussion von hier ins Adapter Verzeichnis verlegen. Sollte es Fehler geben im Adapterverzeichnis ein Issue öffnen.

Zukünftige Fehlermeldungen zum Adapter oder Fragen zur Bedienung des Adapter sind hier fehl am Platz. Fehler bitte als Issue im Adapter Repo anlegen. Diskussionen bitte im Forum (https://forum.iobroker.net) führen.

Ich behalte mir vor zukünftige Comments die Fehlermeldungen oder Bedinungsanfragen etc. enthalten zu löschen.

Falls gewunschen kann ich gerne ein Review des Adapters durchführen sobald eine Aufnahme ins offizielle Repository gewunschen ist. Siehe https://github.com/ioBroker/ioBroker.repositories#requirements-for-adapter-to-get-added-to-the-latest-repository

Status:
Github-Repository: https://github.com/ANierbeck/iobroker-stromgedacht
Forum: unbekannt
Latest-Repo: noch nicht beantragt

@ioBroker ioBroker deleted a comment from klassisch Jan 3, 2024
@ANierbeck ANierbeck removed their assignment Jan 3, 2024
@ANierbeck
Copy link

Finales update
Version 0.2.0 ist draußen. Nun werden die time-series Daten auch per influxdb adapter protokolliert

@mcm1957
Copy link
Collaborator

mcm1957 commented Jan 6, 2024

Status:
Github-Repository: https://github.com/ANierbeck/iobroker-stromgedacht
Forum: unbekannt
Latest-Repo: noch nicht beantragt

Infos bezüglich Repositoryaufnahme:
https://github.com/ioBroker/ioBroker.repositories?tab=readme-ov-file#requirements-for-adapter-to-get-added-to-the-latest-repository

@mcm1957 mcm1957 added the Repo missing Adapter seesm to be ready but dev did nogt yet release it to repositories label Jan 6, 2024
@ANierbeck
Copy link

latest version is 1.1.0.
Version 1.0.0 hat benutzt die offiziellen logos
Version 1.1.0 neues Feature zum abholen der Informationen über Last, Residual-Last, Erneuerbare Energie und Super Grün Threshold

@mcm1957
Copy link
Collaborator

mcm1957 commented Feb 25, 2024

**Sobald der Adapter für User verwendbar ist / scheint, bitte ein Aufnahme in die offiziellen Repositories einplanen.
Danke

Status:
Github-Repository: https://github.com/ANierbeck/iobroker-stromgedacht
Forum: unbekannt
Latest-Repo: noch nicht beantragt

Infos bezüglich Repositoryaufnahme:
https://github.com/ioBroker/ioBroker.repositories?tab=readme-ov-file#requirements-for-adapter-to-get-added-to-the-latest-repository

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
InProgress Repo missing Adapter seesm to be ready but dev did nogt yet release it to repositories
Projects
None yet
Development

No branches or pull requests

6 participants