Jump to content

Recommended Posts

Geschrieben (bearbeitet)

In dem Beitrag:

ist ja bereits diskutiert worden, wie ein Tasmota-Stromzähler seine Werte an die Warp3 liefern kann.
Die Lösung dort sendet direkt per Post-API die Werte. Das funktioniert aber nicht so wie gewünscht, weil der Power Wert z.B. bei eHZ Zählern immer positiv ist, die Wallbox aber
ein korrektes Vorzeichen erwartet. Zudem finde ich persönlich den Weg über MQTT zukunftssicherer. MQTT ermöglicht eine saubere "Separation of Concerns".

Als Lösungsvorschlag habe ich ein python basiertes Middlewareprojekt gestartet - siehe https://github.com/WolfgangFahl/WarpMQTT2Api

Bei mir läuft die Software auf einem raspberry PI. Einfach von pypi oder direkt vom github repository aus installieren. Dann gibt es ein warp3 Kommandozeilen-Werkzeug:
 

warp3 -h
usage: warp3 [-h] [--config-path CONFIG_PATH] [--mqtt-broker MQTT_BROKER]
             [--mqtt-port MQTT_PORT] [--mqtt-topic MQTT_TOPIC]
             [--mqtt-username MQTT_USERNAME] [--mqtt-password MQTT_PASSWORD]
             [--update-interval UPDATE_INTERVAL] [--dry-run]
             [--wallbox-host WALLBOX_HOST] [--power-tag POWER_TAG]
             [--in-field IN_FIELD] [--out-field OUT_FIELD]
             [--time-field TIME_FIELD] [--meter-id METER_ID] [--debug]

MQTT to Warp3 Wallbox Middleware

options:
  -h, --help            show this help message and exit
  --config-path CONFIG_PATH
                        Path to YAML configuration file
  --mqtt-broker MQTT_BROKER
                        MQTT broker address
  --mqtt-port MQTT_PORT
                        MQTT broker port
  --mqtt-topic MQTT_TOPIC
                        MQTT topic to subscribe to
  --mqtt-username MQTT_USERNAME
                        MQTT username
  --mqtt-password MQTT_PASSWORD
                        MQTT password
  --update-interval UPDATE_INTERVAL
                        Minimum update interval in seconds
  --dry-run             Run without updating the wallbox
  --wallbox-host WALLBOX_HOST
                        Wallbox host URL
  --power-tag POWER_TAG
                        Tag in MQTT data containing power information
  --in-field IN_FIELD   Field name in MQTT data containing energy input
  --out-field OUT_FIELD
                        Field name in MQTT data containing energy output
  --time-field TIME_FIELD
                        Field name in MQTT data containing timestamp
  --meter-id METER_ID   Meter ID to use
  --debug               Enable debug logging

Ausgangspunkt ist ein tasmota-Zähler, der mit MQTT Nachrichten sendet. 

bitshakeScreenShot2025-05-11.jpg

Siehe z.B. https://docs.bitshake.de/script/

Bei mir sehen diese Nachrichten so aus:

{"Time":"2025-05-10T08:24:13","eHZ":{"E_in":67299.845,"E_out":50268.783,"Power":0,"Power2":4111}}

Zunächst wird ein Stromzähler als API - Zähler für den Netzanschluss eingerichtet. Die ID des Zähler kommt dann in die Konfigurationsdatei zur Beschreibung des Zählers und der MQTT Verbindung:
 

# WF 2025-09-05
# warp3 middleware configs
# Wallbox
wallbox_host: "http://wallbox.bitplan.com"
# Zähler
meter_id: 2
# Update Frequenz in Sekunden - 1 bis 2 Sekunden sind sinnvoll
update_interval: 1 
# Beschreibung der MQTT Nachricht
time_field: "Time"
power_tag: "eHZ"
# Genaue Wirkleistung
power_field: "Power2"
# Zählerwerte zur Abschätzung und Vorzeichenberechnung
in_field: "E_in"
out_field: "E_out"
# MQTT Kommunikationseinstellungen
mqtt_broker: "mqtt.bitplan.com"
mqtt_port: 1883
mqtt_topic: "tele/tasmota_****/SENSOR"
mqtt_username: "****"
mqtt_password: "****"
update_interval: 1 # - every second
dry_run: false

Ein start script:
 

#!/bin/bash
# WF 2025-05-10
# Start Warp3 with nohup and log to /var/log/warp3

LOGDIR="/var/log/warp3"
LOGFILE="$LOGDIR/warp3.log"
APP="warp3"
OPTIONS="--config-path /home/wf/.warp3/config.yaml"

sudo mkdir -p "$LOGDIR"
sudo chmod 755 "$LOGDIR"
sudo chown wf:wf $LOGDIR

timestamp=$(date '+%F %T')
echo "$timestamp - INFO - 🚀 Starting warp3" >> "$LOGFILE"

nohup "$APP" $OPTIONS >> "$LOGFILE" 2>&1 &

crontab eintrag:
 

# run warp3 on reboot
@reboot /home/wf/bin/warp3start

dann erscheint im Log
 

2025-05-10 08:13:27 - INFO - 🚀 Starting warp3
2025-05-10 08:13:28,476 - INFO - Starting MQTT to Warp3 middleware
2025-05-10 08:13:28,476 - INFO - MQTT broker: mqtt.bitplan.com
2025-05-10 08:13:28,476 - INFO - MQTT topic: tele/tasmota_B13330/SENSOR
2025-05-10 08:13:28,477 - INFO - Wallbox host: http://wallbox.bitplan.com
2025-05-10 08:13:28,477 - INFO - Power tag: eHZ
2025-05-10 08:13:28,477 - INFO - Meter ID: 2
2025-05-10 08:13:28,503 - INFO -  Connected to Warp3 - Firmware version: 2.8.0+6810d7c9
2025-05-10 08:13:28,523 - INFO -  Meter 'Hausanschluss' at location 4 measures: 74: Summe der Phasenwirkleistungen (Bezug - Einspeisung)
2025-05-10 08:13:28,528 - INFO - Starting MQTT loop
2025-05-10 08:13:28,529 - INFO - Connected to MQTT broker at mqtt.bitplan.com
2025-05-10 08:13:28,529 - INFO - Subscribed to tele/tasmota_B13330/SENSOR
2025-05-10 08:13:43,751 - INFO - Power value: -3600W
2025-05-10 08:13:43,777 - INFO -  -3600 Watt set
2025-05-10 08:13:53,754 - INFO - Power value: -3960W
2025-05-10 08:13:53,777 - INFO -  -3960 Watt set
2025-05-10 08:14:03,761 - INFO - Power value: -3960W
2025-05-10 08:14:03,786 - INFO -  -3960 Watt set

Nun ist der Zähler mit der eingestellten Tasmota-Sende Frequenz für die wallbox sichtbar.

warpscreenshot2025-05-10.jpg

 

bearbeitet von seppl2025
config.yaml mit kommentar
Geschrieben
On 5/10/2025 at 8:25 AM, seppl2025 said:

Nun ist der Zähler mit der eingestellten Tasmota-Sende Frequenz für die wallbox sichtbar.

warpscreenshot2025-05-10.jpg

Das sieht nach einem Sendeintervall von zehn Sekunden aus. Kann man das auch erhöhen? Die Wallbox möchte gerne Werte im Sekundentakt haben, oder alternativ maximal alle zwei Sekunden, damit PV-Überschussladen gut funktioniert.

Warum macht der Leistungswert eigentlich Sprünge von genau 360 W? Das ist ziemlich ungenau. Ich hätte erwartet, dass der Tasmota-Sensor die Momentanleistung mit Watt-Genauigkeit ausliest.

Geschrieben

Sehr gute Fragen. 
Kann man das auch erhöhen? Die Wallbox möchte gerne Werte im Sekundentakt haben, oder alternativ maximal alle zwei Sekunden, damit PV-Überschussladen gut funktioniert.

Ja - die Konfiguration sieht das ja bereits vor. Ich hatt es nur noch nicht umgesetzt. https://github.com/WolfgangFahl/WarpMQTT2Api/issues/4
hat den Fix.

Warum macht der Leistungswert eigentlich Sprünge von genau 360 W? Das ist ziemlich ungenau. Ich hätte erwartet, dass der Tasmota-Sensor die Momentanleistung mit Watt-Genauigkeit ausliest.

Natürlich, das Power2 Feld hat die Leistung. Ich habe aber bewusst erstmal die Zählerwerte mit Timestamp umgerechnet. Wegen der Rundung und dem 10 Sekunden Takt gibt das eine Ungenauigkeit. Ich habe jetzt auf 20 Sekunden MQTT Takt gedrosselt, dann ist es schon mal genauer. Ansonsten muss ich mir das Vorzeichen des Power-Werts noch angucken.

Das ganze ist ja eh nur eine Work-Around bis MQTT-Zähler möglich sind. Gibt es dazu schon ein offizielle Feature-Request im github?

Geschrieben

Ob es dazu schon einen Feature-Request gibt, weiß ich nicht, aber auf absehbare Zeit wird das nicht kommen.

Du kannst aber schon jetzt einen API-Zähler per MQTT mit Daten beliefern. Allerdings brauchst du dann immer noch ein Script, um die Werte per MQTT  vom Tasmota-Sensor zu empfangen, umzurechnen und per MQTT an die Wallbox zu schicken.

Wenn du den MQTT-Takt auf 20 Sekunden gedrosselt hast, wird vielleicht der Wert genauer, aber da die Werte zu selten kommen, wird die Regelung fürs PV-Überschussladen deutlich schlechter. Du solltest auf jeden Fall rausfinden, wie die Power-Werte zu interpretieren sind. Würde mich nicht wundern, wenn das eine einfach die Bezugsleistung und das andere die Einspeiseleistung ist, die du dann zu einem vorzeichenbehafteten Wert kombinieren musst.

Geschrieben

v0.0.4 müsste das jetzt richtig machen. Ich probier das morgen aus.
 

 def calcPower(self, payload) -> float:
        """
        Calculate power from payload using MeterReading class.

        Args:
            payload: The decoded JSON payload from MQTT message

        Returns:
            float: Calculated power in watts
        """
        # get the timestamp
        timestamp_str = payload.get(self.time_field)
        # Get the data from the payload
        data = payload.get(self.power_tag, {})

        # Extract values
        e_in = data.get(self.in_field)
        e_out = data.get(self.out_field)
        power_magnitude = data.get(self.power_field)

        # Create current reading
        current = MeterReading(kWh_in=e_in, kWh_out=e_out, time_stamp=timestamp_str)
        # If we don't have a previous reading, store this one and return fallback power
        if not hasattr(self, "_last_reading"):
            active_power = None
        else:
            # calc power roughly from meter reading
            active_power = current.active_power(self._last_reading)
            # if we have a precise power magnitude we will use it:
            if power_magnitude:
                delta_in = e_in - self._last_reading.kWh_in
                delta_out = e_out - self._last_reading.kWh_out
                sign = 1 if delta_in >= delta_out else -1
                active_power=sign*power_magnitude
            active_power=round(active_power)

        # Update stored reading
        self._last_reading = current
        return active_power

Das Vorzeichen wird über die in/out Zähler bestimmt. Wirkleistung kommt vom Power2 Wert, der aber immer positiv ist. Die Anzeige in der warp UI sieht jetzt richtig aus das MQTT Intervall habe ich auf 10 Sekunden gestellt der aktuelle Wert wird dann einfach jede Sekunde gesendet. Das müsste deutlich besser funktionieren.

Geschrieben
On 5/10/2025 at 7:33 PM, seppl2025 said:

Die Anzeige in der warp UI sieht jetzt richtig aus das MQTT Intervall habe ich auf 10 Sekunden gestellt der aktuelle Wert wird dann einfach jede Sekunde gesendet. Das müsste deutlich besser funktionieren.

Das heißt, du sendest immer 10x den gleichen Wert? Für den Graphen sieht das gut aus, aber die Regelung fürs PV-Überschussladen macht das nicht besser. Der Regler möchte im Sekundentakt frische Werte vom Zähler haben.

Geschrieben (bearbeitet)

Mit v0.0.4 und konservativer Einstellung -200 Watt ist das PV-Laden jetzt schon deutlich präziser möglich. Die Frequenz wird jetzt durch die teleperiod am Tasmota Lesegerät bestimmt

bitshakeScreenShot2025-05-11.jpg

 https://tasmota.github.io/docs/Commands/#mqtt
 

TelePeriod 	See current value and force publish STATE and SENSOR message
0 = disable telemetry messages
1 = reset telemetry period to firmware default (TELE_PERIOD)
10..3600 = set telemetry period in seconds (default = 300)

Die untere Grenze liegt dort bei 10 Sekunden.
 

Warp3ScreenShot2025-05-11.thumb.jpg.5e1df087ac40c2a7ef29b68d747c25b2.jpg

 


 

 

bearbeitet von seppl2025

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...