Solis S6 Wechselrichter Daten aus Cloud per MQTT an FHEM weitergeben

Begonnen von Philipp_CGN, 23 März 2025, 14:32:26

Vorheriges Thema - Nächstes Thema

Philipp_CGN

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";
}


ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick