Microwechselrichter Bosswerk MI 300 und Huayu HY-800 an Fhem anbinden

Begonnen von Decki, 18 Oktober 2021, 21:28:27

Vorheriges Thema - Nächstes Thema

Decki

Hallo zusammen,

ich habe diese 2 Microwechselrichter inzwischen in Betrieb. Ich kann sagen, dass beide baugleich sind (außer dem 2. DC-Anschluss) und die selbe Software installiert haben.
Hierfür kann eine Cloudanwendung konfiguriert werden, was ich aber nicht will.
Optional gibt es in beiden die Option über TCP oder UDP Daten an eine IP Adresse zu senden.

Hat jemand hierfür eine Idee oder selbst schon was entwickelt. Leider gibt es keine weitere Infos von beiden Herstellern.
Raspi 2 im Schaltschrank, USB IR Lesekopf am EHz21, Gaszähler mit Reedkontakt, Jeelink,  16 FS20 Aktoren,  3 Ufos für LED, 11 FS20 Rolladenaktore, AMAD 4.0 mit Sprachausgabe, Esp12 mit EspEasy

schraubi

Die Bosswerk WR's sind vermutlich vom Hersteller Marke DEYE.  ;D
Eventuell findest oder bekommst du über den Original Hersteller mehr Infos zu dem Thema als wie vom Bosswerk.
Die Bosswerks Produkte vermute ich den Artikel: DEYE SUN300G3-EU-230 und DEYE  SUN600G3-EU-230.
Warum ich das vermute? Bosswerk schreibt zwar von deutscher Produktion. Aber das Aussehen und die Cloud zum Einrichten ist China Cloud wie die ganzen anderen Chinesen WRs.
Habe 2 WRs von Bosswerk auch im Einsatz.
Und will die auch noch aus der Cloudlösung raus haben, hatte aber noch nicht die Zeit das Thema anzugehen.


MrLarodos

Hi zusammen,

ich habe meinen "Deye SUN600G3-EU-230" zwar noch nicht in FHEM eingebunden, aber habe gerade kurz ein Script in Python geschrieben, womit ich die aktuellen Daten aus der Weboberfläche auslese, um Sie in einer SQL-DB abzulegen. Das proaktive Senden der Daten an meinen Raspberry Pi vom Wechselrichter habe ich nicht einrichten können. Kam halt nie was auf dem im Deye definierten Port am Raspi an, daher wollte ich damit keine weitere Zeit verschwenden. Und ins Internet werde ich den garantiert nicht lassen ;D

Das Script antwortet dann mit folgenden Daten:
Zitat
watt_now: 518 Watt
watt_today: 1.30 kWh
watt_overall: 1.3 kWh

Hier das Script:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

#Getestet auf einem Deye SUN600G3-EU-230 mit Weboberflächenversion "Web Ver:1.0.24" und Firmware "MW3_15U_5406_1.47"

import requests

url = 'http://192.168.100.22/status.html' #IP / URL vom Wechselrichter im Heimnetz einsetzen
user = 'admin' #Username für das htaccess der Weboberfläche
password = 'admin' #Passwort für das htaccess der Weboberfläche

data = requests.get(url, verify=False, auth=(user, password))

for zeile in data.text.split('\n'):

if 'var webdata_now_p' in zeile:
watt_now=zeile
left_texter = watt_now.find('"', 0, len(watt_now)) + 1
right_texter = watt_now.find('"', left_texter, len(watt_now) )
watt_now=watt_now[left_texter:right_texter]

elif 'var webdata_today_e' in zeile:
watt_today=zeile
left_texter = watt_today.find('"', 0, len(watt_today)) + 1
right_texter = watt_today.find('"', left_texter, len(watt_today) )
watt_today=watt_today[left_texter:right_texter]

elif 'var webdata_total_e' in zeile:
watt_overall=zeile
left_texter = watt_overall.find('"', 0, len(watt_overall)) + 1
right_texter = watt_overall.find('"', left_texter, len(watt_overall) )
watt_overall=watt_overall[left_texter:right_texter]

print("watt_now: "+watt_now+" Watt")
print("watt_today: "+watt_today+" kWh")
print("watt_overall: "+watt_overall+" kWh")


Vielleicht könnt Ihr damit ja was anfangen.

LG "MrSolarodos"  ;)
Mein SmartHome: https://youtu.be/RIro54MMyN4

Raspberry 3B+, RFXtrx433XL, VELUX KLF200, ALLNET Touch Display Tablet, Deye SUN600G3-EU-230 und so weiter :-)

MogRuith

Hallo MrSolarodos,
ich bin seit kurzem stolzer Besitzer eines "Bosswerk mi600". Er läuft noch nicht (muss noch auf den/einen Elektriker warten...), aber bist du inzwischen weiter mit der Einbindung des Wechselrichters in fhem? Wie und wie häufig rufst du das script auf und wie greift fhem dann auf die Daten zu? Könnte man aus deiner Lösung ein fhem-modul basteln (gibt bestimmt vieler Interessenten :) )?

Dank & Gruß

snx

habe den mi600 seit gestern ebenfalls im Einsatz. die App und Chinacloud will und werde ich auch nicht nutzen, daher Versuche ich die Tage den Zugriff auf mein WLAN und Gleichtiger Blockade der China Server einzurichten. die IPS findet man ja auf der Hidden config Seite..
hat schon Mal jemand Versuch die Kommunikation zu Sniffen um evt einen simplen/kompatiblen Endpunkt zu bauen?
die Abfrage übers web-ui ist doch etwas hakelig :-/

MogRuith

Ich habe den Bosswerk MI600 seit gestern am Laufen. Erstmal ins lokale Netzwerk eingebunden, user, password,... geändert, dann den AP deaktiviert. Nachdem hier niemand (...) geantwortet hat, habe ich mir dann folgendes gebastelt:


define Solar HTTPMOD http://user:password@xxx.xxx.xxx.xxx/status.html 300
attr Solar reading01Name current_power
attr Solar reading01Regex var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr Solar reading02Name yield_today
attr Solar reading02Regex var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr Solar reading03Name total_yield
attr Solar reading03Regex var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr Solar stateFormat Aktuelle Leistung: current_power W;; Tagesproduktion: yield_today kWh;; Gesamtproduktion: total_yield kWh
attr Solar room Garten
attr Solar icon sani_solar


RegEx-Freaks können das wahrscheinlich noch eleganter lösen, aber so funktioniert es erstmal. Bis jetzt sollen 2.3 kWh "geerntet" worden sein. Zur grafischen Auswertung müsste dann noch ein log definiert werden...

Schau dir mal den Seitenquellcode von ./status.html an, da lässt sich eine Menge auslesen, wenn man es braucht.

Lieben Gruß
Mog

Hauswart

Müsste man nicht mit HTTPMOD etwas hinbekommen? Kann mir jemand mal den Quelltext der Statusseite zusenden?

Ich bekomme die Tage auch einen Deye WR :)


Edit: :D  während dem Schreiben antwortet MogRuith.
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

snx

ich habe es ebenfalls mit dem HTTPMOD, wie von MogRuith beschreiben, umgesetzt.
@Hauswart: Ich habe dir die status.html mal angehangen

Dabei stören mich allerdings 2 Dinge:

  • Die Statusseite liefert nicht immer Werte, in einigen Fällen (bei mir mind. jeder 3. Aufruf) sind die Daten leer.
  • Außer der aktuellen Wattangabe ist eigentlich nichts zu gebrauchen, selbst die Daily und Total
    kWh-Werte sind fraglich, zumal sie immer identisch sind (auch am 2. Tag)

Daher versuche ich nun die Komunikation zum Server zu nutzen, allerdings ohne viel Erfolg.
Ich möchte meinen Versuch einmal schildern, evt. hat jemand eine Idee:

  • Ich habe einen simplen node-tcp-Server aufgesetzt, der auf Verbindung wartet und die erhaltenen Daten in der Konsole auspuckt
  • Im Web-UI des MI600 habe ich unter "Advanced > Remote Server" meinen Server als Server B eingetragen -> keine Verbindung zu meinem Server
  • Auf der versteckten Config-Seite des MI600 http://<mi600>/config_hide.html habe ich dann die beiden China-Server (Server A Setting + Optional Server Setting) durch meinen lokalen Server ersetzt -> Es wird eine Verbindung aufgebaut
  • Ich habe beide Server ersetzt, da mir beim Packet-Capture via Fritz-Box aufgefallen ist, dass die IP des optionalen Servers versucht wurde anzupingen...
  • Wenn eine Verbindung hergestellt wurde, sendet der MI600 folgende Daten an meinen Server, worin die Firmware-Version und die IP des MI600 neben einige kryptischen Infos zu erkennen sind. Hier einfach mal ein Auszug aus der Konsole. Ich kann mir nich vorstellen, dass sich hier schon Daten hinter verbergen. Gehe eher davon aus, dass es sich um eine Art "Anmeldeversuch" handelt, aber so tief stecke ich nicht in der Materie...
listening: localhost:10000
connected: IPv6|::ffff:192.168.XX.XX|22510 -> ::ffff:192.168.XX.YY|10000
data received: ��►A☺����☻�`☻Y♣<x☺=☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F�u§
data received: ��►A☻����☻�`☻�♣<x☺@☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F��§
data received: ��►A♥����☻a☻�♣<x☺6☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F�↨§
disconnected
connected: IPv6|::ffff:192.168.XX.XX|22511 -> ::ffff:192.168.XX.YY|10000
connected: IPv6|::ffff:192.168.XX.XX|16375 -> ::ffff:192.168.XX.YY|10000
data received: ��►A☺����☻�]☻W♣<x☺;☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F��§
data received: ��►A☻����☻�]☻�♣<x☺=☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F��§
data received: ��►A♥����☻'^☻�♣<x☺;☺MW3_15U_5406_1.47(�n$#8192.168.XX.XX�☺♠T�V1.1.00.0F�1§
disconnected
......

MogRuith

Ich weiß nicht recht, ob das den Aufwand wirklich wert ist. Die Daten, die unter ./status.html stehen, sind ja genau die, die in cloud geladen werden... Ich bin soweit zufrieden, zumal sich die Werte mit Elektrikers Messwerten decken.

Überprüfe mal dein log, ob es vielleicht zu Verbindungsabbrüchen per WLAN kommt (...timeout...). "daily_yield" müsste eigentlich immer wieder bei Null beginnen, "total_yield" stetig hochzählen. Ich lasse alle 5min abfragen und werde ab August auf 10min verlängern. Wenn ich ./status.html... sekündlich abfrage, bekomme ich auch mal eine Seite ohne Werte.

Lieben Gruß

MrLarodos

Hi MogRuith!

Sorry, hatte die Benachrichtigungen ausgeschaltet und habe es im Urlaub nicht mitbekommen, dass es hier weiterging.

Zitat von: MogRuith am 03 Juli 2022, 17:04:01bist du inzwischen weiter mit der Einbindung des Wechselrichters in fhem?

  • Nein, ich habe mich mit der Einbdindung in FHEM nicht weiter beschäftigt, da ich FHEM lediglich als Zwischenhändler zur Ansteuerung von Geräten durch Python benutze. Die zeitliche bzw. vor allem ereignisgetriebene Steuerung habe ich also im Eigenbau in Python und eigener mySQL-DB / Weboberfläche umgesetzt. FHEM ist bei mir also wirklich nur ein Vermittler zu den Geräten.
  • Das Balkonkraftwerk ist dann ein Gerät, von dem ich Informationen (aktuelle Wattzahl etc.) beziehe und damit dann via Python an FHEM den Befehl gebe, bestimmte Geräte zu aktivieren, oder zu deaktivieren.
Zitat von: MogRuith am 03 Juli 2022, 17:04:01Wie und wie häufig rufst du das script auf und wie greift fhem dann auf die Daten zu? Könnte man aus deiner Lösung ein fhem-modul basteln (gibt bestimmt vieler Interessenten?

  • Das Python-Script von oben in (erweiteter Form) lasse ich aktuell alle 5 Minuten über crontab aufrufen.
  • Da die Werte nicht immer zuverlässig in der Status-HTML enthalten sind, lasse ich bei nicht vorhandenen Werten nach 5 Sekunden erneut checken, ob Werte da sind. Wenn nach dem 6. Durchlauf keine Werte als Antwort kamen, wird ausnahmsweise dieser 5-Minuten-Logpunkt übersprungen.
  • Neben der aktuellen Wattangabe speichere ich auch "webdata_total_e" und "webdata_today_e". Mir ist natürlich dann aufgefallen, dass diese meist identisch sind, also kann man den Today-Wert ab Tag 2 vergessen, wenn man den aktuellen Tag wissen möchte. Zusätzlich ist es dazu gekommen, dass der Today-Wert untertägig wieder auf 0 gesetzt wurde.
  • In Summe habe ich dann am Ende ein SQL-Script geschrieben, was ausschließlich auf webdata_total_e basiert, um den Anlagen-Gesamtwert und den von heute* zu ermitteln. *Sinngemäß: "Aktueller Wert (webdata_total_e) minus letzter Wert (webdata_total_e) von gestern = aktueller Wert von heute". So kann ich natürlich auch die Werte für alle vergangenen Tage berechnen, in dem ich lediglich mit den Differenzen von Tag zu Tag arbeite und dann daraus sogar Wochen- oder Monatssummen bilden kann.
  • Zusammen mit einem Preis von 0,29€ pro kWh bei mir und den gespeicherten Watts alle 5 Minuten, habe ich mir die kleine Seite im Intranet abgelegt, die in der Anlage von diesem Forumseintrag zu sehen ist.
LG MrLarodos
Mein SmartHome: https://youtu.be/RIro54MMyN4

Raspberry 3B+, RFXtrx433XL, VELUX KLF200, ALLNET Touch Display Tablet, Deye SUN600G3-EU-230 und so weiter :-)

FHEMbeta

@MrLarodos: Wenn sich der Wert webdata_today_e bei dir nicht täglich auf 0 zurücksetzt, hat dein Deye bzw. dessen Firmware ein Problem. Ich habe auch einen SUN600G3 und der nullt sich zum neuen Tag zuverlässig.

Ich nutze seit 2 Monaten dieses Projekt, um die Werte jede Minute abzufragen: https://github.com/dr-ni/mi600

Das Skript wird via cronjob angesteuert und die Werte dann via GET request an FHEM übertragen. Sporadisch sind die Werte im Deye nicht abrufbar (meines Erachtens ein Bug in der Firmware), spätestens aber dann bei nächsten/übernächsten Abruf wieder verfügbar.

Die Werte werden von FHEM in einer MariaDB gespeichert und via grafana schön visualisiert.

snx

@FHEMbeta:
Das Projetz geht ja den gleichen Weg und fragt die Status.html ab. Kann natürlich sein, dass die Probleme an der Firmware liegt, evt. aber auch an der fehlenden Kommunikation mit China ;)

@MrLarodos:
Ich kann die von dir genannten Probleme komlett bestätigen. Der MI600 verhält sich genau so "unzuverlässig" wie von dir geschildert. Hast du dich jemals über die App registriert und hast deinen Wechselrichter mit der China-Cloud telefonieren lassen? Ich habe noch so die Befürchtung, dass er ohne Kommunikationspartner nicht weiß welcher Tag es ist und in welcher Zeitzone er sich befindet. Da man es auf der Web-UI nicht einstellen kann, woher soll er also auch wissen wann ein Tag zuende ist :-(

@MogRuith:
Die Aufwandsfrage ist natürlich berechtigt ;) Nachdem was ich von der App gesehen habe (in diversen Youtube Videos) werden doch wesentlich mehr Infos in die Cloud gepusht, wie z.B. die aktuelle Leistung jedes angeschlossenen Moduls, was mich durchaus interessiert, da ich die Module unterschidlich ausgerichtet habe.
Ich bin schonmal froh, dass die Werte mit gemessenen nahezu übereinstimmen. Ich werde es die Tage erst mit einem Meßgerät validieren können, habe gerade keins zur Hand.

MrLarodos

@FHEMbeta: Ah, cool! Danke für den Link auf Github. Das schaue ich mir die Tage mal näher an. Klingt ja schwer danach, als wäre es genau das, was MogRuith haben möchte.

Zitat von: FHEMbeta am 19 Juli 2022, 19:52:02...hat dein Deye bzw. dessen Firmware ein Problem
Da bin ich mir absolut sicher :) Die ist in gewohnter China-Qualität umgesetzt worden. Ähnlich wie bei manchen IP-Cams...

@snx: Ja, das liegt wahrscheinlich mit daran, dass meiner nie mit China telen durfte. Er hat keinen Plan, welches Datum oder welche Uhrzeit ist. Insofern kann ich aber mit meiner Vorgehensweise dennoch alles damit ausrechnen, was ich brauche und er bleibt absolut ahnungslos und darf nicht raus ins Netz. Wollte auch kein Update der Firmware (aktuell = MW3_15U_5406_1.47) durchführen, da die UI und Firmware so unterirdisch sind, dass ich die Sorge hatte, dass danach noch das Solarmodul ausfällt. Also kein Risiko eingehen und never ein running system changen :P
Mein SmartHome: https://youtu.be/RIro54MMyN4

Raspberry 3B+, RFXtrx433XL, VELUX KLF200, ALLNET Touch Display Tablet, Deye SUN600G3-EU-230 und so weiter :-)

snx

Zitat von: MrLarodos am 19 Juli 2022, 20:54:30
Wollte auch kein Update der Firmware (aktuell = MW3_15U_5406_1.47) durchführen, da die UI und Firmware so unterirdisch sind, dass ich die Sorge hatte, dass danach noch das Solarmodul ausfällt.
Genau mein Gedanke, ich speichere auch jede Nacht einmal den Gesamtverbrauch und ermittel damit auch kurz den Tageswert ;) Umständlich, aber wie du schon sagst, sicher ist sicher :p

FHEMbeta

Es kann schon gut sein, dass der Wechselrichter aufgrund von nicht vorhandenem NTP Server das aktuelle Datum nicht kennt und somit den Tageswert nicht zurücksetzt. Vermutlich wird das nicht automatisch über die Netzwerkkonfiguration gezogen.

Ich finde die Firmware auch sehr schlecht umgesetzt. Man kann unter anderem den Modus Access Point nicht abstellen (auch nicht über das Hidden Menu), WLAN Passwort nicht ändern und so weiter.

Dennoch habe ich aktuell die Anbindung an die Deye Cloud aktiv. Dort sieht man noch viele weitere Werte wie Spannung, Strom der einzelnen Moduleingänge. Was soll der Chinese groß mit meinen PV Daten machen? Angst, dass er die Anlage via Remote abschaltet habe ich aktuell nicht. Falls sich die Situation mit China zuspitzt, kann ich die Kommunikation noch immer unterbinden. Aber das betrifft doch auch gleichermaßen unter anderem die Saugroboter.

MrLarodos

Du hast sicherlich recht damit, dass es wahrscheinlich unkritisch ist. Aber für mich ist das einfach eine Prinzipsache, dass ich die Option habe will, alles lokal zu machen. Vor allem, wenn es nicht nötig ist, das über das Internet zu betreiben. Sowas müsste bei der Einrichtung abgefragt werden. Da das nicht passiert, erzwinge ich diese Option. Alleine schon ziemlich frech, dass in der Cloud mehr Werte als lokal zu sehen sind. Künstliche Erzeugung von Cloud-Mehrwerten, die keine sind. Echt krank  >:(
Mein SmartHome: https://youtu.be/RIro54MMyN4

Raspberry 3B+, RFXtrx433XL, VELUX KLF200, ALLNET Touch Display Tablet, Deye SUN600G3-EU-230 und so weiter :-)

FHEMbeta

Mir ist es wichtiger, dass solche Geräte sich nicht in meinem Haupt-LAN befinden, sondern über ein separates VLAN ohne Zugriff separiert sind. Und selbstverständlich ist ein Gerät ohne Cloud-Zwang besser als eins mit. Wenn ich an die weiteren Werte lokal herankäme (u.a. wäre so eine Degredation der einzelnen Module analysierbar), würde ich die Cloud definitiv abschalten.

Ich denke bei den meisten 08/15 Usern kommt die Einfachheit der Konfiguration mit ausreichender Auswertung gut an. Die wollen und können nichts selber machen. Die meisten haben nicht Mal einen (virtuellen) Server zu Hause.

Hauswart

Läuft nun auch bei mir. Wie wertet ihr Netzbezug/Eigenverbrauch/etc. aus?

Habe einen Tasmota Stromzähler in FHEM und eben den Bosswerk angebunden.


Nachtrag: Habe nur einen Einphasenzähler verbaut... :(
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

snx

Ich habe meine Devices (Wechselrichter und Stromzähler) in FHEM mit eigenen Readings erweitert. Diese befüllen ich per UserReading oder DOIFs. Inhaltlich bilde ich damit die Zählerstände zu Tagesbeginn (als Rechengrundlage) und Tagesende (fürs Tageswerte im Log), sowie die aktuellen Verbrauchswerte (Produktion + Konsum - Einspeisung) ab. Zudem noch 2-3 Readings um die Daten auch bei der instabilen Erreichbarkeit des MI600 trotzdem immer im Blick zu haben.

Damit ich nicht all zu viel Datenmüll erzeuge und trotzdem was zum Auswerten habe, lese ich beide Devices alle 5 Minuten aus. Wenn du etwas genauer wissen möchtest geb einfach Bescheid ;)

Hauswart

Zitat von: snx am 04 August 2022, 17:36:20
Ich habe meine Devices (Wechselrichter und Stromzähler) in FHEM mit eigenen Readings erweitert. Diese befüllen ich per UserReading oder DOIFs. Inhaltlich bilde ich damit die Zählerstände zu Tagesbeginn (als Rechengrundlage) und Tagesende (fürs Tageswerte im Log), sowie die aktuellen Verbrauchswerte (Produktion + Konsum - Einspeisung) ab. Zudem noch 2-3 Readings um die Daten auch bei der instabilen Erreichbarkeit des MI600 trotzdem immer im Blick zu haben.

Damit ich nicht all zu viel Datenmüll erzeuge und trotzdem was zum Auswerten habe, lese ich beide Devices alle 5 Minuten aus. Wenn du etwas genauer wissen möchtest geb einfach Bescheid ;)

Da möchte ich (viel) mehr Wissen :)


Ich habe nun aber auch noch ein anderes Problem: Ich habe Benutzer + Passwort geändert, da ich den AP nicht abschalten konnte. Nur komme ich nun weder mit den neuen noch mit admin/admin auf die Seite drauf, jemand eine Idee wie man das zurücksetzen kann?


1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

muc46

Danke für den Chat, der mir sehr geholfen hat den Deye SUN600G3-EU-230 Wechselrichter in Betrieb zu nehmen. Der Hersteller bietet zusammen mit der App Solarman den Zugriff auf den Wechselrichter an. Bin nicht begeistert, dass in der App der Standort erfasst wird und dann in dem Wechselrichter noch das WLAN Passwort, um die Daten auf den Server zu übermitteln. Um die Kommunikation des Wechselrichters von meinem Netz zu trennen werde ich die Daten über den AP des Wechselrichters abrufen und in FHEM visualisieren. Dazu möchte ich vor dem Abrufen das WLAN meines RPis mit dem AP verbinden, die Daten abrufen und dann wieder die WLAN Verbindung trennen. Damit braucht der Wechselrichter keinen Zugang zu meinem privaten Netz.

Hat jemand Erfahrung, wie ich aus FHEM heraus eine spezifische WLAN Verbindung aufbauen und schließen kann?

Vielen Dank :)

snx

@Hauswart:
Was genau möchtest du wissen?
Bzgl. deines Problems: Ich hatte auch Probleme die Einstellungen zu ändern, er hat von einem Feld die Einsatellung übernommenund von anderen nicht, daher könnte es bei dir auch sein, dass du nun eine Kombi aus admin/<dein-pw> oder <dein-user>/admin hast ?!

@muc46:
Ich denke es ist zu aufwändig den Weg zugehen, erst recht wenn der AP so instabil ist wie bei meinem.
Ich nutze die App ebenfalls gar nicht, der Wechselrichter hängt in meinem WLAN ohne Internetzugriff. Hier kurz meine Schritte der Umsetzung:

  • Zugang für neue Geräte ins Internet blockieren (z.B. bei meiner FritzBox im Profil Standard Internetzugriff verbieten)
  • Anmelden am AP des Wechselrichters und Benutzer/Passwort ändern und deine WLAN Daten eintragen (Ich musste schön ein Feld nach dem anderen ändern, sonst gingen Infos verloren :-/)
  • Im Router den Internet-Zuggriff für den jetzt bekannten Wechselrichter sperren, den Rest wieder freigeben
  • In FHEM via HTTP-Modul die Daten vom Wechselrichter holen (weiter oben beschrieben)
Wenn du auf Nummer sicher gehen möchtest, dass der Wechselrichter selbst bei Internetzugriff nicht nach Hause telefoniert kannst du auch der "versteckten" Seite des Wechselrichters (http://<its-ip>/config_hide.html) auch noch die Server rauslöschen oder abändern. So hatte ich die Kommunikationsversuche auf meinen Endpunkt umgeleitet um zu sehen ob man damit was anfangen kann, was aber zu keinem Ergebnis geführt hat (steht auch weiter oben).

Hauswart

Zitat von: snx am 05 August 2022, 12:22:22
@Hauswart:
Was genau möchtest du wissen?
Bzgl. deines Problems: Ich hatte auch Probleme die Einstellungen zu ändern, er hat von einem Feld die Einsatellung übernommenund von anderen nicht, daher könnte es bei dir auch sein, dass du nun eine Kombi aus admin/<dein-pw> oder <dein-user>/admin hast ?!
Zeige doch mal deine UserReadings und DOIFs, dann muss ich es nicht neu erfinden.

Habe schon einige Kombinationen ausprobiert, aber leider scheinbar noch nicht die richtige gefunden... sehr ärgerlich.... kannst du nen Screenshot von der Seite nochmal reinstellen wo man Benutzername & Passwort ändern kann?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

snx

Zitat von: Hauswart am 05 August 2022, 12:48:15
Zeige doch mal deine UserReadings und DOIFs, dann muss ich es nicht neu erfinden.
ok, du hast es so gewollt...:p

Mein Stromzähler
define powermeter OBIS /dev/serial/by-id/usb-Silicon_Labs_CP2102.....@9600,8,N,1 SML
liefert die folgenden selbstsprechenden Readings:

  • power
  • power_L1
  • power_L2
  • power_L3
  • total_consumption
  • total_feed

Der Sensor liefert zwar jede Sekunde aktuelle Werte, ich habe mich FHEM-seitig für ein Interval von 5 Minuten entschieden (dies gilt für den Wechselrichter genauso). Beim Stromzähler erreiche ich das über:
attr powermeter pollingMode on
attr powermeter interval 300


Per Attribut userReadings erzeuge ich zudem weitere Readings, wo die PV-Werte (Device httpSolar) mit betrachtet werden:
power_combined:power.* {
  ## add solar power to main power (positiv or negative)
  ReadingsVal("httpSolar","current_power-1",0) +
  ReadingsVal($name,"power",0)
},
power_L3_combined:power_L3.* {
  ## add solar power to main power (positiv or negative)
  ReadingsVal("httpSolar","current_power-1",0) +
  ReadingsVal($name,"power_L3",0)
},
day_consume:day_(feed|consumption).* {
  ## calculate total consume (including produced solar power) on consumption or feed change
  (ReadingsVal("httpSolar","day_yield",0)*1000) +
  ReadingsVal($name,"day_consumption",0) -
  ReadingsVal($name,"day_feed",0)
}


Das letzte UserReading geht auf noch unbekannte day_* Readings. Diese erzeuge ich per DOIF, da der Trigger nicht das Device ist, ich mehrere Readings in einem befülle, oder ich einfach erst später über die Möglichkeit mit UserReadings gestoßen bin :D.

Zunächst initialisiere ich täglich ein paar Tageswerte (Verbrauch, Einspeisung, Max-Leistung), sowie für die Berechnung notwendige Tagesstartwerte (Gesamtverbrauch, Gesamteinspeisung)
([00:01])
  ## initialize daily Power consumption and feed values..
  (setreading powermeter day_start_total_consumption [powermeter:total_consumption],
    setreading powermeter day_start_total_feed [powermeter:total_feed],
    setreading powermeter day_consumption 0,
    setreading powermeter day_feed 0,
    setreading powermeter day_max_power 0)


Diese Tageswerte update ich dann mit 3 weiteren DOIFs:
([powermeter:power])
  ## update daily max power value if current is higher..
  (IF ([powermeter:day_max_power] < [powermeter:power])
    (setreading powermeter day_max_power [powermeter:power]))

([powermeter:total_feed])
  ## update daily feed value by calculation..
  {
    my $v = [powermeter:total_feed] - [powermeter:day_start_total_feed];
    $v = round($v,1);
    if ($v > [powermeter:day_feed]){
      fhem("setreading powermeter day_feed ${v}");
    }
  }

([powermeter:total_consumption])
  ## update daily consumption value by calculation..
  {
    my $v = [powermeter:total_consumption] - [powermeter:day_start_total_consumption];
    $v = round($v,1);
    if ($v > [powermeter:day_consumption]){
      fhem("setreading powermeter day_consumption ${v}");
    }
  }


Diese Tageswerte schreibe ich am Tagesende dann wiederum in weitere day_end_* Readings, die dann fürs die Tages-Logs herangezogen werden
([23:59])
  ## set day end values..
  (setreading powermeter day_end_consume [powermeter:day_consume],
    setreading powermeter day_end_consumption [powermeter:day_consumption],
    setreading powermeter day_end_feed [powermeter:day_feed],
    setreading powermeter day_end_max_power [powermeter:day_max_power])


Damit das Log übersichtlich bleibt und nur die wichtigen Daten gelogt werden, sind die Events per Attribut event-on-change-reading eingeschränkt:
(power.*|total_consumption|total_feed|day_consumption|day_feed|day_consume|day_end_.*)

Beim Wechselrichter
define httpSolar HTTPMOD http://<user>:<pw>@<ip/hostname>/status.html 300
sieht es ähnlich aus. Die per Modul ausgelesenen Readings sind:

  • current_power-1
  • total_yield-1
  • yield_today-1

Mit dem yield_today-1 kann ich nichts anfangen, da es identisch zum total_yield-1 ist. Vermutlich weil mein Wechselrichter nicht nach Hause telefonieren darf und daher keine Information über Standort bzw. Zeitzone hat.

Demnach ermittel ich den Ertrag am Tag (und die max. Leistung am Tag) wiederum über diverse Readings per DOIFs.
Initialisierung:
([00:01])
  ## initialize daily Solar yield values..
  (setreading httpSolar day_start_total_yield [httpSolar:actual_total_yield],
    setreading httpSolar day_yield 0,
    setreading httpSolar day_max_power 0)

Update:
([httpSolar:total_yield-1])
  ## save total yield (cause it sometimes gives 0)
  ## and update daily yield value by calculation..
  {
    if ([httpSolar:total_yield-1] > 0){
      fhem("setreading httpSolar actual_total_yield [httpSolar:total_yield-1]");
      my $v = [httpSolar:total_yield-1] - [httpSolar:day_start_total_yield];
      $v = round($v,1);
      if ($v > [httpSolar:day_yield]){
        fhem("setreading httpSolar day_yield ${v}");
      }
    }
  }

([httpSolar:current_power-1])
  ## update daily max power value if current is higher..
  (IF ([httpSolar:day_max_power] < [httpSolar:current_power-1])
    (setreading httpSolar day_max_power [httpSolar:current_power-1]))

Tages-Endwerte:
([23:59])
  ## set day end values..
  (setreading httpSolar day_end_yield [httpSolar:day_yield], setreading httpSolar day_end_max_power [httpSolar:day_max_power])


Da der Wechselrichter nicht immer zuverlässig den aktuellen Wert im Web-Interface ausspuckt, ist der Update-Code etwas komplexer und ich speichere zusätzlich den aktuellen Wert in einem zusätzlichen Reading (actual_total_yield), da ich sonst u.U. 5 Minuten lang 0W angezeigt bekommen, was völlig falsch ist.

Abschließend sei noch erwähnt, dass ich das Setup im Nachhinein evt. etwas anders aufbauen würde. Bei einigen "meiner" Readings war ich mir unschlüssig ob an den Zähler oder eher an den Wechselrichter. Hatte schonmal überlegt alles selbstdefinierte und berechnete an ein oder zwei Dummies zu hängen, statt den Misch aus Modul- und Custom-Readings zu betreiben....

So, ich hoffe ich habe nichts wichtiges vergessen. Entschuldige bitte, dass ich nicht die kompletten Befehle hierein haue, das liegt einfach daran, dass ich alles über die Oberfläche mache und nicht in der riesen config-Datei rumspringe... und die Befehle zum posten zusammenzuschreiben ist mir zu aufwändig ;)

snx

Zitat von: Hauswart am 05 August 2022, 12:48:15
kannst du nen Screenshot von der Seite nochmal reinstellen wo man Benutzername & Passwort ändern kann?

weiß zwar nicht wofür, aber ja ;)

Hauswart

Danke für deine Mühe, aber Dreh- und Angelpunkt bei mir ist, dass mein Stromzähler leider kein "total_feed" liefert. Daher muss ich mir überlegen, wie ich diesen Anhaltsmässig mir ermittle.

Mein Zähler gibt zwar Minuswerte bei Einspeisung "power" aus, jedoch speichert er es nicht, daher muss ich irgendwie über die Differenz und dem Timestamp mir die Einspeisung berechnen. Natürlich ist dies auch nur eine Annäherung, da ich nur jede Minute Daten vom Stromzähler auslese, aber besser wie nichts...
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Hauswart

Zitat von: snx am 05 August 2022, 17:03:37
weiß zwar nicht wofür, aber ja ;)

Danke dir!!! ICh komme wieder drauf, er speichert nur 15-Stellen vom Passwort und ich hatte 20 :) Daher war dein Screen Gold wert.
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

snx

Zitat von: Hauswart am 05 August 2022, 17:05:05
Danke für deine Mühe, aber Dreh- und Angelpunkt bei mir ist, dass mein Stromzähler leider kein "total_feed" liefert.

Ich würd den Timestamp außen vor lassen, wenn du ja minütlich ausliest, würde ich das auf eine Minute hochrechnen und damit ein Custom Reading aufsummieren....

MogRuith

Hallo beisammen, hier meine aktuelle Lösung, die seit Anfang des Monats gut läuft:

define ga_sol HTTPMOD http://name:pass@xxx.xxx.xxx.xxx/status.html 60
attr ga_sol reading01Name current_output
attr ga_sol reading01Regex var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr ga_sol reading02Name output_today
attr ga_sol reading02Regex var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr ga_sol reading03Name output_total
attr ga_sol reading03Regex var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"
attr ga_sol room Garten
attr ga_sol icon sani_solar
attr ga_sol stateFormat Aktuelle Leistung: current_output-1 W;; Tagesertrag: output_today-1 kWh;; Monatsertrag: output_month kWh;; Jahresertrag: output_year kWh;; Gesamtertrag: output_total-1 kWh
attr ga_sol userReadings output_month:output_today-1.* monotonic {ReadingsNum("ga_sol","output_today-1",0,2)}, output_year:output_today-1.* monotonic {ReadingsNum("ga_sol","output_today-1",0,2)}

define FileLog_ga_sol FileLog /opt/fhem/log/ga_sol_%Y.log ga_sol:(current_output-1).*
attr FileLog_ga_sol logtype text
attr FileLog_ga_sol room Logs

define SVG_FileLog_ga_sol_1 SVG FileLog_ga_sol:SVG_FileLog_ga_sol_1:CURRENT
attr SVG_FileLog_ga_sol_1 room Garten

define ga_sol_auto DOIF ([Tageslicht:twilight] >= 75)\
  (set ga_sol start) (set ga_sol reread)\
DOELSEIF \
([Tageslicht:twilight] <65) \
  (set ga_sol stop)
attr ga_sol_auto group Automatiken
attr ga_sol_auto room Garten

define ga_sol_output_month_reset at *00:00:01 {if ( $mday == 1 ) { fhem("deletereading ga_sol output_month") } }
attr ga_sol_output_month_reset room Garten

define ga_sol_output_year_reset at *00:00:01 {if ( $yday == 1 ) { fhem("deletereading ga_sol output_year") }}
attr ga_sol_output_year_reset room Garten


Sahnehäubchen wäre natürlich das Auslesen des Stromzählers, aber das wird wohl ein Projekt für Regentage. Bin schon gespannt, ob der ISKRA OBIS "spricht".

Besten Dank euch für die tollen Anregungen!!!

Gruß

snx

Zitat von: MogRuith am 06 August 2022, 13:07:17
Bin schon gespannt, ob der ISKRA OBIS "spricht".

Meiner ist auch ein ISKRA, ein MT175.... spricht SML was OBIS versteht ;)

MogRuith

Hier wurde ein MT681 verbaut. Wie hast du das technisch umgesetzt...einen RasPi im/neben den Sicherungskasten verbaut und dann ins lokale Netzwerk?

snx

Ich habe meinen Technikschrank mit Router, NAS, Raspi usw. zum Glück direkt neben dem Sicherungskasten. Habe mir dann diesen Lesekopf mit USB geholt. Das USB Kabel ist recht lang, wobei ich noch ein USB Verlängerungskabel brauchte. Musste wirklich nichts machen, außer das OBIS-Modul in FHEM einrichten (dazu nur kurz die Device-ID per Console auslesen) und den Kopf genau über die Schnittstelle packen.

MogRuith

Guten Abend, es gibt inzwischen sogar einen Lesekopf mit WLAN und Tasmota-firmware, kompatibel mit dem MT681. Wohl oder übel muss ich dann aber die Stahltür von der Unterverteilung aushängen... Wie schon geschrieben...ein Projekt für den Herbst. Dann komme ich wieder auf dich zurück...;o)

Gruß

MogRuith

Seit einer Woche wird kräftig "geerntet" Ich habe das Problem der Zeitschaltung und Erreichbarkeit jetzt erstmal so gelöst:

define Solar_LAN PRESENCE lan-ping 192.168.178.40 60
attr Solar_LAN room Garten

define ga_sol_auto DOIF ([Solar_LAN] eq "present") (set ga_sol reread)
attr ga_sol_auto do always
attr ga_sol_auto group Automatiken
attr ga_sol_auto room Garten


Der Bosswerk wird minütlich angepingt und abgefragt.
Gruß

Hauswart

FYI:

Ich teste gerade die Solarman API:
defmod Solarman HTTPMOD https://api.solarmanpv.com/device/v1.0/currentData?language=en 60
attr Solarman extractAllJSON 1
attr Solarman requestData { "deviceSn": "[SN]", "deviceId": [ID]}
attr Solarman requestHeader1 Content-Type: application/json
attr Solarman requestHeader2 Accept: */*
attr Solarman requestHeader3 Authorization: bearer [TOKEN]
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

MogRuith

Danke!!! Ich scheue noch die Registrierung/Nutzung der Solarman-app, zumal der Direktzugriff soweit ganz gut läuft.
Allerdings habe ich aktuell ein eher "kosmetisches" Problem...obwohl output_today für heute 2.30 ausgibt, macht

output_month:output_today.* monotonic {ReadingsNum("ga_sol","output_today",0,2)}

daraus 26.3000000000001 für den Monat. Ich dachte eigentlich, ReadingsNum könne selber runden...?! Wie runde ich auf zwei Nachkommastellen? Wo ist der Fehler? Oder sollte ich lieber im stateformat runden (das klappt auch nicht recht... setmagic...:d2...sprintf...)?!

Lieben Dank & Gruß

Harst


MogRuith

@Harst: Welche Vorteile hätte das?
fyi....runden..."[ga_sol:output_month:r1]" rundet den Monatsertrag auf eine Nachkommastelle...

Gruß

Harst

Zitat von: MogRuith am 18 August 2022, 19:12:53
@Harst: Welche Vorteile hätte das?

Man könnte die Kommunikation empfangen (Server eintragen) und die Daten extrahieren.

Gruß

Horst

MogRuith

Interessant wäre ja das Auslesen der Daten der einzelnen Eingänge, bevor sie irgendwohin geladen werden...

uli-bs

Da bei mir nun auch ein Huayu werkelt, interessiere ich mich auch für die Einbindung in FHEM.
Wie es scheint, benutzen viele der gelabelten WR intern Boards von Deye, sodass recht viele Anwender davon profitieren könnten.
Es scheint für "Home Assistent" wohl bereits ein funktionierendes Plugin zu geben, was die Daten, die normal in die Cloud zu "SolarMan" gehen, direkt aus dem WR auslesen kann, wie ich finde, ein interessanter Ansatz.
Vielleicht kann sich jemand mit entsprechender Programmiererfahrung ansehen, ob und wie das ggf. an FHEM anpassbar ist, ich bin da leider raus...
Link zum Projekt: https://github.com/StephanJoubert/home_assistant_solarman
einige Grundlagen zum Protokoll: https://pysolarmanv5.readthedocs.io/en/latest/solarmanv5_protocol.html



opfl

Hi,

bei mir klappt der Login mit curl auf die status.html nicht wegen falschem Login. Habe die Login-Daten von dem Solarman-Portal verwendet. Was mache ich da falsch?

Grüße
Oli

Olly

Zitat von: opfl am 11 Oktober 2022, 17:25:34
Hi,

bei mir klappt der Login mit curl auf die status.html nicht wegen falschem Login. Habe die Login-Daten von dem Solarman-Portal verwendet. Was mache ich da falsch?

Grüße
Oli
Hi,

hast du mal versucht das mit den Daten im Browser zu öffnen? Wenn das nicht geht stimmen die Daten nicht.
Ich hab keine Ahnung von Solarman (Nutze ich nicht) und ob da die gleichen Daten wie in der Web-Oberfläche genutz werden. Default-Anmeldung im Web ist admin/admin wenn du es nicht geändert hast.

Gruß

     Olly
BananaPi 1GB;NetCSM 868MHz, miniCUL 433MHz, LaCrosseGateway, 2x SignalESP; FHEM 6.2

Hauswart

Seit dem neuesnten HTTPMOD Update folgendermassen bei mir im Einsatz:
defmod Solar HTTPMOD http://[USER]:[PASS]@[IP]/status.html 60
attr Solar icon sani_solar
attr Solar reading01Name current_power-1
attr Solar reading01Regex (?^:var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";;)
attr Solar reading02Name yield_today-1
attr Solar reading02Regex (?^:var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";;)
attr Solar reading03IgnoreExpr $val < $oldVal
attr Solar reading03Name total_yield-1
attr Solar reading03Regex (?^:var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";;)
attr Solar stateFormat Aktuelle Leistung: current_power-1 W;;\
Tagesertrag: yield_today-1 kWh;;\
Gesamtertrag: total_yield-1 kWh
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Dr. Ulfi

Ich werde das mal testen, wenn die Sonne wieder scheint  :D
Gibt es einen Unterschied zu den readings von MogRuit.
Diese habe ich bisher verwendet.  (Vielen Dank noch mal.)

Gerne würde ich auch den RSSI Wert aus der status.html übernehmen, aber hiermit hat es nicht geklappt:
attr ga_sol reading04Name output_rssi
attr ga_sol reading04Regex var cover_sta_rssi = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?"


liegt vermutlich am "%" Zeichen, das als Einheit mit angegeben ist.
Zitatvar cover_sta_rssi = "21%";
Raspi
CUBE/CUNO a-culfw, Signalduino 433Mhz, Sonoff/Tasmota, EnOceanPI, Meross Smart Plug (IFTTT), ESP8266 Projekte,
MAX!-Heizungssteuerung, Intertechno IT-1500-Steckdosen, Velux KLF200 mit Somfy io

Hauswart

Zitat von: Dr. Ulfi am 17 Oktober 2022, 20:09:05
Ich werde das mal testen, wenn die Sonne wieder scheint  :D
Gibt es einen Unterschied zu den readings von MogRuit.
Diese habe ich bisher verwendet.  (Vielen Dank noch mal.)
Der Unterschied ist das manchmal 0 ausgegeben wird und hier wird verhindert das total_yield-1 kleiner sein kann als der vorherige Wert.

Probiere mal:
var cover_sta_rssi = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?%"
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

FFHEM

Hallo Hauswart,

da ich ebenfalls soeben meinen kleinen Sofar-WR mit Deinen Angaben einrichten konnte -> vielen Dank!
Und der RSSI-Wert, bei dem ich wie Dr. Ulfi ein Problem hatte, funktioniert ebenfalls.
Das Reading hat allerdings plötzlich den Namen "rssi-1" bekommen hat, statt "rssi".
Das hat bestimmt einen besonderen Grund, ist aber nicht schlimm.
Danke nochmals!
Gruß,
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

FFHEM

Da mein WR von SOFAR wohl den gleichen internen Webserver wie Bosswerk MI 300 usw. haben, eine Frage an deren Besitzer:

Mir ist ein Fehler bei der Ausgabe der täglichen Energie aufgefallen. Kurz: die Chinesen vergessen manchmal die 1. Null hinter dem Komma bei den Nachkommastellen.
Das macht sich in einer zackigen Energiekurve bemerkbar, dadurch ist es mir überhaupt aufgefallen.
Die Werte werden auf dem Webserver täglich in der folgenden Reihenfolge übertragen:
Alle Angaben in kWh, Schrittweite ist 0,01 kWh

0.1         tatsächlich aber sind es 0.01
0.2         tatsächlich aber sind es 0.02
0.3...0.9 tatsächlich aber sind es 0.03..0.09

0.10       dieser Wert stimmt
0.11       dieser ebenfalls, bis wieder die nächste ganze Kilowattstunde begonnen wird.

Und dann geht das Spiel wieder los:
1.1         tatsächlich aber sind es 1.01
1.2         tatsächlich aber sind es 1.02

Könnt Ihr Ähnliches bei Euren WR beobachten? Habe bei SOFAR schon um ein Firmwareupdate gebeten, aber es ist nicht ersichtlich, ob es bereits eins gibt, etc. pp.
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Hauswart

Zitat von: FFHEM am 12 November 2022, 15:03:53
Hallo Hauswart,

da ich ebenfalls soeben meinen kleinen Sofar-WR mit Deinen Angaben einrichten konnte -> vielen Dank!
Und der RSSI-Wert, bei dem ich wie Dr. Ulfi ein Problem hatte, funktioniert ebenfalls.
Das Reading hat allerdings plötzlich den Namen "rssi-1" bekommen hat, statt "rssi".
Das hat bestimmt einen besonderen Grund, ist aber nicht schlimm.
Danke nochmals!
Gruß,
Friedhelm

Probiere mal:
(?^:var cover_sta_rssi = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?%";)



1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

FFHEM

Hallo Hauswart,
Dein Regex liefert leider auch rssi-1. Das stört mich aber weniger, das brauchen wir nicht weiter zu verfolgen, dennoch vielen Dank!
Vielmehr stört mich die falsche Energieangabe meines WR:
Bei jeder ganzzahligen kWh-Angabe werden die Nachkommstellen falsch angegeben, kommt so vom WR.

Beispiel:
yield_today: 0.96  richtig
yield_today: 0.97  richtig
yield_today: 0.99  richtig

Dann Wechsel zu 1 Nachkommastelle:
yield_today: 1.0   falsch, richtig: 1.00
yield_today: 1.2   falsch, richtig: 1.02
yield_today: 1.3   falsch, richtig: 1.03
yield_today: 1.5   falsch, richtig: 1.05
yield_today: 1.6   falsch, richtig: 1.06
yield_today: 1.8   falsch, richtig: 1.08
yield_today: 1.9   falsch, richtig: 1.09

yield_today: 1.11  richtig 
yield_today: 1.12  richtig
yield_today: 1.13  richtig


Kurz: die Nachkommawerte sind als 10-Wh-Werte zu berechnen, egal was hinter dem Komma kommt!  (0.1 bedeutet demnach:  1 x 10 Wh),  0.10 bedeutet 10 x 10 Wh).

Meine Überlegung ist jetzt, mache ich das eher mit einem Userreading, oder lässt sich das noch in das Regex einbringen?
Ich tendiere zu einem Userreading, da sonst das Regex noch unübersichtlicher wird!?

Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Hauswart

#50
Zitat von: FFHEM am 16 November 2022, 10:12:07
Hallo Hauswart,
Dein Regex liefert leider auch rssi-1. Das stört mich aber weniger, das brauchen wir nicht weiter zu verfolgen, dennoch vielen Dank!
Vielmehr stört mich die falsche Energieangabe meines WR:
Bei jeder ganzzahligen kWh-Angabe werden die Nachkommstellen falsch angegeben, kommt so vom WR.

Beispiel:
yield_today: 0.96  richtig
yield_today: 0.97  richtig
yield_today: 0.99  richtig

Dann Wechsel zu 1 Nachkommastelle:
yield_today: 1.0   falsch, richtig: 1.00
yield_today: 1.2   falsch, richtig: 1.02
yield_today: 1.3   falsch, richtig: 1.03
yield_today: 1.5   falsch, richtig: 1.05
yield_today: 1.6   falsch, richtig: 1.06
yield_today: 1.8   falsch, richtig: 1.08
yield_today: 1.9   falsch, richtig: 1.09

yield_today: 1.11  richtig 
yield_today: 1.12  richtig
yield_today: 1.13  richtig


Kurz: die Nachkommawerte sind als 10-Wh-Werte zu berechnen, egal was hinter dem Komma kommt!  (0.1 bedeutet demnach:  1 x 10 Wh),  0.10 bedeutet 10 x 10 Wh).

Meine Überlegung ist jetzt, mache ich das eher mit einem Userreading, oder lässt sich das noch in das Regex einbringen?
Ich tendiere zu einem Userreading, da sonst das Regex noch unübersichtlicher wird!?



Ist mir bisher noch nicht aufgefallen, muss ich bei mir mal prüfen. Tendiere aber spontan zum Regex korrigieren.


Edit: Bei mir liefert derzeit z.B.
var webdata_today_e = "0.80"; var webdata_total_e = "123.4";
Gibt deiner wirklich 2-stellige Kommazahlen zurück? Kannst du mir mal den Quelltext der Statusseite schicken?
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

FFHEM

Deine 0.80 kWh werden stimmen, falsch ist es immer, wenn er 0.8 zeigt, das sind 0.08 kWh tatsächlich.
Die nächste Beobachtung kannst Du beim Überschreiten von 1.0 bzw. 2.0 usw. beobachten - oder auch nicht, wenn ein WR in Ordnung ist.
Die Gesamt-kWh werden bei mir aufgrunddessen viel zu hoch, zumal bei mir im WR noch anscheinend eine Rundungsfunktion auf ganze kWh enthalten ist.
Dadurch habe ich total angeblich 35 kWh, tatsächlich sind es aber nur 23 kWh.

Für die Regexänderung müsste man "nur" bei der Nachkommastelle eine "0" voranstellen, falls diese 1-stellig ist.

Meine Statusseite:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
.in_body
{
margin-top:0px;
margin-left:0px;
margin-right:0px;
margin-bottom:0px;
background-color:transparent;
}
.div_c
{
margin-left:50px;
margin-right:50px;
margin-top:50px;
margin-bottom:50px;
}
.cu
{
cursor:pointer;
}
.b
{
font-weight:bold;
}
.lab_5
{
font-size:16px;
color:#666666;
margin-left:-20px;
}
.lab_l2
{
float:left;
width:32%;
color:#666666;
margin-bottom:-2px;
font-size:14px;
}
.lab_r2
{
float:left;
width:68%;
color:#666666;
text-align:right;
font-size:14px;
}
.cl
{
clear:left;
}
.line
{
height:1px;
background-color:#666666;
width:100%;
margin-top:5px;
margin-bottom:5px;
}
.sp_5
{
height:5px;
width:500px;
}
.sp_20
{
height:20px;
width:500px;
}
.label
{
float:left;
width:50%;
color:#666666;
margin-bottom:-2px;
font-size:14px;
}
.lab_r
{
float:left;
width:50%;
color:#666666;
text-align:right;
font-size:14px;
}
.lab_l
{
float:left;
width:40%;
color:#666666;
margin-bottom:-2px;
margin-left:10%;
font-size:14px;
}
.line_l
{
height:1px;
background-color:#666666;
width:450px;
margin-top:5px;
margin-bottom:5px;
margin-left:50px;
}
.sub
{
    display:inline-block;
    width:16px;
    text-align:center;
}
</style>
<script type="text/javascript">
var height=0;function fileText(id,value){if(document.getElementById(id)){document.getElementById(id).innerHTML=value}}function changeFont(){reCon("main_div").style.fontFamily=window.parent.reFont()}function child_getH(){var nh=document.body.offsetHeight+100;if(nh<500||nh==null){nh=500}if(height!=nh){height=nh;window.parent.child_height(height)}}function reCon(id){return document.getElementById(id)}function ready(){try{window.parent.show_ifr()}catch(e){}child_getH()}function show(v){var c=document.getElementById(v);if(c!=null){c.style.display=""}}function hide(v){var c=document.getElementById(v);if(c!=null){c.style.display="none"}};
</script>
<script type="text/javascript">
var webdata_sn = "xxxx  ";
var webdata_msvn = "V330";
var webdata_ssvn = "";
var webdata_pv_type = "SA3ES211";
var webdata_rate_p = "1 00";
var webdata_now_p = "750";
var webdata_today_e = "0.19";
var webdata_total_e = "35.0";
var webdata_alarm = "";
var webdata_utime = "0";
var cover_mid = "xxx";
var cover_ver = "LSW3_15_FFFF_1.0.65";
var cover_wmode = "APSTA";
var cover_ap_ssid = "xxx";
var cover_ap_ip = "10.10.100.254";
var cover_ap_mac = "2C:9C:6E:6B:13:7E";
var cover_sta_ssid = "HAL 9000";
var cover_sta_rssi = "45%";
var cover_sta_ip = "192.168.178.30";
var cover_sta_mac = "xxxx";
var status_a = "1";
var status_b = "0";
var status_c = "0";

function initPageText(){var list=window.parent.reList("status");fileText("st1",list["t1"]);fileText("st2",list["t2"]);fileText("st3",list["t3"]);for(var i=1;i<=27;i++){if(i!=14){fileText("tx"+i,list[i])}}changeFont();child_getH()}function upfold(v){if(document.getElementById("up_"+v+"_div").style.display=="none"){show("up_"+v+"_div");reCon("p_"+v).innerHTML="-"}else{hide("up_"+v+"_div");reCon("p_"+v).innerHTML="+"}}function init_main_page(){var on=window.parent.reTip("1");var off=window.parent.reTip("2");document.getElementById("cover_mid").innerHTML=cover_mid;document.getElementById("cover_ver").innerHTML=cover_ver;document.getElementById("cover_ap_status").innerHTML=off;document.getElementById("cover_sta_status").innerHTML=off;if(cover_wmode!="STA"){document.getElementById("cover_ap_status").innerHTML=on;document.getElementById("cover_ap_ssid").innerHTML=cover_ap_ssid;document.getElementById("cover_ap_ip").innerHTML=cover_ap_ip;document.getElementById("cover_ap_mac").innerHTML=cover_ap_mac}if(cover_wmode!="AP"){document.getElementById("cover_sta_status").innerHTML=on;document.getElementById("cover_sta_ssid").innerHTML=cover_sta_ssid;document.getElementById("cover_sta_rssi").innerHTML=cover_sta_rssi;document.getElementById("cover_sta_ip").innerHTML=cover_sta_ip;document.getElementById("cover_sta_mac").innerHTML=cover_sta_mac}if(webdata_sn==""){webdata_sn="---"}fileText("webdata_sn",webdata_sn);if(webdata_msvn==""){webdata_msvn="---"}fileText("webdata_msvn",webdata_msvn);if(webdata_ssvn==""){webdata_ssvn="---"}fileText("webdata_ssvn",webdata_ssvn);if(webdata_pv_type==""){webdata_pv_type="---"}fileText("webdata_pv_type",webdata_pv_type);if(webdata_rate_p==""){webdata_rate_p="---"}fileText("webdata_rate_p",webdata_rate_p+" W");if(webdata_now_p==""||webdata_now_p==0){webdata_now_p="---"}fileText("webdata_now_p",webdata_now_p+" W");if(webdata_today_e==""){webdata_today_e="---"}fileText("webdata_today_e",webdata_today_e+" kWh");if(webdata_total_e==""){webdata_total_e="---"}fileText("webdata_total_e",webdata_total_e+" kWh");if(webdata_alarm==""){webdata_alarm="---"}fileText("webdata_alarm",webdata_alarm);if(webdata_utime==""){if(document.getElementById("webdata_sn").innerHTML=="---"){webdata_utime="---"}else{webdata_utime=value+window.parent.reTip("5")}}fileText("webdata_utime",webdata_utime);var st_en=window.parent.reTip("3");var st_dis=window.parent.reTip("4");var st_un=window.parent.reTip("41");if(status_a=="1"){document.getElementById("cover_remote_status_a").innerHTML=st_en}else{if(status_a=="0"){document.getElementById("cover_remote_status_a").innerHTML=st_dis}else{document.getElementById("cover_remote_status_a").innerHTML=st_un}}if(status_b=="1"){document.getElementById("cover_remote_status_b").innerHTML=st_en}else{if(status_b=="0"){document.getElementById("cover_remote_status_b").innerHTML=st_dis}else{document.getElementById("cover_remote_status_b").innerHTML=st_un}}};

</script>
</head>
<body class="in_body" onload="init_main_page();">
<div class="div_c" id="main_div">
        <div class="lab_5 cu b" onclick="upfold(1);child_getH();"><span class="sub" id="p_1">-</span><span id="st1" style="margin-left:3px"></span></div>
        <div class="sp_5"></div>
        <div id="up_1_div">
        <div class="lab_l2" id="tx1"></div>
                <div class="lab_r2" id="webdata_sn"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" id="tx2"></div>
                <div class="lab_r2" id="webdata_msvn"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" id="tx3"></div>
                <div class="lab_r2" id="webdata_ssvn"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" id="tx4"></div>
                <div class="lab_r2" id="webdata_pv_type"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" id="tx5"></div>
                <div class="lab_r2" id="webdata_rate_p"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx6"></div>
                <div class="lab_r2" id="webdata_now_p" style="color:#666666;font-weight:bold;"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx7"></div>
                <div class="lab_r2" id="webdata_today_e" style="color:#666666;font-weight:bold;"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx8"></div>
                <div class="lab_r2" id="webdata_total_e" style="color:#666666;font-weight:bold;"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx9"></div>
                <div class="lab_r2" id="webdata_alarm" style="color:#666666;font-weight:bold;"></div>
        <div class="cl"></div>
        <div class="line"></div>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx10"></div>
                <div class="lab_r2" id="webdata_utime" style="color:#666666;font-weight:bold;"></div>
        <div class="cl"></div>
        <div class="line"></div>
        </div>
        <div class="sp_20"></div>
        <div class="lab_5 cu b" onclick="upfold(2);child_getH();"><span class="sub" id="p_2">+</span><span id="st2" style="margin-left:3px"></span></div>
                <div class="sp_5"></div>
                <div id="up_2_div" style="display:none">
                <div class="label" id="tx11"></div>
                <div class="lab_r" id="cover_mid"></div>
                <div class="cl"></div>
                <div class="line"></div>
                <div class="label" id="tx12"></div>
                <div class="lab_r" id="cover_ver"></div>
                <div class="cl"></div>
                <div class="line"></div>
                <div class="label" id="tx13"></div>
                <div class="lab_r" id="cover_ap_status" style="color:#666666;font-weight:bold;"></div>
                <div class="cl"></div>
                <div class="line"></div>
                <div class="lab_l" id="ap_ssid">SSID</div>
                <div class="lab_r" id="cover_ap_ssid"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="lab_l" id="tx15"></div>
                <div class="lab_r" id="cover_ap_ip"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="lab_l" id="tx16"></div>
                <div class="lab_r" id="cover_ap_mac"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="label" id="tx17"></div>
                <div class="lab_r" id="cover_sta_status" style="color:#666666;font-weight:bold;"></div>
                <div class="cl"></div>
                <div class="line"></div>
                <div class="lab_l" id="tx18"></div>
                <div class="lab_r" id="cover_sta_ssid"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="lab_l" id="tx19"></div>
                <div class="lab_r" id="cover_sta_rssi"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="lab_l" id="tx20"></div>
                <div class="lab_r" id="cover_sta_ip"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                <div class="lab_l" id="tx21"></div>
                <div class="lab_r" id="cover_sta_mac"></div>
                <div class="cl"></div>
                <div class="line_l"></div>
                </div>
               
                <div class="sp_20"></div>
                <div class="lab_5 cu b" onclick="upfold(3);child_getH();"><span class="sub" id="p_3">+</span><span id="st3" style="margin-left:3px"></span></div>
                <div class="sp_5"></div>
                <div id="up_3_div" style="display:none">
                <div class="label" id="tx25"></div>
                <div class="lab_r" id="cover_remote_status_a"></div>
                <div class="cl"></div>
                <div class="line"></div>
                <div class="label" id="tx26"></div>
                <div class="lab_r" id="cover_remote_status_b"></div>
                <div class="cl"></div>
                <div class="line"></div>
                </div>
    </div>
<script type="text/javascript">
    initPageText();
    ready();
</script>
</body>
</html>
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Hauswart

#52
Zitat von: FFHEM am 16 November 2022, 11:00:49
Deine 0.80 kWh werden stimmen, falsch ist es immer, wenn er 0.8 zeigt, das sind 0.08 kWh tatsächlich.
Die nächste Beobachtung kannst Du beim Überschreiten von 1.0 bzw. 2.0 usw. beobachten - oder auch nicht, wenn ein WR in Ordnung ist.
Die Gesamt-kWh werden bei mir aufgrunddessen viel zu hoch, zumal bei mir im WR noch anscheinend eine Rundungsfunktion auf ganze kWh enthalten ist.
Dadurch habe ich total angeblich 35 kWh, tatsächlich sind es aber nur 23 kWh.

Für die Regexänderung müsste man "nur" bei der Nachkommastelle eine "0" voranstellen, falls diese 1-stellig ist.

Meine Statusseite:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
.in_body
{
   margin-top:0px;
   margin-left:0px;
   margin-right:0px;
   margin-bottom:0px;
   background-color:transparent;
}
.div_c
{
   margin-left:50px;
   margin-right:50px;
   margin-top:50px;
   margin-bottom:50px;
}
.cu
{
   cursor:pointer;
}
.b
{
   font-weight:bold;
}
.lab_5
{
   font-size:16px;
   color:#666666;
   margin-left:-20px;
}
.lab_l2
{
   float:left;
   width:32%;
   color:#666666;
   margin-bottom:-2px;
   font-size:14px;
}
.lab_r2
{
   float:left;
   width:68%;
   color:#666666;
   text-align:right;
   font-size:14px;
}
.cl
{
   clear:left;
}
.line
{
   height:1px;
   background-color:#666666;
   width:100%;
   margin-top:5px;
   margin-bottom:5px;
}
.sp_5
{
   height:5px;
   width:500px;
}
.sp_20
{
   height:20px;
   width:500px;
}
.label
{
   float:left;
   width:50%;
   color:#666666;
   margin-bottom:-2px;
   font-size:14px;
}
.lab_r
{
   float:left;
   width:50%;
   color:#666666;
   text-align:right;
   font-size:14px;
}
.lab_l
{
   float:left;
   width:40%;
   color:#666666;
   margin-bottom:-2px;
   margin-left:10%;
   font-size:14px;
}
.line_l
{
   height:1px;
   background-color:#666666;
   width:450px;
   margin-top:5px;
   margin-bottom:5px;
   margin-left:50px;
}
.sub
{
    display:inline-block;
    width:16px;
    text-align:center;
}
</style>
<script type="text/javascript">
var height=0;function fileText(id,value){if(document.getElementById(id)){document.getElementById(id).innerHTML=value}}function changeFont(){reCon("main_div").style.fontFamily=window.parent.reFont()}function child_getH(){var nh=document.body.offsetHeight+100;if(nh<500||nh==null){nh=500}if(height!=nh){height=nh;window.parent.child_height(height)}}function reCon(id){return document.getElementById(id)}function ready(){try{window.parent.show_ifr()}catch(e){}child_getH()}function show(v){var c=document.getElementById(v);if(c!=null){c.style.display=""}}function hide(v){var c=document.getElementById(v);if(c!=null){c.style.display="none"}};
</script>
<script type="text/javascript">
var webdata_sn = "xxxx  ";
var webdata_msvn = "V330";
var webdata_ssvn = "";
var webdata_pv_type = "SA3ES211";
var webdata_rate_p = "1 00";
var webdata_now_p = "750";
var webdata_today_e = "0.19";
var webdata_total_e = "35.0";
var webdata_alarm = "";
var webdata_utime = "0";
var cover_mid = "xxx";
var cover_ver = "LSW3_15_FFFF_1.0.65";
var cover_wmode = "APSTA";
var cover_ap_ssid = "xxx";
var cover_ap_ip = "10.10.100.254";
var cover_ap_mac = "2C:9C:6E:6B:13:7E";
var cover_sta_ssid = "HAL 9000";
var cover_sta_rssi = "45%";
var cover_sta_ip = "192.168.178.30";
var cover_sta_mac = "xxxx";
var status_a = "1";
var status_b = "0";
var status_c = "0";

function initPageText(){var list=window.parent.reList("status");fileText("st1",list["t1"]);fileText("st2",list["t2"]);fileText("st3",list["t3"]);for(var i=1;i<=27;i++){if(i!=14){fileText("tx"+i,list[i])}}changeFont();child_getH()}function upfold(v){if(document.getElementById("up_"+v+"_div").style.display=="none"){show("up_"+v+"_div");reCon("p_"+v).innerHTML="-"}else{hide("up_"+v+"_div");reCon("p_"+v).innerHTML="+"}}function init_main_page(){var on=window.parent.reTip("1");var off=window.parent.reTip("2");document.getElementById("cover_mid").innerHTML=cover_mid;document.getElementById("cover_ver").innerHTML=cover_ver;document.getElementById("cover_ap_status").innerHTML=off;document.getElementById("cover_sta_status").innerHTML=off;if(cover_wmode!="STA"){document.getElementById("cover_ap_status").innerHTML=on;document.getElementById("cover_ap_ssid").innerHTML=cover_ap_ssid;document.getElementById("cover_ap_ip").innerHTML=cover_ap_ip;document.getElementById("cover_ap_mac").innerHTML=cover_ap_mac}if(cover_wmode!="AP"){document.getElementById("cover_sta_status").innerHTML=on;document.getElementById("cover_sta_ssid").innerHTML=cover_sta_ssid;document.getElementById("cover_sta_rssi").innerHTML=cover_sta_rssi;document.getElementById("cover_sta_ip").innerHTML=cover_sta_ip;document.getElementById("cover_sta_mac").innerHTML=cover_sta_mac}if(webdata_sn==""){webdata_sn="---"}fileText("webdata_sn",webdata_sn);if(webdata_msvn==""){webdata_msvn="---"}fileText("webdata_msvn",webdata_msvn);if(webdata_ssvn==""){webdata_ssvn="---"}fileText("webdata_ssvn",webdata_ssvn);if(webdata_pv_type==""){webdata_pv_type="---"}fileText("webdata_pv_type",webdata_pv_type);if(webdata_rate_p==""){webdata_rate_p="---"}fileText("webdata_rate_p",webdata_rate_p+" W");if(webdata_now_p==""||webdata_now_p==0){webdata_now_p="---"}fileText("webdata_now_p",webdata_now_p+" W");if(webdata_today_e==""){webdata_today_e="---"}fileText("webdata_today_e",webdata_today_e+" kWh");if(webdata_total_e==""){webdata_total_e="---"}fileText("webdata_total_e",webdata_total_e+" kWh");if(webdata_alarm==""){webdata_alarm="---"}fileText("webdata_alarm",webdata_alarm);if(webdata_utime==""){if(document.getElementById("webdata_sn").innerHTML=="---"){webdata_utime="---"}else{webdata_utime=value+window.parent.reTip("5")}}fileText("webdata_utime",webdata_utime);var st_en=window.parent.reTip("3");var st_dis=window.parent.reTip("4");var st_un=window.parent.reTip("41");if(status_a=="1"){document.getElementById("cover_remote_status_a").innerHTML=st_en}else{if(status_a=="0"){document.getElementById("cover_remote_status_a").innerHTML=st_dis}else{document.getElementById("cover_remote_status_a").innerHTML=st_un}}if(status_b=="1"){document.getElementById("cover_remote_status_b").innerHTML=st_en}else{if(status_b=="0"){document.getElementById("cover_remote_status_b").innerHTML=st_dis}else{document.getElementById("cover_remote_status_b").innerHTML=st_un}}};

</script>
</head>
<body class="in_body" onload="init_main_page();">
   <div class="div_c" id="main_div">
        <div class="lab_5 cu b" onclick="upfold(1);child_getH();"><span class="sub" id="p_1">-</span><span id="st1" style="margin-left:3px"></span><>
        <div class="sp_5"><>
        <div id="up_1_div">
        <div class="lab_l2" id="tx1"><>
                <div class="lab_r2" id="webdata_sn"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" id="tx2"><>
                <div class="lab_r2" id="webdata_msvn"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" id="tx3"><>
                <div class="lab_r2" id="webdata_ssvn"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" id="tx4"><>
                <div class="lab_r2" id="webdata_pv_type"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" id="tx5"><>
                <div class="lab_r2" id="webdata_rate_p"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx6"><>
                <div class="lab_r2" id="webdata_now_p" style="color:#666666;font-weight:bold;"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx7"><>
                <div class="lab_r2" id="webdata_today_e" style="color:#666666;font-weight:bold;"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx8"><>
                <div class="lab_r2" id="webdata_total_e" style="color:#666666;font-weight:bold;"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx9"><>
                <div class="lab_r2" id="webdata_alarm" style="color:#666666;font-weight:bold;"><>
        <div class="cl"><>
        <div class="line"><>
        <div class="lab_l2" style="color:#666666;font-weight:bold;" id="tx10"><>
                <div class="lab_r2" id="webdata_utime" style="color:#666666;font-weight:bold;"><>
        <div class="cl"><>
        <div class="line"><>
        <>
        <div class="sp_20"><>
        <div class="lab_5 cu b" onclick="upfold(2);child_getH();"><span class="sub" id="p_2">+</span><span id="st2" style="margin-left:3px"></span><>
                <div class="sp_5"><>
                <div id="up_2_div" style="display:none">
                <div class="label" id="tx11"><>
                <div class="lab_r" id="cover_mid"><>
                <div class="cl"><>
                <div class="line"><>
                <div class="label" id="tx12"><>
                <div class="lab_r" id="cover_ver"><>
                <div class="cl"><>
                <div class="line"><>
                <div class="label" id="tx13"><>
                <div class="lab_r" id="cover_ap_status" style="color:#666666;font-weight:bold;"><>
                <div class="cl"><>
                <div class="line"><>
                <div class="lab_l" id="ap_ssid">SSID<>
                <div class="lab_r" id="cover_ap_ssid"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="lab_l" id="tx15"><>
                <div class="lab_r" id="cover_ap_ip"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="lab_l" id="tx16"><>
                <div class="lab_r" id="cover_ap_mac"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="label" id="tx17"><>
                <div class="lab_r" id="cover_sta_status" style="color:#666666;font-weight:bold;"><>
                <div class="cl"><>
                <div class="line"><>
                <div class="lab_l" id="tx18"><>
                <div class="lab_r" id="cover_sta_ssid"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="lab_l" id="tx19"><>
                <div class="lab_r" id="cover_sta_rssi"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="lab_l" id="tx20"><>
                <div class="lab_r" id="cover_sta_ip"><>
                <div class="cl"><>
                <div class="line_l"><>
                <div class="lab_l" id="tx21"><>
                <div class="lab_r" id="cover_sta_mac"><>
                <div class="cl"><>
                <div class="line_l"><>
                <>
               
                <div class="sp_20"><>
                <div class="lab_5 cu b" onclick="upfold(3);child_getH();"><span class="sub" id="p_3">+</span><span id="st3" style="margin-left:3px"></span><>
                <div class="sp_5"><>
                <div id="up_3_div" style="display:none">
                <div class="label" id="tx25"><>
                <div class="lab_r" id="cover_remote_status_a"><>
                <div class="cl"><>
                <div class="line"><>
                <div class="label" id="tx26"><>
                <div class="lab_r" id="cover_remote_status_b"><>
                <div class="cl"><>
                <div class="line"><>
                <>
    <>
   <script type="text/javascript">
       initPageText();
       ready();
   </script>
</body>
</html>


Danke dir. Was hast du genau für einen WR? Deiner zeigt leicht andere Daten an, daher muss ich das Regex prüfen/korrigieren. Meiner zeigt immer nur .10er Schritte an.


Kannst du mir den Auszug nochmal schicken, wenn er die falschen Werte anzeigt? Beim Quelltext oben sollte es korrekt sein?

Gruss
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

FFHEM

Danke Dir!
Ja, der Quelltext gilt für einen richtigen Wert.
Morgen vormittag kann ich Dir dann einen falschen Wert liefern.
Der WR ist ein SOFARSOLAR 1100TL-G3 Wechselrichter.
Meiner zeigt minimal 0,01 kWh (also 10 Wh) an. Wie schon gesagt, die werden dann als "0.1" ausgegeben, da die 1. Null hinterm Komma "vergessen" wird.

Im Bild sieht man übrigens die Rechenfehler als spitze Ausreißer nach oben:
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

FFHEM

So, die Sonne ist aufgegangen, die erste Messung zeigt "0.1" statt "0.01":
var webdata_msvn = "V330";
var webdata_ssvn = "";
var webdata_pv_type = "SA3ES211";
var webdata_rate_p = "1 00";
var webdata_now_p = "10";
var webdata_today_e = "0.1";
var webdata_total_e = "49.0";
var webdata_alarm = "";
var webdata_utime = "1";
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Hauswart

Probiere bitte mal:

attr Solar2 reading02OExpr my $regex  = qr/(\d*)[.](\d{2})/mp;;\
my $regex2 = qr/(\d*)[.](\d{1})/mp;;\
\
if ($val =~ /$regex/g) {\
    $val = $val;;\
} elsif ($val =~ /$regex2/g) {\
    $val = "$1.0$2";;\
} else {\
    $val = $val;;\
}
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

FFHEM

Hallo Hauswart,
das funktioniert wunderbar!!!! VIELEN DANK!

Da wäre ich nicht drauf gekommen, da waren ein paar Hürden (Regex-Übergang in Perlvariable, "OExpr") zuviel für mich.
Konntest Du bei Deinem WR schon sehen, ob er ähnliche Probleme bereitet?

Gruß,
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Hauswart

Zitat von: FFHEM am 18 November 2022, 11:40:36
Hallo Hauswart,
das funktioniert wunderbar!!!! VIELEN DANK!

Da wäre ich nicht drauf gekommen, da waren ein paar Hürden (Regex-Übergang in Perlvariable, "OExpr") zuviel für mich.
Konntest Du bei Deinem WR schon sehen, ob er ähnliche Probleme bereitet?

Gruß,
Friedhelm


Gerne :) Wobei Perl eigentlich auch nicht meine Programmiersprache ist. Mein mein WR zeigt nur 10er Schritte an. 1.10, 1.20, ...
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Hauswart

define Solar2 HTTPMOD http://[USER]:[PASS]@[IP]/status.html 60
attr Solar2 icon sani_solar
attr Solar2 reading01Name current_power-1
attr Solar2 reading01Regex (?^:var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 reading02Name yield_today-1
attr Solar2 reading02OExpr my $regex  = qr/(\d*)[.](\d{2})/mp;;\
my $regex2 = qr/(\d*)[.](\d{1})/mp;;\
\
if ($val =~ /$regex/g) {\
    $val = $val;;\
} elsif ($val =~ /$regex2/g) {\
    $val = "$1.0$2";;\
} else {\
    $val = $val;;\
}
attr Solar2 reading02Regex (?^:var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 reading03IgnoreExpr $val < $oldVal
attr Solar2 reading03Name total_yield-1
attr Solar2 reading03Regex (?^:var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 stateFormat Aktuelle Leistung: current_power-1 W;;\
Tagesertrag: yield_today-1 kWh;;\
Gesamtertrag: total_yield-1 kWh
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

cotecmania

Hallo,

bei mir steht aktuell auch ein DEYE SUN600 aufm Tisch mit Netzteil betrieben.
Solarman habe ich nicht installiert.
Er verbindet sich mit meiner Fritzbox und hat nun eine statische IP in meinem Netzwerk.
Firmware ist 1.53.

Jetzt möchte ich die Daten in FHEM bringen.
Wenn ich die Status-Seite im Browser aufrufe bekomme ich aber keine Daten (siehe Anhang)

Gruss
Joe

FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Olly

Hallo Joe,

das hab ich so auch schon mal gesehen. Passiert glaube ich immer dann, wenn man die Seite direkt aufruft.
Schau dir doch mal den Seitenquelltext an, da sollten dann die gesuchten Werte zu finden sein.
z.B.:
var webdata_now_p = "281";
var webdata_today_e = "8.0";
var webdata_total_e = "8.0";
var webdata_alarm = "";
var webdata_utime = "0";


Gruß

      Olly
BananaPi 1GB;NetCSM 868MHz, miniCUL 433MHz, LaCrosseGateway, 2x SignalESP; FHEM 6.2

bismosa

Huhu!

Ich habe jetzt auch einen Deye SUN600G3-EU-230  :)

Bei der Suche nach Möglichkeiten den Wechselrichter auszulesen bin ich auch über diesen Thread gestolpert.
Danke für die Ideen und Inspirationen mit dem HTTPMOD.

Ich möchte allerdings ein wenig mehr.
Die Aktuelle Leistung wird wohl nur alle 5 Min. aktualisiert. (Trotz Abfrage jede Minute)
Auch hätte ich gerne in FHEM auch die Werte der einzelnen Module.

Ich habe dieses Projekt in Github entdeckt:
https://github.com/kbialek/deye-inverter-mqtt
Läuft und bringt einige Werte mehr. Konnte leider nur kurz testen, da die Sonne schon wieder weg war.
Benötigt leider Python 3.10 (oder 3.11 damit lief es bei mir). Die Installation auf dem Raspberry hat bei mir Stunden gedauert...und benötigt einiges an Platz auf meiner kleinen Karte.

Ich stelle mir nun die Frage, ob das nicht schon jemand direkt in FHEM mit dem ModbusAttr umgesetzt hat?
Ich kenne mich da leider nicht aus...muss erstmal lernen, wie das geht. Aber vielleicht wäre dies eine "einfache" Möglichkeit an aktuelle Daten zu kommen?

Vielleicht hat ja schon jemand ein Beispiel dafür?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

@bismosa
Ich habe ebenfalls einen Deye baugleichen WR und lese die Modbus Daten mittels "geklautem" Python Script auf einem alten RasPi aus, leider fehlt mit die Expertise, daraus ein Modul zu machen.

Was mich aber an den vom WR direkt über Modbus zur Verfügung stehenden Daten absolut stört, ist der Datenintervall.
Offiziell soll die interne Datenrate bei 60sec. liegen, und alle 5 Min in die Cloud übertragen werden, letzteres passiert auch, nur die interne Pollrate liegt statt der 60sec. bei ca. 10 Minuten! und ist somit für eine Steuerung nahezu unbrauchbar, da ist die Auswertung über einen nachgeschalten Shelly deutlich performanter.

bismosa

Hallo!

Zitat von: uli-bs am 21 Februar 2023, 11:47:12
Was mich aber an den vom WR direkt über Modbus zur Verfügung stehenden Daten absolut stört, ist der Datenintervall.
:( Stimmt. Hab ich selbst gerade getestet. Nach 5Min. gab es erst ein Update.

Das ist mir auch deutlich zu langsam. Aber immerhin kommt man so an ein paar Werte mehr. Ich finde es auch interessant zu wissen, wie viel die einzelnen Module machen.
Jetzt bekomme ich zusätzlich:
freq
l1_current
l1_power
l1_voltage
pv1_current
pv1_day_energy
pv1_power
pv1_total_energy
pv1_voltage
pv2_current
pv2_day_energy
pv2_power
pv2_total_energy
pv2_voltage
radiator_temp

Aber der Intervall stört mich ebenfalls. Hat mit aktuellen Werten nichts zu tun  :(

Dann werde ich mir auch ein Shelly o.ä. besorgen für eine Echtzeitanzeige.

Trotzdem würde mich es interessieren, wie ich die Werte mit FHEM und dem ModbusAttr auslesen kann. Vielleicht verstehe ich das ja noch irgendwann...

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

Wie angedeutet, die Daten holt aktuell ein alter Pi1 mit Raspian OS und einem Python Script und sendet sie per MQTT an den Pi mit der FHEM Instanz.
Meine Readings entsprechen dabei etwa deinen, nur dass ich eben 4 PV Eingänge habe. Ich vermute AC Current bleibt bei dir auch leer?
Das Listing ist praktisch der Zustand "Licht gerade weg", also Logger gerade abgeschaltet.
Bei Gelegenheit werde ich mal die SD Karte vom FHEM clonen und dann sehen, ob sich Script und Pythonversion mit dem normalen FHEM Host vertragen.

TYPE       MQTT2_DEVICE
   READINGS:
     2023-02-21 17:48:07   AC_Current_A_   0
     2023-02-21 17:48:07   AC_Frequency_Hz_ 0
     2023-02-21 17:48:07   AC_Power_Output_W_ 0
     2023-02-21 17:48:07   AC_Production_today_kWh_ 1.0
     2023-02-21 17:48:07   AC_Production_total_kWh_ 1234.5
     2023-02-21 17:48:07   AC_System_Power_W_ 1600.0
     2023-02-21 17:48:07   AC_Voltage_V_   0
     2023-02-21 17:48:07   PV1_DC_Current_A_ 0
     2023-02-21 17:48:08   PV1_DC_Power_W  0
     2023-02-21 17:48:07   PV1_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV1_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV1_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV2_DC_Current_A_ 0
     2023-02-21 17:48:08   PV2_DC_Power_W  0
     2023-02-21 17:48:07   PV2_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV2_Production_today_kWh_ 0.3
     2023-02-21 17:48:07   PV2_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV3_DC_Current_A_ 0
     2023-02-21 17:48:08   PV3_DC_Power_W  0
     2023-02-21 17:48:07   PV3_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV3_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV3_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   PV4_DC_Current_A_ 0
     2023-02-21 17:48:08   PV4_DC_Power_W  0
     2023-02-21 17:48:07   PV4_DC_Voltage_V_ 0
     2023-02-21 17:48:07   PV4_Production_today_kWh_ 0.2
     2023-02-21 17:48:07   PV4_Production_total_kWh_ 123.4
     2023-02-21 17:48:07   Radiator_Temp_dC_ 0
     2023-02-21 17:48:07   Set_Inverter_ON-OFF__ 1
     2023-02-21 17:48:07   Set_Islanding_Protection_Enable__ 1
     2023-02-21 17:48:07   Set_Power_Limiter__ 100
     2023-02-21 17:48:08   online          0
     2023-02-21 17:48:08   state           offline
     2023-02-21 17:48:07   timeout         11

loetmeister

Zitat von: bismosa am 21 Februar 2023, 14:00:11
Trotzdem würde mich es interessieren, wie ich die Werte mit FHEM und dem ModbusAttr auslesen kann. Vielleicht verstehe ich das ja noch irgenll.dwann...

Hi,

glaube da passen die Protokolle nicht überein... welche Modbus ID sollte der Wechselrichter haben? Ich hatte mal einen Modbus ID scan versucht... glaube das ist aber vergebens.
Soweit ich die Pyhthon scripte verstehe (z.B. https://github.com/jlopez77/DeyeInverter) wird eine spezielle Anfrage an den Wechselrichter geschickt - welcher u.a. die Seriennummer enthält. Das scheint mir sehr speziell.
Grundsätzlich müsste man aber den Python code in Perl für FHEM umschreiben können, ohne MQTT Teil sieht es relativ übersichtlich aus... FEHM Module wäre leider Neuland für mich  :-[

Gruß,
Thomas

bismosa

Hallo!

Zitat von: loetmeister am 27 Februar 2023, 20:11:56
glaube da passen die Protokolle nicht überein...

Ja. Das denke ich auch. Habe mich da auch dran versucht. Siehe auch hier:
https://forum.fhem.de/index.php/topic,75638.msg1265091.html#msg1265091

Ich habe es für mich aufgegeben, das direkt mit FHEM zu machen. Ich nutze nun
https://github.com/kbialek/deye-inverter-mqtt

Ich musste ein aktuelleres Python installieren (habe 3.11 genommen). Starten kann man dann mit
bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py" bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py"

Habe mir dafür dann noch ein init.d Script gebastelt, damit es auf meinem Raspberry automatisch gestartet wird:
#!/bin/sh

### BEGIN INIT INFO
# Provides:          deye
# Required-Start:   
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Deye to MQTT
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/root/deye
DAEMON=$DIR/start.sh
DAEMON_NAME=deye

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid
# start-stop-daemon --start --background --pidfile /var/run/deye.pid --make-pidfile --user root --chuid root --startas /root/deye/start.sh
. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
pkill -f deye_docker_entrypoint.py
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
pkill -f deye_docker_entrypoint.py
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;

    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0


Dafür noch die start.sh:
#!/bin/sh
bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py" bash -c "$(cat config.env | xargs) python3.11 deye_docker_entrypoint.py"


Geht bestimmt auch einfacher/besser.  ;)
Ich glaube die readingList musste ich beim MQTT2 Device auch leicht anpassen, damit alle ein eigenes Reading bekommen.

Läuft die letzten Tage gut :)


Zitat von: uli-bs am 21 Februar 2023, 18:08:39
Ich vermute AC Current bleibt bei dir auch leer?
...
Das Listing ist praktisch der Zustand "Licht gerade weg", also Logger gerade abgeschaltet.
AC Current nennt sich bei mir L1_current und enthält bei mir Daten.

Online/Offline gibt es bei mir leider derzeit noch nicht. Vielleicht wird das ja irgendwann hinzugefügt.

Nutzt Du ein selbst geschriebenes Script? Oder ist das irgendwo verfügbar?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

uli-bs

"Mein" Script stammt aus einem anderen Forum und ist dort im ersten Beitrag verlinkt (google: "loxone Deye") es beruht auf einer Entwicklung von jlopez77 (github) .
Ich lasse es aus /opt/name mit einem kleinen Bash Script über chrontab laufen.
Gefühlter Vorteil: es ist nur ein einzelnes Python Script und soll auch schon ab Py 3.08 laufen. Libraries müssen allerdings auch nachinstalliert werden.
Die Namen für die MQTT Parameter/Readings habe ich auch etwas angepasst.

neobiker

Hallo,
ich habe meinen Microwechselrichter von DEYE (identisch Bosswerk) jetzt auch erfolgreich mit dem deye_inverter_mqtt Skript in FHEM mittels MQTT eingebunden.

Die Attribute habe ich wie folgt definiert (_12345678 mit der Seriennummer des WR-Logger ersetzen):

########################
### MQTT2 Deye SUN Micro
########################
define MQTT2_deye_inverter_12345678 MQTT2_DEVICE deye_inverter_12345678
attr MQTT2_deye_inverter_12345678 readingList deye_inverter_12345678:deye/status:.* status\
deye_inverter_12345678:deye/logger_status:.* logger_status\
deye_inverter_12345678:deye/day_energy:.* day_energy\
deye_inverter_12345678:deye/total_energy:.* total_energy\
deye_inverter_12345678:deye/ac/l1/voltage:.* AC_L1_voltage\
deye_inverter_12345678:deye/ac/l1/current:.* AC_L1_current\
deye_inverter_12345678:deye/ac/l1/power:.* AC_L1_power\
deye_inverter_12345678:deye/ac/l2/power:.* AC_L2_power\
deye_inverter_12345678:deye/ac/l3/power:.* AC_L3_power\
deye_inverter_12345678:deye/ac/freq:.* freq\
deye_inverter_12345678:deye/uptime:.* uptime\
deye_inverter_12345678:deye/dc/pv1/voltage:.* PV1_voltage\
deye_inverter_12345678:deye/dc/pv1/current:.* PV1_current\
deye_inverter_12345678:deye/dc/pv1/power:.* PV1_power\
deye_inverter_12345678:deye/dc/pv2/voltage:.* PV2_voltage\
deye_inverter_12345678:deye/dc/pv2/current:.* PV2_current\
deye_inverter_12345678:deye/dc/pv2/power:.* PV2_power\
deye_inverter_12345678:deye/dc/pv3/voltage:.* PV3_voltage\
deye_inverter_12345678:deye/dc/pv3/current:.* PV3_current\
deye_inverter_12345678:deye/dc/pv3/power:.* PV3_power\
deye_inverter_12345678:deye/dc/pv4/voltage:.* PV4_voltage\
deye_inverter_12345678:deye/dc/pv4/current:.* PV4_current\
deye_inverter_12345678:deye/dc/pv4/power:.* PV4_power\
deye_inverter_12345678:deye/operating_power:.* operating_power\
deye_inverter_12345678:deye/ac/active_power:.* active_power\
deye_inverter_12345678:deye/radiator_temp:.* radiator_temp\
deye_inverter_12345678:deye/dc/pv1/day_energy:.* PV1_day_energy\
deye_inverter_12345678:deye/dc/pv1/total_energy:.* PV1_total_energy\
deye_inverter_12345678:deye/dc/pv2/day_energy:.* PV2_day_energy\
deye_inverter_12345678:deye/dc/pv2/total_energy:.* PV2_total_energy\
deye_inverter_12345678:deye/dc/pv3/day_energy:.* PV3_day_energy\
deye_inverter_12345678:deye/dc/pv3/total_energy:.* PV3_total_energy\
deye_inverter_12345678:deye/dc/pv4/day_energy:.* PV4_day_energy\
deye_inverter_12345678:deye/dc/pv4/total_energy:.* PV4_total_energy\
deye_inverter_12345678:deye/dc/total_power:.* total_power
attr MQTT2_deye_inverter_12345678 room MQTT2_DEVICE

define FileLog_MQTT2_deye_inverter_12345678 FileLog ./log/MQTT2_deye_inverter_12345678-%Y.log MQTT2_deye_inverter_12345678
attr FileLog_MQTT2_deye_inverter_12345678 logtype text
attr FileLog_MQTT2_deye_inverter_12345678 room MQTT2_DEVICE


Unter Debian habe ich die Software ebenfalls unter /opt installiert, weil ich dafür nicht extra docker verwenden will:
cd /opt
git clone https://github.com/kbialek/deye-inverter-mqtt
pip install paho-mqtt
cd deye-inverter-mqtt


Die Configdatei anpassen (IP-Adressen und WR-Seriennummer)
config.env
DEYE_LOGGER_IP_ADDRESS=192.168.xxx.yyy
DEYE_LOGGER_PORT=8899
DEYE_LOGGER_SERIAL_NUMBER=12345678

MQTT_HOST=192.168.yyy.zzz
MQTT_PORT=1883
MQTT_USERNAME=
MQTT_PASSWORD=
MQTT_TOPIC_PREFIX=deye

LOG_LEVEL=ERROR
DEYE_DATA_READ_INTERVAL=120
DEYE_METRIC_GROUPS=micro


Das vorhandene Skript deye_cli.sh habe ich nur geringfügig angepasst:
deye_daemon.sh
#!/bin/bash
cd $(dirname $0)
set -a; source config.env; set +a
python3 deye_docker_entrypoint.py "$@"


Mein Startskript sieht jetzt so aus:

#!/bin/sh

screen -d -m /opt/deye-inverter-mqtt/deye_daemon.sh

exit 0


Damit bekomme ich die WR-Daten mittels MQTT in FHEM integriert. Ich schiebe sämtliche MQTT Infos direkt an eine InfluxDB weiter.

cruser1800

Hallo neobiker,

ich bin absoluter Neuling was MQTT angeht. Daher noch ein paar Fragen.

1. Muss ich zusätzlich den MQTT2_CLIENT definieren?
2.  MQTT_USERNAME= / MQTT_PASSWORD=   - muss hier etwas gefüllt werden. Die Zugangsdaten vom Deye?
3. Gibt es unter Debian eine Möglichkeit den MQTT - Server und die Daten zu prüfen?

Leider ist es Nacht und ich weis nicht, ob alles richtig installiert ist.

Danke Gruß Lutz

cruser1800

Ich habe Heute ein bisschen probiert. Habe jetzt bei Debian folgendes Problem.

  File "/usr/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused


Hat jemand eine Lösung für mich?

Danke

bismosa

Hallo!

@neobiker

Danke für die Beschreibung. Das sieht etwas einfacher aus als bei mir  :)

@cruser1800
ZitatMuss ich zusätzlich den MQTT2_CLIENT definieren?
Du musst einen MQTT2 Server haben. Siehe https://wiki.fhem.de/wiki/MQTT2_DEVICE und/oder https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt
Wenn dieser Zugangsdaten benötigt, musst du diese auch in die Konfiguration eintragen.
Wenn autocreate in FHEM aktiv ist, sollte das Device automatisch angelegt werden.

ZitatConnectionRefusedError: [Errno 111] Connection refused
Das sieht für mich nach falscher IP oder falschem Port aus. Stimmt die Konfiguration? Ist der Wechselrichter unter der angegbenen IP erreichbar?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

cruser1800

@bismosa

Danke, jetzt habe ich es verstanden und einen Server installiert und es klappt.

Gruß Lutz

neobiker

So,
ich habe jetzt den WR vom Internet in meiner Fritzbox abgeklemmt. Damit wird der tägliche Ertrag allerdings nicht mehr auf Null gesetzt. Damit er trotzdem den täglichen Ertrag zurücksetzt, habe ich folgendes Skript erstellt. Ich starte es jeden Morgen um 4 Uhr per Cron. Habe das aus einem Python-Skript im PV Forum adaptiert.

Beim schreiben des Datum/Urhzeit in die Register 22-24 erfolgt der Reset des taglichen Ertrages im WR.

Bei mir hat es heute schonmal funktioniert  8)

/opt/deye-inverter-mqtt/deye_reset_daily_power.sh
#!/bin/bash
# reset Daily_Power of DEYE Inverters
#   via deye_inverter_mqtt python package
#   https://github.com/kbialek/deye-inverter-mqtt

# locate script in package location!
cd $(dirname $0)

deye_read ()
{
    [ $# = 1 ] || return
    check=0
    while ! (( $check )); do
        result="$(./deye_cli.sh r $1)"
        result=$(echo "$result" | grep 'int: ')
        if [ -n "$result" ]; then
            echo "$result"
            check=1
            logger -t DEYE_read ./deye_cli.sh r $1
        else
            sleep 10
        fi
    done
}

deye_write ()
{
    [ $# = 2 ] || return
    check=0
    while ! (( $check )); do
        result="$(./deye_cli.sh w $1 $2)"
        if [ $result = "Ok" ]; then
            check=1
            logger -t DEYE_write ./deye_cli.sh w $1 $2
        else
            sleep 10
        fi
    done
}

# the 1.st read waits until inverter wakes up
val22_read=$(deye_read 22 | sed 's/int: //g' | cut -d, -f1)
val23_read=$(deye_read 23 | sed 's/.*h: //g' | cut -d, -f1)

# read actual date + time
year=$(date +%y)
month=$(date +%m | sed 's/^0//g')
day=$(date +%d | sed 's/^0//g')
hour=$(date +%H | sed 's/^0//g')
minute=$(date +%m | sed 's/^0//g')
second=$(date +%S | sed 's/^0//g')

# actual register 22-24 values
val22=$(($year * 256 + $month))
val23=$(($day * 256 + $hour))
val24=$(($minute * 256 + $second))

# reset daily_power only once a day
[ "$val22_read" = "$val22" -a "$val23_read" = "$day" ] && exit 0

# reset daily_power by setting register 22-24 with actual date + time
deye_write 22 $val22
deye_write 23 $val23
deye_write 24 $val24

cruser1800

@neobiker

der WR schaltet sich jeden Tag nach Sonnenuntergang ab und erst wieder zum Sonnenaufgang zu. In dieser Zeit ist er nicht erreichbar.

Wartet den Script die paar Stunden bis er antwortet?

Gruß

neobiker


rob

Zitat von: bismosa am 20 Februar 2023, 19:11:13Ich habe dieses Projekt in Github entdeckt:
https://github.com/kbialek/deye-inverter-mqtt
Vielen Dank fürs Teilen Deines Fundes :)
Auf der Seite ist u.a. der Start via Docker erklärt. Hab ich auch so am Laufen: einfacher geht's nicht. Zusammen mit Influx + Grafana lassen sich coole Sachen machen. Da ist der 5Min Takt fast verschmerzbar  ;)

VG
rob

golem

Hallo,

falls sich Irgendjemand für das leicht modifizierte Modbus-Protokoll des Deye interessiert oder gar ein Modul daraus machen möchte, hier gibt es passende Infos https://pysolarmanv5.readthedocs.io/en/stable/solarmanv5_protocol.html
Pi - Max-Lan - 8x max Ht -3x Max WT - Max Fk -modbus umg103- 2x Arduino mit Firmata Ethernet- ws300 - 433Mhz Sender Empfänger - 7x 1wire ds1820

schnulli59

#78
Zitat von: Hauswart am 18 November 2022, 13:18:16define Solar2 HTTPMOD http://[USER]:[PASS]@[IP]/status.html 60
attr Solar2 icon sani_solar
attr Solar2 reading01Name current_power-1
attr Solar2 reading01Regex (?^:var webdata_now_p = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 reading02Name yield_today-1
attr Solar2 reading02OExpr my $regex  = qr/(\d*)[.](\d{2})/mp;;\
my $regex2 = qr/(\d*)[.](\d{1})/mp;;\
\
if ($val =~ /$regex/g) {\
    $val = $val;;\
} elsif ($val =~ /$regex2/g) {\
    $val = "$1.0$2";;\
} else {\
    $val = $val;;\
}
attr Solar2 reading02Regex (?^:var webdata_today_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 reading03IgnoreExpr $val < $oldVal
attr Solar2 reading03Name total_yield-1
attr Solar2 reading03Regex (?^:var webdata_total_e = "([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))";
attr Solar2 stateFormat Aktuelle Leistung: current_power-1 W;;\
Tagesertrag: yield_today-1 kWh;;\
Gesamtertrag: total_yield-1 kWh

Ich wollte das auch mal testen weil ich die Anlage auch habe. Aber folgendes attr wird nicht angenommen.
attr Solar2 reading02OExpr my $regex  = qr/(\d*)[.](\d{2})/mp;;\
my $regex2 = qr/(\d*)[.](\d{1})/mp;;\
\
if ($val =~ /$regex/g) {\
    $val = $val;;\
} elsif ($val =~ /$regex2/g) {\
    $val = "$1.0$2";;\
} else {\
    $val = $val;;\
}

die Fehlermeldung:
Invalid Expression my $regex = qr/(\d*)[.](\d{2})/mp;\ my $regex2 = qr/(\d*)[.](\d{1})/mp;\ \ if ($val =~ /$regex/g) {\ $val = $val;\ } elsif ($val =~ /$regex2/g) {\ $val = "$1.0$2";\ } else {\ $val = $val;\ } Log:2023.04.11 14:37:51 3: Solar2: attr reading02OExpr with expression package main; my $oldVal = $oRef->{'$oldVal'};my @matchlist = @{$oRef->{'@matchlist'}};my $timeDiff = $oRef->{'$timeDiff'};return undef;my $regex  = qr/(\d*)[.](\d{2})/mp;\ my $regex2 = qr/(\d*)[.](\d{1})/mp;\ \ if ($val =~ /$regex/g) {\     $val = $val;\ } elsif ($val =~ /$regex2/g) {\     $val = "$1.0$2";\ } else {\     $val = $val;\ } on  created error: Experimental aliasing via reference not enabled at (eval 793) line 1.Vieleicht kann mir da jemand helfen.

Die anderen Eingaben wurden übernommen
Fhem -> Raspi 3B / 7590AX / CUL

schnulli59

Habe es rausgefunden -  man muss es bei RAW eintragen

Geht jetzt auch bei mir
Fhem -> Raspi 3B / 7590AX / CUL

neobiker

Zitat von: neobiker am 09 März 2023, 17:50:57Hallo,
ich habe meinen Microwechselrichter von DEYE (identisch Bosswerk) jetzt auch erfolgreich mit dem deye_inverter_mqtt Skript in FHEM mittels MQTT eingebunden.

...

Ich habe das entsprechende Skript noch etwas verfeinert und ausführlicher in meinem Wiki beschrieben:
Balkonkraftwerk: DEYE Wechselrichter ohne Cloud auslesen und per MQTT monitoren

kanenas

Hallo!
ich habe mich auch intensive mit dem Thema beschäftig und habe für mich eine Lösung über Node-RED gefunden.
Keine Ahnung ob jemant diesen Weg hier im Forum schon vorgestellt hat.

Es geht über ein fertiges Modul:https://flows.nodered.org/node/@binsoul/node-red-contrib-deye-sun-g3
Dann direct eine Verbindung zum mqtt-out und fertig! Ich betreibe zwei Deye wechselrichter damit.

Servus!



Jessie@Raspi(v3)+SSD, CUL-MAX, CUL-433, CUL-FS20, JeeLink-PCA301, JeeLink-JLLaCrosse, HM-MOD-UART, HUEBridge(v2), ESPEasy, Tasmota, Plenticore 7 mit BYD 11,5

X-Byte

Zitat von: kanenas am 10 Mai 2023, 13:40:36Es geht über ein fertiges Modul:https://flows.nodered.org/node/@binsoul/node-red-contrib-deye-sun-g3
Dann direct eine Verbindung zum mqtt-out und fertig! Ich betreibe zwei Deye wechselrichter damit.

Hi kanenas, hört sich für mich sehr interessant an, vor allem, weil die Werte direkt über das Solarman v5 Protokoll ausgelesen werden.
Könntest Du vielleicht etwas genauer beschreiben, welche Bedingungen auf Seite von FHEM/RasPi erfüllt/installiert sein müssen, um das ans Laufen zu bekommen?
Hilft bestimmt auch vielen anderen 😊

Grüße!
X-Byte

kanenas

Hi X-byte,

Fhem ist auf ein Raspi installiert mit dem MQTT2 Server. Node-RED in einen zweiten Raspi installiert. Ob beides in ein Raspi installiert werden können, ist mir nicht bekannt aber sicherlich möglich.

Node-RED hatte ich vorher in Betrieb da ich damit den BMS von ein "China" 48v lifepo4 120Ah Akku mit RS485 auslese und über MQTT die Daten an fhem sende.

Vorher hatte über Node-Red keine Ahnung. Ist ziemlich einfach zu installieren und relative schnell zu verstehen wie Projekte umzusetzen sind.

Falls du den Code von Node-Red brauchst, schreib mir.

LG

fhem Readings:

setstate Deye_Micro_Solar_Carport 2023-05-23 12:04:10 IODev MQTT_Server
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv1TotalEnergy 181.5
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv1TotalEnergyToday 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv2TotalEnergy 135.2
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv2TotalEnergyToday 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv3TotalEnergy 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv3TotalEnergyToday 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv4TotalEnergy 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_pv4TotalEnergyToday 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_totalEnergy 323.7
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 counters_totalEnergyToday 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 isAvailable true
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 output_current 0.4
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 output_frequency 50
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 output_power 105
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 output_voltage 238
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv1_current 1.4
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv1_power 50.12
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv1_voltage 35.8
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv2_current 1.4
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv2_power 51.52
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv2_voltage 36.8
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv3_current 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv3_power 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv3_voltage 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv4_current 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv4_power 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 pv4_voltage 0
setstate Deye_Micro_Solar_Carport 2023-05-25 06:20:02 temperature 15
Jessie@Raspi(v3)+SSD, CUL-MAX, CUL-433, CUL-FS20, JeeLink-PCA301, JeeLink-JLLaCrosse, HM-MOD-UART, HUEBridge(v2), ESPEasy, Tasmota, Plenticore 7 mit BYD 11,5

mrb

hi zusammen,

ich schließe mich mal hier an.
ich habe jetzt aus einem ziemlich am Anfang geschriebenen post das "geklaut"
Du darfst diesen Dateianhang nicht ansehen.

Spricht irgendwas dagegen da es funktioniert nach meinem Anschein nach?

Edit: Zur Info ich bin überhaupt nicht mit Perl vertraut und habe da einfach euch vertraut ^^

chunter1

Lieg ich richtig, dass mit allen Lösungen hier die Werte nur alle 5 Minuten aktualisiert ausgelesen werden können oder gibt es einen Weg diese z.B. alle 10s zu erhalten?

bismosa

Hallo!

Mit diesem Script
https://github.com/kbialek/deye-inverter-mqtt
Kann man auch häufiger auslesen.
Da gab es auch gerade wieder ein Update. U.a. lässt sich das jetzt auch offiziell ohne Docker benutzen. Da ist eine Anleitung für ein Startscript.

Ich weiß nicht wie häufig der Wechselrichter überhaupt die eigenen Werte aktualisiert... deswegen habe ich für eine häufigere Aktualisierung eine WLAN Steckdose mit messfunktion angeschlossen. Hier sollte man nur aufpassen das die billigen tuya sehr gerne Mal unverhofft abschalten...

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

chunter1

Zitat von: bismosa am 29 Mai 2023, 09:35:32Mit diesem Script
https://github.com/kbialek/deye-inverter-mqtt
Kann man auch häufiger auslesen.

Danke für den Tip.
Habs grade ausprobiert - man kann zwar häufiger auslesen, die Werte ändern sich aber leider trotzdem nur alle 5 Minuten.

Christian_M

#88
Zitat von: Hauswart am 12 August 2022, 07:09:00FYI:

Ich teste gerade die Solarman API:
defmod Solarman HTTPMOD https://api.solarmanpv.com/device/v1.0/currentData?language=en 60
attr Solarman extractAllJSON 1
attr Solarman requestData { "deviceSn": "[SN]", "deviceId": [ID]}
attr Solarman requestHeader1 Content-Type: application/json
attr Solarman requestHeader2 Accept: */*
attr Solarman requestHeader3 Authorization: bearer [TOKEN]

Hallo @Hauswart,
ich würde genau das Szenario auch gerne umsetzen um vor allem auszulesen wieviel Strom gerade eingespeist wird um damit z.B. die Wallbox zu starten.
Ich breche mir mit der Nutzung der REST API aber einen ab.
Kannst du mehr Beispiel Code zur Verfügung stellen? Gerne sonst auch als PM.

VG
Christian

Hauswart

Zitat von: Christian_M am 01 Juni 2023, 22:07:20
Zitat von: Hauswart am 12 August 2022, 07:09:00FYI:

Ich teste gerade die Solarman API:
defmod Solarman HTTPMOD https://api.solarmanpv.com/device/v1.0/currentData?language=en 60
attr Solarman extractAllJSON 1
attr Solarman requestData { "deviceSn": "[SN]", "deviceId": [ID]}
attr Solarman requestHeader1 Content-Type: application/json
attr Solarman requestHeader2 Accept: */*
attr Solarman requestHeader3 Authorization: bearer [TOKEN]

Hallo @Hauswart,
ich würde genau das Szenario auch gerne umsetzen um vor allem auszulesen wieviel Strom gerade eingespeist wird um damit z.B. die Wallbox zu starten.
Ich breche mir mit der Nutzung der REST API aber einen ab.
Kannst du mehr Beispiel Code zur Verfügung stellen? Gerne sonst auch als PM.

VG
Christian

Hallo Christian, ich habe die Solarman Variante nicht wirklich produktiv bei mir umgesetzt und bin dann doch direkt auf die WR-Daten (lokale IP vom WR) gegangen.
1. Installation:
KNX, Tasmota (KNX), Sonos, Unifi

2. Installation:
HM-CFG-USB, Unifi (, SIGNALduino 868, MySensors, SIGNALduino 433)

Christian_M

Hallo Hauswart,

schade, die Logger liefern bei mir über das Web Interface leider nur spartanische Daten und sind leider auch von der Erreichbarkeit recht anfällig.
Danke für die schnelle Rückmeldung.

Hat sonst irgendjemand den Ansatz über die Solarman API mal umgesetzt?

Viele Grüße
Christian

Gasmast3r

Hallo Lese hier ab und an mal mit, nutze den HTTPMOD aber das meiste mache ich per Sonoff POW, nun habe ich in einer FB Gruppe gesehen das der WR nun eine Fernsteuerfunktion bekommen hat ist da schon was bekannt????

Gasmast3r

Zitat von: neobiker am 09 März 2023, 17:50:57Hallo,
ich habe meinen Microwechselrichter von DEYE (identisch Bosswerk) jetzt auch erfolgreich mit dem deye_inverter_mqtt Skript in FHEM mittels MQTT eingebunden.

Die Attribute habe ich wie folgt definiert (_12345678 mit der Seriennummer des WR-Logger ersetzen):
########################
### MQTT2 Deye SUN Micro
########################
define MQTT2_deye_inverter_12345678 MQTT2_DEVICE deye_inverter_12345678
attr MQTT2_deye_inverter_12345678 readingList deye_inverter_12345678:deye/status:.* status\
deye_inverter_12345678:deye/logger_status:.* logger_status\
deye_inverter_12345678:deye/day_energy:.* day_energy\
deye_inverter_12345678:deye/total_energy:.* total_energy\
deye_inverter_12345678:deye/ac/l1/voltage:.* AC_L1_voltage\
deye_inverter_12345678:deye/ac/l1/current:.* AC_L1_current\
deye_inverter_12345678:deye/ac/l1/power:.* AC_L1_power\
deye_inverter_12345678:deye/ac/l2/power:.* AC_L2_power\
deye_inverter_12345678:deye/ac/l3/power:.* AC_L3_power\
deye_inverter_12345678:deye/ac/freq:.* freq\
deye_inverter_12345678:deye/uptime:.* uptime\
deye_inverter_12345678:deye/dc/pv1/voltage:.* PV1_voltage\
deye_inverter_12345678:deye/dc/pv1/current:.* PV1_current\
deye_inverter_12345678:deye/dc/pv1/power:.* PV1_power\
deye_inverter_12345678:deye/dc/pv2/voltage:.* PV2_voltage\
deye_inverter_12345678:deye/dc/pv2/current:.* PV2_current\
deye_inverter_12345678:deye/dc/pv2/power:.* PV2_power\
deye_inverter_12345678:deye/dc/pv3/voltage:.* PV3_voltage\
deye_inverter_12345678:deye/dc/pv3/current:.* PV3_current\
deye_inverter_12345678:deye/dc/pv3/power:.* PV3_power\
deye_inverter_12345678:deye/dc/pv4/voltage:.* PV4_voltage\
deye_inverter_12345678:deye/dc/pv4/current:.* PV4_current\
deye_inverter_12345678:deye/dc/pv4/power:.* PV4_power\
deye_inverter_12345678:deye/operating_power:.* operating_power\
deye_inverter_12345678:deye/ac/active_power:.* active_power\
deye_inverter_12345678:deye/radiator_temp:.* radiator_temp\
deye_inverter_12345678:deye/dc/pv1/day_energy:.* PV1_day_energy\
deye_inverter_12345678:deye/dc/pv1/total_energy:.* PV1_total_energy\
deye_inverter_12345678:deye/dc/pv2/day_energy:.* PV2_day_energy\
deye_inverter_12345678:deye/dc/pv2/total_energy:.* PV2_total_energy\
deye_inverter_12345678:deye/dc/pv3/day_energy:.* PV3_day_energy\
deye_inverter_12345678:deye/dc/pv3/total_energy:.* PV3_total_energy\
deye_inverter_12345678:deye/dc/pv4/day_energy:.* PV4_day_energy\
deye_inverter_12345678:deye/dc/pv4/total_energy:.* PV4_total_energy\
deye_inverter_12345678:deye/dc/total_power:.* total_power
attr MQTT2_deye_inverter_12345678 room MQTT2_DEVICE

define FileLog_MQTT2_deye_inverter_12345678 FileLog ./log/MQTT2_deye_inverter_12345678-%Y.log MQTT2_deye_inverter_12345678
attr FileLog_MQTT2_deye_inverter_12345678 logtype text
attr FileLog_MQTT2_deye_inverter_12345678 room MQTT2_DEVICE

Unter Debian habe ich die Software ebenfalls unter /opt installiert, weil ich dafür nicht extra docker verwenden will:
cd /opt
git clone https://github.com/kbialek/deye-inverter-mqtt
pip install paho-mqtt
cd deye-inverter-mqtt

Die Configdatei anpassen (IP-Adressen und WR-Seriennummer)
config.env
DEYE_LOGGER_IP_ADDRESS=192.168.xxx.yyy
DEYE_LOGGER_PORT=8899
DEYE_LOGGER_SERIAL_NUMBER=12345678

MQTT_HOST=192.168.yyy.zzz
MQTT_PORT=1883
MQTT_USERNAME=
MQTT_PASSWORD=
MQTT_TOPIC_PREFIX=deye

LOG_LEVEL=ERROR
DEYE_DATA_READ_INTERVAL=120
DEYE_METRIC_GROUPS=micro

Das vorhandene Skript deye_cli.sh habe ich nur geringfügig angepasst:
deye_daemon.sh
#!/bin/bash
cd $(dirname $0)
set -a; source config.env; set +a
python3 deye_docker_entrypoint.py "$@"

Mein Startskript sieht jetzt so aus:
#!/bin/sh

screen -d -m /opt/deye-inverter-mqtt/deye_daemon.sh

exit 0

Damit bekomme ich die WR-Daten mittels MQTT in FHEM integriert. Ich schiebe sämtliche MQTT Infos direkt an eine InfluxDB weiter.


Hy habe versucht die MQTT Version zu installieren ohne Docker.
bekomme aber den fehler 
/usr/bin/python: No module named venv
dann habe ich in der install.sh

echo "Creating python virtual environment ..."
python -m venv "${DEYE_DIR}/venv" || { echo "Failed!"; exit 1; }
in
echo "Creating python virtual environment ..."
python3 -m venv "${DEYE_DIR}/venv" || { echo "Failed!"; exit 1; }
geändert

bekomme aber dennoch folgende Fehler
root@Server:/opt/deye-inverter-mqtt/systemd# bash install.sh
Give the name of the user that shall run the MQTT bridge.
> fhem
Creating python virtual environment ...
Activating the virtual environment ...
Installing python dependencies ...
Ignoring libscrc: markers 'python_version >= "3.10" and python_version < "4.0"' don't match your env
Ignoring paho-mqtt: markers 'python_version >= "3.10" and python_version < "4.0"' don't match your e
Ignoring wheel: markers 'python_version >= "3.10" and python_version < "4.0"' don't match your envir
Leaving the virtual environment ...
Generating systemd service file ...
Using sudo to install service? [y|n]
> y
Checking sudo command ...
Copying service file ...
Reloading service configurations ...
Unknown command verb deamon-reload.
Starting service ...
Job for deye-inverter-mqtt.service failed because of unavailable resources or another system error.
See "systemctl status deye-inverter-mqtt.service" and "journalctl -xe" for details.

Das vorhandene Skript deye_cli.sh habe ich angepasst wie vorgegeben
#!/bin/bash
cd $(dirname $0)
set -a; source config.env; set +a
python3 deye_docker_entrypoint.py "$@"

Ich bin mit meinem wissen hier am ende und hoffe auf etwas Hilfe.

fhem@Server:~$ systemctl status deye-inverter-mqtt.service
● deye-inverter-mqtt.service - Deye solar inverter MQTT bridge
     Loaded: loaded (/etc/systemd/system/deye-inverter-mqtt.service; enabled; vendor preset: enable>
     Active: failed (Result: resources) since Wed 2023-06-14 06:44:27 CEST; 12min ago
        CPU: 0
lines 1-4/4 (END)


mein System ist Debian Bullseye auf einen 386 intel Atom Rechner Acer Veriton n260G

neobiker

wir wollen nur die skripte aufrufen, NICHT installieren ;-)

Aufruf wie beschrieben, z.B.
 /opt/deye-inverter-mqtt/deye_daemon.sh

Gasmast3r

ZitatAutor neobiker - 02 Juli 2023, 18:31:31
wir wollen nur die skripte aufrufen, NICHT installieren ;-)

Aufruf wie beschrieben, z.B.
 /opt/deye-inverter-mqtt/deye_daemon.sh

Hy sorry das ich so spät wieder schreibe, ich verstehe das nicht

ZitatUnter Debian habe ich die Software ebenfalls unter /opt installiert, weil ich dafür nicht extra docker verwenden will:
CodeAuswählen
cd /opt
git clone https://github.com/kbialek/deye-inverter-mqtt
pip install paho-mqtt
cd deye-inverter-mqtt

ich nutze kein Docker aber stehe auf dem schlauch wie ich es zum laufen bekomme

neobiker