seppl2025 Geschrieben May 10, 2025 at 06:25 Geschrieben May 10, 2025 at 06:25 (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. 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. bearbeitet May 11, 2025 at 06:43 von seppl2025 config.yaml mit kommentar Zitieren
MatzeTF Geschrieben May 10, 2025 at 11:11 Geschrieben May 10, 2025 at 11:11 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. 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. Zitieren
seppl2025 Geschrieben May 10, 2025 at 16:44 Autor Geschrieben May 10, 2025 at 16:44 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? Zitieren
MatzeTF Geschrieben May 10, 2025 at 17:06 Geschrieben May 10, 2025 at 17:06 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. Zitieren
seppl2025 Geschrieben May 10, 2025 at 17:33 Autor Geschrieben May 10, 2025 at 17:33 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. Zitieren
MatzeTF Geschrieben May 10, 2025 at 18:28 Geschrieben May 10, 2025 at 18:28 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. Zitieren
seppl2025 Geschrieben May 11, 2025 at 06:28 Autor Geschrieben May 11, 2025 at 06:28 (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 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. bearbeitet May 11, 2025 at 06:31 von seppl2025 Zitieren
MatzeTF Geschrieben May 11, 2025 at 11:34 Geschrieben May 11, 2025 at 11:34 On 5/11/2025 at 8:28 AM, seppl2025 said: Die untere Grenze liegt dort bei 10 Sekunden. Schade. Das erklärt aber immerhin die periodisch schwankende Ladeleistung. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.