Zendure SmartFlow MQTT

ok. Danke
Übrigens, ich musste nichts neu aktivieren. :joy:

Hallo @ralf ,
wir haben jetzt ja Minusgrade und Sonne. Hab festgestellt das der Solarflow aber nicht einspeist. Habe Probeweise mal den minSoc 2% runtergenommen und da speist er ein. Sobald die Grenze erreicht ist schaltet Akku ab und SolarInput geht auf 0W obwohl sich an der Sonnenintensität erstmal nichts geändert hat. Ist das bei Dir auch so?

Gruß

Jürgen

Nachdem der Schnee weg war wurde von der Südseite massiv geladen. Die beiden Platten am Hoymiles liegen auf der Garage und da ist noch Schnee drauf.

Meine Akkus stehen aber im warmen :wink: .

Heute in ~3 Stunden von ~50% aufgeladen.

1 „Gefällt mir“

Sieht ja gut aus!
Da scheint bei mir mit dem Bypass was nicht zu funktionieren. Hab jetzt mal minSoc und socSet = socLevel gesetzt und schon produziert er. Komisch ist nur das der socSet eigentlich auf glaube ich 70% begrenzt ist. Da sind wohl noch einige Firmwareupdates fällig. Danke Dir trotzdem

@jnicke Hast du auch zwei Akkupacks?

Bei mir werden vom zweiten Akku nicht immer alle Werte aktualisiert, im Bild oben passte es, in der App sind aktuell beide Akkus voll und über MQTT wurde socLevel um 9:33 auf 28% aktualisiert, danach nicht mehr.
grafik

StandBy und die anderen Werte schon, wobei die SW Version immer noch auf 8200 steht, beim ersten Akku auf 8214. Die App will aber nichts mehr updaten.

Nein ich habe vorläufig nur einen. Auch bei mir sieht es so aus als wenn die Meldungen sich ab und an mal verzögern. Hab grad gesehen mein Akku ist von 27% auf 0% gepurzelt. Trotz Kalibrierung.

Bilde mir ein in der App im Zendure Forum was gelesen zu haben. Finds aber leider nicht mehr. Vielleicht hilft es den Akku mal zu trennen.

ok, danke

Komplett trennen war mein Plan, aber die ganze Technik ist etwas verbaut und ich habe etwas aufwand um ranzukommen :see_no_evil: .

Kann ich mit Symcon Bordmitteln dafür sorgen, dass die Variablen gefüllt werden? Ich hab nun mal einen MQTT Client angelegt auf den entsprechenden Server … hab auch den App Key und das Secret eingetragen… jedoch fehlt mir noch die Info, wie das Topic aufgebaut sein muss :S… wenn das stimmen würde… kämen dann Daten an oder benötige ich ein custom Script dafür?

Bei App Key und Secret nehme ich mal an, dass du den Zendure Cloud MQTT Server nutzen möchtest?

Hast du schon mal mit dem MQTT Explorer getestet? Da siehst du direkt, dass du korrekt angemeldet bist und du siehst auch die Daten, die vom SF in die Cloud gehen.

Da das Topic mit einem unsichtbaren Zeichen anfängt, sollten die Variablen über den Symcon MQTT COnfigurator angelegt werden, manuell habe ich es damals nicht geschafft.

Ich habe auf dem MQTT Server von Symcon umgestellt, hänge somit nicht mehr an der Zendure Cloud.

Also im MQTT Explorer bin ich wohl korrekt angemeldet ich sehe dort aber keinerlei Daten. Auch in Symcon kommt nicht wirklich viel an.

Wenn keine Sonne da ist oder der Akku leer kommt nix :wink: , wenn du MQTT in der Cloud nutzt, dann kannst du die App parallel nutzen, die sorgat normalerweise schon für etwas Verkehr.

Oh, das könnte natürlich sein. Aktuell ist der Akku auch nur 42% geladen. Ich beobachte es morgen nochmal.

Guten Abend, ich wollte gerade nach der Anleitung vorgehen bekomme aber Fehler bei dem versuch den Hub von der Cloud zu trennen oder einen lokalen MQTT zu übergeben.

2024-02-24 20:02:22,383:INFO: 00001801-0000-1000-8000-00805f9b34fb (Handle: 1): Generic Attribute Profile
2024-02-24 20:02:22,387:INFO: 0000a002-0000-1000-8000-00805f9b34fb (Handle: 12): Vendor specific
2024-02-24 20:02:22,389:INFO: 00112233-4455-6677-8899-aabbccddeeff (Handle: 18): Unknown
Exception ignored in: <function Client.__del__ at 0xb5f26f58>
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/paho/mqtt/client.py", line 874, in __del__
    self._reset_sockets()
  File "/usr/local/lib/python3.9/dist-packages/paho/mqtt/client.py", line 1133, in _reset_sockets
    self._sock_close()
  File "/usr/local/lib/python3.9/dist-packages/paho/mqtt/client.py", line 1119, in _sock_close
    if not self._sock:
AttributeError: 'Client' object has no attribute '_sock'
Traceback (most recent call last):
  File "/home/xxx/solarflow-bt-manager.py", line 235, in <module>
    main(sys.argv[1:])
  File "/home/xxx/solarflow-bt-manager.py", line 232, in main
    asyncio.run(run(broker=mqtt_broker, port=mqtt_port, info_only=info_only, connect=connect, disconnect=disconnect, ssid=ssid))
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/home/xxx/solarflow-bt-manager.py", line 143, in run
    mq_client = local_mqtt_connect(broker,port)
  File "/home/xxx/solarflow-bt-manager.py", line 39, in local_mqtt_connect
    client = mqtt_client.Client(client_id="solarflow-bt")
TypeError: __init__() missing 1 required positional argument: 'callback_api_version'

kann mir jemand sagen was ich falsch mache?

Vielen Dank im Voraus.

Bist du absolut sichert, dass die App nicht noch im Hintergrund läuft und über Bluetooth mit dem SF verbunden ist?

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();
    }
}