FHEM Forum

FHEM - Energiemanagement und Energieerzeugung => Solaranlagen => Thema gestartet von: Philipp_CGN am 23 März 2025, 14:32:26

Titel: Solis S6 Wechselrichter Daten aus Cloud per MQTT an FHEM weitergeben
Beitrag von: Philipp_CGN am 23 März 2025, 14:32:26
Hallo zusammen,

ich habe einen Solis S6 Wechselrichter mit Cloud-Anbindung über WLAN-Stick. Um die Daten zu Steuerungszwecken in FHEM nutzen zu können, habe ich ein Perlskript geschrieben, welches die Daten alle 5 Minuten aus der SolisCloud per API abruft und über MQTT an FHEM weitergibt. Aktuell werden die aktuelle Leistung (power) und der Gesamtertrag (allEnergy) weitergegeben. Die API beinhaltet noch weitere Werte.

Vorgehen:
1) SolisCloud Zugang einrichten über https://www.soliscloud.com
2) API-Schlüssel beantragen, siehe https://doc.soliscloud.com/en/20.API%20documentation/01.SolisCloud%20Platform%20API%20Document.html
3) API-Schlüssel in Skript (siehe unten) eintragen
4) Falls noch nicht vorhanden in FHEM MQTT-Server anlegen: define m2s MQTT2_SERVER 1883 global
5) Skript auf Server ablegen und ausführen, bei Bedarf $debug auf true setzen
6) In FHEM sind die Werte dann als MQTT Device "solis_wechselrichter" abrufbar
7) Wenn alles funktioniert cron-Eintrag auf Server vornehmen: */5 * * * * /home/pi/SolisStationDataToMQTT.pl

Ggf. hilft dies dem einen oder anderen hier, der neben der Cloudanbindung die Daten auch in FHEM nutzen möchte.

PS: Da ich Perl seit 20 Jahren nicht mehr aktiv nutze, reicht es bei mir nicht, daraus ein FHEM Modul zu erstellen.

#!/usr/bin/perl
use strict;
use JSON;
use MIME::Base64;
use Digest::MD5 qw(md5_base64);
use Digest::HMAC_SHA1;
use DateTime::Format::HTTP;
use LWP::UserAgent;
use HTTP::Request;
use Encode qw(decode encode);
use Data::Dumper;
use Net::MQTT::Simple;

# Solis API settings
my $host = 'https://www.soliscloud.com:13333';
my $key = '<EIGENER API-SCHLÜSSEL>';
my $key_secret = '<EIGENES API-SECRET>';

# MQTT broker settings
my $mqtt_server = 'localhost:1883';
my $mqtt_username = '';
my $mqtt_password = '';
my $mqtt_identifier = 'solis-wechselrichter';
*{Net::MQTT::Simple::_client_identifier} = sub { return $mqtt_identifier; };

# set to true to get debug output
my $debug;

# encrypt request for Solis API
sub hmac_sha1_encrypt {
    my ($text, $key_secret) = @_;
    my $key = encode('UTF-8', $key_secret);
    my $data = encode('UTF-8', $text);
    my $hmac = Digest::HMAC_SHA1->new($key);
    $hmac->add($data);
    return encode_base64($hmac->digest(), '');
}

sub get_gmt_time {
    my $class = 'DateTime::Format::HTTP';
    return $class->format_datetime();
}

# get data from Solis Cloud
my %map = (
    pageNo => 1,
    pageSize => 10
);
my $body = encode_json(\%map);
my $content_md5 = md5_base64($body);
my $date = get_gmt_time();
my $path = '/v1/api/userStationList';
my $param = "POST\n$content_md5\napplication/json\n$date\n$path";
my $sign = hmac_sha1_encrypt($param, $key_secret);
my $url = $host . $path;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(
    POST => $url,
    [
        'Content-type' => 'application/json;charset=UTF-8',
        'Authorization' => "API $key:$sign",
        'Content-MD5' => $content_md5,
        'Date' => $date
    ],
    $body
);
my $response = $ua->request($request);

if ($response->is_success) {
    my $obj = decode_json($response->content);

    if ($debug) {
        print "Response: \n\n";
        print Dumper($obj) . "\n";
        print "power: " . $obj->{data}->{page}->{records}->[0]->{power} . "\n";
        print "allEnergy: " .$obj->{data}->{page}->{records}->[0]->{allEnergy} . "\n";
    }

    # send data to MQTT broker
    my $mqtt = Net::MQTT::Simple->new($mqtt_server);
    if($mqtt_username and $mqtt_password) {
        $mqtt->login($mqtt_username, $mqtt_password);
    }
    $mqtt->publish("power", $obj->{data}->{page}->{records}->[0]->{power} * 1000);
    $mqtt->publish("allEnergy", $obj->{data}->{page}->{records}->[0]->{allEnergy} * 1000);
    $mqtt->disconnect();
} else {
    print "Error: " . $response->status_line, "\n";
}

Titel: Aw: Solis S6 Wechselrichter Daten aus Cloud per MQTT an FHEM weitergeben
Beitrag von: ch.eick am 23 März 2025, 16:37:12
Sehr schön,
Dafür wäre jedoch auch das HTTPMOD Modul verwendbar, dann ist es ohne Umwege als Fhem Device definiert.
Schau es Dir dochmal an.

VG Christian
Titel: Aw: Solis S6 Wechselrichter Daten aus Cloud per MQTT an FHEM weitergeben
Beitrag von: Tobias am 23 Juni 2025, 18:44:57
Ist es nicht einfacher die Daten per modbus RS-485 direkt vom WR zu holen? Dann hätte man diese auch im Sekundentakt...