Zendure SmartFlow MQTT

Hallo Ralf, Danke für die schnelle Antwort.
Ich hab den Fehler gefunden. Es lag an der paho-mqtt ich hatte die 2.0.0 installiert.
Nach einem Uninstall und pip install paho-mqtt==1.6.1 läuft es.
Mein Hub ist nun Offline und im MQTT-Explorer seh ich die ersten Daten.

1 „Gefällt mir“

Hast du mehr als einen Akku?

Dann klappt die Variablenerstellung über den Symcon MQTT Konfigurator nicht so gut, da Zendure eine „etwas ungünstige“ Struktur im MQTT verwendet.

ja ich hab z.Z 2 AB2000 sollen aber 4 werden.

wie genau mache ich das?

grafik

Das Script unten durch die Variablenänderung der Value Variablen triggern, dann werden unterhalb des Script die notwendigen Strukturen angelegt.

<?php

// parameter help
// https://github.com/reinhard-brandstaedter/solarflow-statuspage/blob/master/src/solarflow-status.py

$jsonString = GetValueString(47807); // .../report aus dem MQTT Konfigurator angelegt

// Kategorie-ID, unter der alles angelegt werden soll
$parentCategoryId = $_IPS['SELF'];


// Parsen des JSON-Strings in ein PHP-Array
$data = json_decode($jsonString, true);

//print_r($data);

//if (isset($data['properties'])) echo "properties vorhanden\n\n";
//if (isset($data['packData'])) echo "packData vorhanden\n";

// Überprüfen, ob das Parsing erfolgreich war
if ($data === null) {
    echo "Fehler beim Parsen des JSON-Strings";
    return;
}

// Versuche, die Variable unter der Kategorie zu finden
$variableId = @IPS_GetVariableIDByName('timestamp', $parentCategoryId);
if ($variableId === false) {
    // Variable existiert nicht, also anlegen
    $variableId = IPS_CreateVariable(1); // 1 für Integer, ggf. anpassen
    IPS_SetParent($variableId, $parentCategoryId);
    IPS_SetName($variableId, 'timestamp');
}
SetValue($variableId, $data['timestamp']);

// Eigenschaften aus dem JSON verarbeiten
foreach ($data['properties'] as $key => $value) {
    // Versuche, die Variable unter der Kategorie zu finden
    $variableId = @IPS_GetVariableIDByName($key, $parentCategoryId);
    if ($variableId === false) {
        // Variable existiert nicht, also anlegen
        $variableId = IPS_CreateVariable(1); // 1 für Integer, ggf. anpassen
        IPS_SetParent($variableId, $parentCategoryId);
        IPS_SetName($variableId, $key);
    }
    SetValue($variableId, $value);
}

// Verarbeiten der packData-Elemente
if (isset($data['packData'])){
    foreach ($data['packData'] as $pack) {
        $sn = $pack['sn'];
        // Versuche, die Kategorie mit der SN zu finden
        $categoryId = @IPS_GetCategoryIDByName($sn, $parentCategoryId);
        if ($categoryId === false) {
            // Kategorie existiert nicht, also anlegen
            $categoryId = IPS_CreateCategory();
            IPS_SetParent($categoryId, $parentCategoryId);
            IPS_SetName($categoryId, $sn);
        }

        // Jede Eigenschaft im packData-Objekt verarbeiten
        foreach ($pack as $key => $value) {
            if ($key == 'sn') continue; // SN wird als Kategorie-Name verwendet, nicht als Variable
            $variableId = @IPS_GetVariableIDByName($key, $categoryId);
            if ($variableId === false) {
                // Variable existiert nicht, also anlegen
                $variableId = IPS_CreateVariable(1); // 1 für Integer, ggf. anpassen
                IPS_SetParent($variableId, $categoryId);
                IPS_SetName($variableId, $key);
            }
            SetValue($variableId, $value);
        }
    }
}
//echo "Verarbeitung abgeschlossen.";

Ich nutze zum einfachen und direkten schreiben auf den internen MQTT Server das Script von
GitHub - bluerhinos/phpMQTT: a simple php class to connect/publish/subscribe to a MQTT broker

Das ist im Script Ordner unter dem Namen phpMQTT.php abgelegt.

<?php
// https://github.com/bluerhinos/phpMQTT

require('phpMQTT.php');

$debug = true;               

$server = 'localhost';     // change if necessary
$port = 1883;                     // change if necessary
$username = '';                   // set your username
$password = '';                   // set your password
$client_id = 'phpMQTT-publisher'; // make sure this is unique for connecting to sever - you could use uniqid()

$topic = 'iot/73bkTV/xxx/properties/read'; // xxx durch korrekten Topic ersetzen
$value = '{"properties": ["getAll"]}';

$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);


if ($value) {
    if ($mqtt->connect(true, NULL, $username, $password)) {
        if ($debug)
            IPS_LogMessage(IPS_GetName($_IPS['SELF']), "MQTT connect, topic " . $topic . ", value " . $value);
        $mqtt->publish($topic, $value, 0, false);
        $mqtt->close();
    }
}

Hallo Ralf, vielen Dank für deine Antworten.
Nun läuft alles.

1 „Gefällt mir“

guten morgen,

bin zufällig auf euer forum gestoßen und hoffe, dass ihr mir helfen könnt.
ich schaffe es den SF von der cloud zu nehmen, allerdings bekomme ich dann keine werte an meinen mqtt-broker.

iot/73bkTV/DEVICE_ID/properties/read {„properties“: [„getAll“]} habe ich auch schon gesendet, leider kein erfolg.

über bluetooth funktioniert das allerdings ohne probleme, allerdings ist die verbindung recht instabil.

habt ihr vielleicht eine ahnung?

vielen dank vorab, vg thomas

Dein Topic ist nicht vollständig, da davor noch ein „nicht sichtbares“ Zeichen ist.

Außerdem klappt MQTT auf einen eigenen Server nicht gut/stabuil, wenn die App noch läuft und mit dem SF connected ist.

Ein Sendeversuch aus dem MQTT-Explorer sollte dir eventuell helfen.

ich muss ja ehrlich gestehen, ich nutze nicht Symcon. Aber mit den Hinweisen von Ralf konnte ich das System komplett offline nehmen und es ist nun im Home Assistant integriert sogar mit der Möglichkeit das outputLimit im Home Assistant zu setzen. Nach dem bei mir die Variante solarflow-bt-manager.py -i -b Broker sehr instabil lief bin ich zu der Docker-Variante mit solarflow-control.py gewechselt und siehe da nach kurzer Zeit kommt im MQTT-Explorer auch die Topic so wie von Ralf beschrieben. Einziger Unterschied ist der Aufbau der Topic bei mir jetzt solarflow-hub/73bkTV/DEVICE_ID/telemetry

Da jetzt alle Daten vom Hub, meiner OpenDTU sowie ShellyPRO3EM im selben MQTT-Brocker landen konnte ich sogar in der OpenDTUonbattery die Daten der Akkus und des Shelly einbinden. Mir war aber am wichtigsten von HA aus das outputLimit steuern zu können, da ich im nächsten Schritt an einer Automatisierung in Richtung Nulleinspeisung arbeiten möchte. Dafür ist mir wichtig nicht nur das Limit des WR anpassen zu können sondern auch den output der Akkus.

1 „Gefällt mir“

ich habe das auch im mqtt-explorer so gesendet:

SF ist nicht mehr mit der app verbunden

leider kommen aber keine nachrichten auf den mqtt-server

Hat dein Broker einen User/PW?

habe ich bereits deaktiviert. und, wie gesagt, über BT werden werte gesendet

firewall ist auch nicht schuld

Also bei mir sah das Ergebnis so aus wie bei dir als ich bt-manager -d -w WLAN -b Broker gesendet hatte und selbst nach einem Tag kam nix.

ich hatte mich dann mit folgendem beschäftigt

und hab es auf dem gleichen rpi zero als docker laufen, auf welchem auch der mqtt läuft. sobald man wie in dem link beschrieben die config.ini auf seine werte anpasst und den docker container startet werden die Topics richtig angelegt und die Werte kommen.

Da wie in deinem Screen zusehen du auch HA nutzt. Hat es den Vorteil, dass die outputlimit Geschichte in HA veröffentlicht wird. Du bekommst dann unter der HA Topic einen Switch für Bypass vom Hub und auch einen Eintrag number dies ist im HA das Feld um outputlimit Werte zu setzen.

alternativ gibt es noch solarflow-topic-manager.py das script macht wenn es als Dienst läuft wohl das gleiche und erstellt alle Topics richtig, aber das hab ich nicht zum laufen bekommen.

danke zu allererst mal für eure hilfe. allerings habe ich eben das problem, dass keine werte vom hub an den broker geliefert werden:

Ach was bei mir noch ein Problem war ich musste erstmal solarflow-bt-manager.py -d -w fiktives WLAN -b Broker und danach nochmal mit meinem richtigen WLAN Daten

ändert leider auch nichts daran…

zudem kann ich nach dem disconnecten auch nicht mehr auf die cloud verbinden, außer mit neuerlichem hinzufügen einer NW-verbindung in der app

Hast du den Hub mal neugestartet?

Moin, du musst das topic mit dem „richtigen“ json Format senden

Topic:
iot/73bkTV/DEVICE_ID/properties/read

{
    "properties": [
        "getAll"
    ]
}

oder
{"properties": ["getAll"]}

hier im Forumbeitrag wurden die Gänsefüße nicht korrekt gesetzt.

Ach ja und deine app darf am besten auch nicht mehr im hintergrund geöffnet sein.

Gruß
Matten Matten

Hab ja schon sehr viele Datenpunkte ermittelt die auch in der Original App zur verfügung stehen,