Zendure SmartFlow MQTT

läuft denn die Anbindung von oben (local MQTT) noch mit mit Update? Ich habe mich noch nicht getraut zu aktualisieren.

Moin,

die habe ich nicht gemacht. Zu viel Arbeit. Die versprechen ja seit 2 Jahren eine lokale API. Jetzt gibt es die lokale API aber nur für neue Systeme. Es gibt jetzt ein neues Energiegerät das man wohl definieren kann ich habe es aber nicht groß getest weil es schon am Anfang nicht das gemacht hat was ich wollte. Ich würde sagen lohnt nicht wenn Du zufrieden bist.

Ralf

Hi, ja so habe ich es jetzt gemacht. Ich nutze MQTT lokal über einen MQTT Server in IPS und mache die Speichersteuerung (setzen inputLimit, outputLimit und acMode) via REST API, das klappt sehr gut und dann spar ich mir den Web über die MQTT Topics die ich nicht finde :smiley:

Ich habe seit ein paar Tagen einen SF2400Pro.
Und ich habe ein Balkonkraftwerk - also 800W.
Weiters hatte ich einen Shelly 3EM mittels MQTT in IPS integriert.
Da mein Ziel die Nulleinspeisung ist musste der Shelly mal in die Cloud und somit ists aus mit MQTT Daten.
Der SF2400Pro ist in HEMS integriert. Er hat die aktuelle Firmware.

Leider läuft das Ganze nicht rund. Jeden Tag muss man ein paar mal den Energieplan wechseln bevor das Teil vom Bypassmodus in den Lademodus umschaltet. Ab dann läufts den ganzen Tag ziemlich sauber.

Daher die Frage - hat schon jemand eine Nulleinspeisung auf lokalem Weg realisiert?
Und muss man sich dann um ALLES selbst kümmern? Also auch um die Lade/Entladegrenzen des Akkus, Einspeiselimits, etc.

Bzw. kennt wer einen Trick wie man das Teil überreden kann trotz HEMS die Daten auch über MQTT auszugeben?
Da gibt’s so ein Limit dass er nach kurzer Zeit keine Daten mehr schickt.

Danke euch.

Ich betreibe inzwischen zwei Hyper 2000, umgestellt auf den lokalen MQTT Server und bin somit komplett ohne Cloud unterwegs.

Die gesamte Steuerung erfolgt mit einem Script, es gibt noch ein paar weitere für Auswertungen und Konfigurationen (um MQTT Kommandos zu senden)

Das Script ist gemeinsam mit gemini entstanden, berücksichtigt einige Szenarien und sorgt für meine Nulleinspeisung.

Ich wollte gleichmäßig Laden und Entladen und ein paar Fälle berücksichtigen,

FALL 1: Akkus sind voll
FALL 2: Zwangsladung eines Akkus oder Sauna aktiv (STOP)
FALL 3: Akkus leer / unter Minimum
FALL 4: Normaler Regelbetrieb (Entladung)

Die Konfiguration mache ich auch im IPSview

die fasse ich aber sehr selten an.

1 „Gefällt mir“

Da schaut ja toll aus bei dir.

Ist deine Steuerung ein normales PHP Script oder ein IPS-View Logikplan?
Und was mich tatsächlich interessieren würde:
Wenn du am SF Akkugrenzen (Lade/Entlade) einstellst.
Werden diese dann intern berücksichtigt oder musst du dich in deinem Script selbst drum kümmern ?

@habre Versuche nach Möglichkeit, die bereitgestellt API zu nutzen und nicht den MQTT mit der SF2400Pro. Die API ist bedeutend stabiler. Auch kann ich nur empfehlen, den maximalen Ladezustand des Soc auf 94-96% einzustellen. Ich habe leider öfters die Erfahrung machen dürfen, dass bei einem erreichten Ladewert von 99%+ die SF2400Pro “abschaltet”. Es passiert einfach nichts mehr. Zu deiner Frage bzgl HEMS und mqtt kann ich dir schnell weiterhelfen. Nein, das geht nicht. Was du versuchen kannst ist die Steuerung über API und HEMS, das habe ich nicht versucht da ich eine vollständige Offline-Steuerung bevorzuge.
Mit der Kombination SF2400Pro - Hoymiles1600 - ShellyPro3EM funktioniert das einwandfrei.
Bei weiteren Fragen kann ich gerne unterstützen.

Beste Grüße

Sorry, ich war ein paar Tage unterwegs.

Die Steuerung ist ein Script, das normalerweise im 10 Sekunden Takt läuft, solange Sonne oder Akkuladung vorhanden ist und nach Sonnenaufgang und Einstrahlung auch wieder startet.

Die Grenzen stelle ich über das zweite Bild mit einzelnen Scripten per MQTT ein. Die Werte werden (weitgehend) eingehalten. Es kommt schon mal vor, dass 10% eingestellt sind, aber erst bei 7% gestoppt wird.

Die Einspeiselimits wurden bisher immer eingehalten.

Es gibt auch die Zwangsladung, d.h. wenn der Hyper der Meinung ist, er möchte jetzt voll laden, dann macht er das und es ist nicht abbrechbar oder zu verhindern.

Das gilt auch für die (un-)regelmäßige Komplettladung. Es wird ab und zu auf 100% geladen, auch das ist nicht abbrechbar oder zu verhindern. Dann saugt er schon mal 1.200 Watt aus dem Netz oder viel schlimmer, aus dem anderen Akkupack. Das verhindert das Script aber inzwischen.

Und seit längerem ist der Bypass Modus nicht mehr von außen steuerbar, d.h. es kann (eine Weile) passieren, dass die Akkus nicht geladen werden und aus den Solarzellen ins Haus oder ins Netz eingespeist wird.

In Summe bin ich sehr zufrieden mit den Möglichkeiten, der Stabilität der Anbindung und der komplett lokalen, weitgehend möglichen Steuerung durch Symcon.

Es mag sein, dass der SF2400Pro sich anders verhält, meine Anbindung mit dem lokalen MQTT läuft absolut stabil.

Gerade bei den neuen Produkten sieht man, das Zendure auf “die Community” hört und Möglichkeiten einbaut, damit man die Geräte nicht mehr “überlisten” muss.

1 „Gefällt mir“

Darf ich fragen - weshalb MQTT nicht stabil ist ?
Da bekomm ich die Daten einfach gepublished und brauche mich um „nichts zu kümmern“.
Das einzige was ist - nach einem Verbindungsverlust - konnte ich noch nicht provozieren - muss man den MQTT manuell enablen da mein SF2400Pro aktuell noch in der Cloud hängt.

Das Problem entsteht, wenn der mqtt länger weg ist als 60 - 90 Sekunden. Dann verliert die SolarFlow die Verbindung und baut sie nicht mehr auf. Genau aus diesem Grund muss man dann über die App den mqtt neu bestätigen. Mit einem Modul per API entfällt dies. Ich denke aber, das die Problematik nicht sonderlich auffällt, wenn man die Steuerung über die cloud realisiert.

Ich habe die Anbindung über das HA-Modul (Verbindung zenSDK) gemacht, ist problemlos.


Die Regelung für die Ausgangs-/Eingangsleistung entsprechend dem Solarertrag und dem Hausverbrauch erfolgt bei mir über eine Siemens LOGO!8.

1 „Gefällt mir“

Hallo Senior, das wird auch keine Probleme geben. Die zenSDK ist von Zendur und basiert auf der http-API. Bei der zenSDK ist kein mqtt erforderlich, somit kommt es auch zu keinen Problemen. Ich kann auch nicht für alle Zendur Geräte sprechen, nur von der SolarFlow2400Pro.

Ich schaffe es nicht - und mache vermutlich etwas falsch.
Ich habe einen Zendure SF2400Pro mit lokalem MQTT - soweit ok.
Die Daten werden angeliefert.

Nun möchte ich zB. die max. Leistung, also „inverseMaxPower“ verändern.
Meine MQTT - Struktur schaut so im IPS aus:

Dazu habe ich folgendes Script - welches leider nicht funktioniert: (es gibt keine Fehlermeldung - aber es wird auch kein Wert gesetzt)

$mqttServerInstanceID = 52562; //passende MQTT Server Instanz für Zendure
$serialNumber = "EEB4AEP4P1xxxxx"; 
$data = [
    "properties" => [
        "inverseMaxPower" => 600
    ],
    "timestamp" => time()
];
$payload = json_encode($data);
$topic = "iot/A8yh63/number/" .$serialNumber . "/properties/write"; 
#Alternativ versuchte topics
#$topic = "iot/number/" .$serialNumber . "/properties/write"; 
#$topic = "Zendure/A8yh63/number/" .$serialNumber . "/properties/write"; 
#$topic = "Zendure/number/" .$serialNumber . "/properties/write"; 
MQTT_Publish_Custom($mqttServerInstanceID, $topic, $payload);

function MQTT_Publish_Custom($server_id, $topic, $payload, $retain = false) {
    if (!IPS_InstanceExists($server_id)) {
        echo "Fehler: MQTT-Server-ID existiert nicht.";
        return false;
    }

    $module_id = "{01C00ADD-D04E-452E-B66A-D253278743FE}"; // GUID des MQTT Server Devices
    $ident = "TempZendureMQTTDevice";

    // Semaphore nutzen, um Kollisionen bei schnellen Klicks zu verhindern
    if (IPS_SemaphoreEnter($ident, 1000)) {
        // Temporäres Device unter dem Skript suchen oder neu erstellen
        $id = @IPS_GetObjectIDByIdent($ident, $_IPS['SELF']);
        if ($id === false) {
            $id = IPS_CreateInstance($module_id);
            IPS_SetParent($id, $_IPS['SELF']);
            IPS_SetIdent($id, $ident);
            IPS_SetName($id, "Temporäres Zendure MQTT Device");
        }

        // Korrekte Zuweisung an das übergeordnete MQTT-Gateway erzwingen
        $inst_config = IPS_GetInstance($id);
        if ($inst_config["ConnectionID"] != $server_id) {
            @IPS_DisconnectInstance($id);
            IPS_ConnectInstance($id, $server_id);
        }

        // Konfiguration des temporären Devices für dieses spezifische Topic anpassen
        IPS_SetConfiguration($id, json_encode([
            "Topic" => $topic,
            "Retain" => $retain
        ]));
        IPS_ApplyChanges($id);

        // Paket über den nativen Kernbefehl RequestAction absenden
        // Da es sich um ein valides MQTT Device handelt, akzeptiert RequestAction die Payload
        $result = @RequestAction($id, $payload);

        IPS_SemaphoreLeave($ident);
        return $result;
    }
    return false;
}

Hat jemand ein Beispiel mit welchem ein Wert im Zendure mittels MQTT mit lokalem Broker gesetzt wird ?

Ich nutze den Weg, aus diesem Threat oben

Ich hab dies nun nachgebaut - irgendwas läuft anders (falsch) bei mir.

<?php
require('phpMQTT.php');

$debug = FALSE;
$debug = TRUE;

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

$inverseMaxPower = 600;

$serialNumber = "EEB4AEP4P1xxxx";

$topic = 'iot/73bkTV/' . $serialNumber . '/properties/write';
#$topic = 'iot/' . $serialNumber . '/properties/write';
#$topic = 'Zendure/number/' . $serialNumber . '/properties/write';

print_r($topic);
echo("\n\ninverseMaxPower: $inverseMaxPower\n");

$value = '{"properties": { "inverseMaxPower": '.$inverseMaxPower.' }}';

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

$debug = true;               

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

Es wird nicht das bestehende Topic verändert, sondern Neue angelegt.

Evtl. jemand eine Idee?
Wenn ich mittels Curl ans ZenSDK sende dann klappt es - ist aber nicht ganz Sinn der Sache.

Wie genau sendest du mit CURL?

Es wird auch nicht an das topic gesendet, das die Werte anzeigt.

Ich hatte schon unterschiedliche Topics zum Senden versucht - diese sind im Beispielcode oben auskommentiert.
Und so mach ichs mit Curl:

<?php
$SerialNoID = 48550;
$IpAddrID = 57500;

$SelfID = $_IPS['SELF'];
$ParentID = IPS_GetParent($SelfID);
$IpAddr = GetValueString($IpAddrID);

$SerialNo = GetValueString($SerialNoID);
$inverserMaxPower = 700;

$data = [
    "sn" => $SerialNo,
    "properties" => [
        "inverseMaxPower" => $inverserMaxPower
    ]
];

$payload = json_encode($data);
print_r($payload);

Curl_SF2400Pro_Write($ParentID,1,$payload);
return;

function Curl_SF2400Pro_Write($ValueID,$device = 1, $payload) {
    $debug = false;
    #$debug = true;
    switch( $device) {
        case 1:
            $IpAddrID = 57500;
            break;
        default:
            return;
    }

    $IpAddr = GetValueString($IpAddrID);
    $url = "http://$IpAddr/properties/write";

    // cURL initialisieren
    $ch = curl_init($url);

    // Optionen setzen
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

    // Header für JSON festlegen
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($payload)
    ]);

    // Anfrage ausführen
    $response = curl_exec($ch);

    // Fehlerprüfung und Statuscode
    if (curl_errno($ch)) {
        echo "cURL-Fehler: " . curl_error($ch) . "\n";
    } else {
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        echo "\nHTTP-Statuscode: $httpCode\n";
        echo "Antwort: $response\n";
    }

    // cURL schließen
    curl_close($ch);
    echo "Curl_SF2400Pro_Write() / ValueID: $ValueID\n";
}
?>

Hallo,

die Lösung ist ganz einfach:

Unterhalb des zu ändernen Topics einen Sub-Topic mit der Bezeichnung “set” und dem entsprechenden Wert (Integer oder String) senden.

Ich habe mich auch dämlich gesucht, bis ich testweise HomeAssistant aufgesetzt habe und in den MQTT-Server geschaut habe.

Viel Spaß

Hallo @diodator ,
verwendest du das selbst auch ?
Ich hätte das nun so gemacht.
Wie schaut denn im Code dein Topic und dein Payload aus ?
Hast du einen Beispielcode?
Bei mir schaut das jetzt so aus:

$topic = "Zendure/number/$SerialNo/properties/write";

$data = [
    "sn" => $SerialNo,
    "properties" => [
        "inverseMaxPower" => [
            "set" => 794
        ]
    ]
];

Ich habe auch mal kurz im Homeassistant den MQTT aktiviert und den SF2400Pro dort hin senden lassen. Die „set“ Topics hatte ich dort nicht. Welche Apps hast du sonst noch installiert ?