Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Eisbaeeer

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Profile
    • Following 7
    • Followers 7
    • Topics 21
    • Posts 893
    • Best 108
    • Groups 3

    Eisbaeeer

    @Eisbaeeer

    Developer

    Adapter:

    • plexconnect
    • vr200
    • piface
    • onkyo / pioneer
    • alpha2
      AVR für iobroker
    • Ferraris_MQTT_Energy_Counter_Meter_TCRT5000
    • Arduino.Ethernet.Zisterne
    164
    Reputation
    451
    Profile views
    893
    Posts
    7
    Followers
    7
    Following
    Joined Last Online
    Website Http://www.weimars.net Location Ersingen

    Eisbaeeer Follow
    Developer Pro Starter

    Best posts made by Eisbaeeer

    • CO2 Ampel mit MQTT und ESP8266

      Hallo zusammen
      Ich möchte Euch heute ein weiteres ESP8266 Projekt von mir vorstellen. Entstanden in der 2. COVID Welle, habe ich mir ein CO2 Licht für das Wohnzimmer gebaut und programmiert. Also schon ein Weile her.
      logo.jpg
      red.jpg
      Es basiert auf einem OLED-Display, einem NDIR-Sensor für CO2, WS2812 RGB LED´s und einem ESP8266. Der Quellcode ist auf meinem Github verfügbar: https://github.com/Eisbaeeer/CO2light

      Das CO2light zeigt erstmal den CO2 Wert in der Luft an und misst diesen zyklisch. Die Werte werden auf dem OLED Display angezeigt. Die RGB LED´s zeigen nun wie bei einer Ampel die Qualität der Luft an. Insgesamt sind maximal 5 Stufen realisierbar (aber auch weniger), Grün, Gelb, Orange, Rot, Rot-blinkend. Die Schwellwerte sind per Webpage einstellbar. Ebenso die Helligkeit und Farben.
      Durch die Mesststellenbezeichnung kann man noch einen Standort angeben und so mehrere Sensoren im Haus verteilen.
      Config.jpg

      Auf dem Dashboard werden die aktuellen Werte wie RSSI (Wifi Stärke), CO2 Wert, Temperatur des Messmoduls und MQTT Verbindungsstatus angezeigt.
      dashboard.jpg

      In iobroker bekommt man pro Messstelle drei Werte. Das Objekt Brightness ist subscribed und man kann damit die Helligkeit der LED´s beeinflussen. Damit könnte man z.B. in der Nacht die LED´s dunkel schalten. Die LED-Farbe wird noch als HTML Farbcode publiziert. Somit kann man die Farbe auch in VIS oder anderen Visualisierungen weiter verwenden und die Luftqualität in VIS farblich anzeigen.
      iobroker-mqtt.jpg

      Ich bin auf Eure Rückmeldungen gespannt.
      Grüße Eisbaeeer

      posted in Hardware
      Eisbaeeer
      Eisbaeeer
    • RE: Core-Entwicklung zu schnell?

      Puhh, der Thread ist jetzt echt mächtig lang geworden, ABER ich bin überzeugt, dass ich nicht der einzige bin, der jedes Wort mitgelesen hat.
      Ich hätte noch eine letzte Anregung an alle beteiligten. Am besten in einem neuen Thread.
      Bitte überlegt Euch mal, ob ihr neue Entwickler wollt bzw. wo die herkommen könnten. Professionelle Entwickler gibt es viele, nur sind die meist schon irgendwo gebunden. Ich beobachte, dass es sehr viele Leute im Bereich Javascript Adapter gibt, die sehr umfangreiche Scripte erstellen. Teilweise enthalten die viel mehr Code als manche Adapter. Und viele Projekte aus dem Java-Script Adapter sind auch schon von dort in Adapter gewandelt worden. Ich denke, dass es dort noch mehr neue Entwickler geben würde, wenn sie den Einstieg finden würden.
      Das nur noch als Anregung bzw. Gedanke. Eventuell gibt es das Thema ja auch schon bei Euch auf der Agenda.
      Ich wünsche Euch allen einen guten Rutsch ins Neue Jahr 2022.
      Eisbaeeer

      posted in Entwicklung
      Eisbaeeer
      Eisbaeeer
    • RE: Füllstandsmessung per Pegelsonde.

      Ich bin echt überwältigt. Der Thread ist ja megalang. Begonnen haben wir am 19. Nov. 2018 und inzwischen 471 Beiträge. WOW! Meine Sonde läuft nun seit Oktober 2019 ohne Ausfälle. Keine andere Lösung (Ultraschall, kapazitiv, Spannungsteilung) hat bisher so lange gehalten! Und ich habe alle ausprobiert. Die Druckmessung läuft immer noch ohne jede Störung und zeigt mir auch wirklich die richtigen Werte an. Meine Pumpe läuft immer zum bei dem gleichen Füllstand (0 Liter 😉 ) leer. ERGO die Druckmessung ist präzise und genau. Auch wenn die Schwankungen bedingt höher sind, aber die können über entsprechende Filter geglättet werden.

      Meine bisherige Lösung basiert auf einer LAN Anbindung und einem ATMEL 328P mit LAN Modul. Ich lese hier seit Jahren mit und viele Anlagen sind mit ESPEASY realisiert worden. Damals wollte ich die Anbindung unbedingt mit LAN Kabel Realisieren. Meine Frage ist nun, ob sich genügend Interessenten finden, die eine "Solar" Lösung suchen. Genau meine ich damit: Ein ESP8266 oder ESP32 Modul, welches per Solar Modul und Li-Ion Akku versorgt wird und zyklisch die Daten an einen MQTT Server sendet interessiert sind?

      Der Drucksensor und der ESP könnte per Solar versorgt werden. Ohne Kabelverbindung. Als Empfänger könnte ein MQTT Server oder eine separate Anzeige dienen.

      Falls Ihr Interesse an diesem Projekt habt, bitte mal ein Vote über den "gefällt mir" Button:
      be79ae98-ed8a-4054-a5e7-acb5c4f18a4f-image.png

      1c6c56ae-867c-42ec-aaf3-4d12a0fedfc0-image.png

      Grüße Lars

      posted in Praktische Anwendungen (Showcase)
      Eisbaeeer
      Eisbaeeer
    • RE: Ferraris Zähler mit TCRT5000 und esp8266

      Version 0.1 ist online
      Ich habe heute die initiale Version 0.1 hochgeladen. Ich lade hiermit alle dazu ein, den Code zu testen. Falls jemand kein IDE (Arduino IDE) installieren "will / kann", bitte kurz Bescheid geben. Ich kann auch gerne die Binary zur Verfügung stellen. Allerdings sollte das Board dann ein "NodeMCU Ver.1" mit 4MB flash sein, da dies mein Entwicklungsboard ist und ich keine Sonderlösungen compilieren werde!
      Falls ihr (vermeintliche) Fehler findet, bitte hier posten oder noch besser ein issue auf Github erstellen. Dann kann ich direkt auf die Fehler reagieren.
      Ich habe mich dazu entschlossen, den Code auf max. 4 Zähler zu beschränken (sorry @Jey-Cee). Wer noch mehr Zähler erfassen möchte, kann den Code gerne selbst auf die maximalen Eingänge des Prozessors erweitern oder mich nach den Kosten fragen 😉 . Der Code ist soweit verständlich beschrieben.
      Im README.md sind auch noch Links zu Thingiverse. Dort habe ich einen Halter für die TCRT5000 entworfen. Über einen Thumb-up würde ich mich freuen. Auch hier im Forum gibt es die Möglichkeit, den Post zu bewerten. Ich verdiene NULL KOMMA NIX damit.
      Und bitte nehmt das ernst, was im Footer steht. Ich werde keinen Support per E-Mail anbieten. Wenn, dann bitte nur hier im Forum. Dann haben alle etwas davon!
      Nun wünsche ich Euch viel Spaß beim testen. Ich freue mich auf Eure Rückmeldungen!
      Github Code: Link Text
      Thingiverse: Link Text

      Grüße Eisbaeeer

      posted in Hardware
      Eisbaeeer
      Eisbaeeer
    • RE: Core-Entwicklung zu schnell?

      @skokarl Guten Morgen Bernd. Es ist sicher keine Weltuntergangsstimmung und die Argumente von den Core Entwicklern sind natürlich auch alle richtig. Iobroker wird nicht untergehen, nur weil zwei Hobbyprogrammierer keinen neuen Adapter mehr bauen möchten. War vielleicht auch etwas provokant ausgedrückt.
      Fakt ist nun mal, das ein inzwischen so gewaltiges und gutes System wie iobroker sehr komplex wird. Und genau damit haben die Core Entwickler zu kämpfen. Ich weiß, was es bedeutet, denn Gesamtüberblick zu behalten. Und klar, es muss vorwärts gehen, auch wenn dabei ein paar "alte" ungepflegte Adapter rausfliegen. Im schlimmsten Fall findet sich dann jemand, der es fixt. Das ist der Vorteil einer Community.
      Ich finde es gut und wichtig, dass wir diese Diskussion führen. Und auch deine Meinung aus User Sicht. Wie @apollon77 schon sagte, machen wir das alle als Hobby. Das kann uns nur weiterbringen.
      Mein Resümee, ich werde mir Zeit nehmen müssen, um Änderungen mitzubekommen. Discord habe und will ich nicht, das forum hier war für mich bisher die Quelle. Dass es nun mehrere Orte gibt, an denen diskutiert wird macht es natürlich nicht einfacher.
      Ich freue mich auf jeden Fall auf das Dev. Doku Team und bin gespannt. Mit guter Doku wird bestimmt auch vieles einfacher. Wahrscheinlich ist vieles doch einfacher, als ich es bisher mache und ich wusste nur nicht wie.
      Grüße Eisbaeeer

      posted in Entwicklung
      Eisbaeeer
      Eisbaeeer
    • RE: E-INK Display OpenEPaperLink - Displayanzeige mit Batterie

      20240626_223939.jpg

      posted in Praktische Anwendungen (Showcase)
      Eisbaeeer
      Eisbaeeer
    • RE: CO2 Ampel mit MQTT und ESP8266

      CO2 Bauanleitung und Material

      Werkzeug:

      • Kreissäge oder Kapp- Zugsäge
      • Kreisschneider 50mm oder größer
      • Schraubzwingen
      • Lötkolben
      • Seitenschneider
      • Excenterschleifer oder Schwingschleifer
      • Stichsäge
      • Bohrmaschine
      • Schleifpapier
      • Heißkleber

      Material:

      • Buchenholzplatte 16mm (Regalbrett aus dem Baumarkt)
      • Acrylglasplatte 4-6mm (Baumarkt)
      • Holzleim
      • 2 Komponentenkleber
      • Lötzinn
      • Lack aus der Spraydose
      • 8 STück Neodym Magnete (z.B. 7mm x 2mm)
      • WS2812B Stripes 60St./Meter (27 LED´s, 9 je Ring werden benötigt)
      • MH-Z19 Sensor (CO2 Sensor)
      • 1,2" OLED Display (Typ SSD1306)
      • NodeMCU (Version 1 oder höher) oder ähnliches mit ESP8266
      • Netzteil 5V (passend zum NodeMCU)

      Bauanleitung:

      Buchenplatte auf gewünschte Größe zuschneiden (bei mir 5 Stück mit 13cm x 13cm).
      Plexiglas oder Acrylplatte ebenfalls zuschneiden (bie mir 4 Stück mit 13cm x 13cm).
      IN 4 der Buchenplatten in der Mitte mit dem Kreisschneider ein Loch durchbohren. Die 5. Platte ist die unterste und bildet den Fuß.
      In 3 der Plexiglas/Acryl Platten ebenfalls in der Mitte ein Loch mit dem Kreisschneider schneiden. Die 4. Plexiglasplatte bildet den Deckel.
      In die 5. Buchenplatte (den Fuß) in der Mitte einen Ausschnitt für den CO2 Sensor und Netzteil Kabel sägen (Stichsäge oder ähnliches).
      Die gebohrten Plexiglas Platten mit Schleifpapier anrauhen. Den Fuß und eine Bucheplatte mit Loch verleimen.
      Danach abwechselnd eine Plexiglas und Buche Platte verleimen und mit Schraubzwingen trocknen lassen.
      In die oberste Platte (siehe Bilder) in den 4 Ecken ein Loch für die Neodym Magnete bohren (so tief, dass zwei Magnete darin plan verschwinden).
      Ein Magnet einkleben, der andere kommt an die Plexiglas Abdeckung. Die Magnete müssen verklebt werden.
      Die Abdeckung mit Klebeband maskieren (Ausschnitt für das Display soll transparent bleiben). Die Platte dann von einer Seite mit Spraydose lackieren.
      Nach der Trocknung das Display blasenfrei mit dem 2-Komponentenkleber auf das Plexiglas von hinten aufkleben.
      Die LED Streifen von innen an das Plexiglas kleben (mit Heißkleber fixieren) und an den NodeMCU anschließen. Pins siehe Github Code "main.cpp".
      Den CO2 Sensor im Fuß platzieren und fixieren (Heißkleber). CO2 Sensor ebenfalls an den NodeMCU anschließen.
      Das Display an den NodeMCU anschließen.
      Alle Komponenten in dem runden Loch verstauen und den Plexiglas Deckel aufsetzen. Dieser hält mit den Magneten und man kommt jederzeit an die Elektronik.
      Firmware aufspielen (eventuell vorher auf einem Steckbrett aufbauen und testen).

      Ich habe hier nur eine grobe Anleitung aufgeschrieben. Vieles sieht man auch in den Bildern. Bitte dort schauen.

      Quellcode Opensource findet ihr auf https://github.com/Eisbaeeer/CO2light

      Schaut auch gerne mal in meinem Shop vorbei. www.kidbuild.de/shop

      20201206_200022.jpg
      20201217_192509.jpg
      20201217_205104.jpg
      20201217_210859.jpg
      20201218_160241.jpg
      20201218_211302.jpg
      20201218_213909.jpg
      20201218_213909.jpg
      20201218_214007.jpg
      20201218_214045.jpg
      20201218_214151.jpg
      20201218_214432.jpg

      posted in Hardware
      Eisbaeeer
      Eisbaeeer
    • RE: Ferraris Zähler mit TCRT5000 und esp8266

      @klassisch Ja das stimmt sicher, dass man das mit ESPEASY und Scripten in iobroker erschlagen kann. Ich denke da immer an die "User", welche nicht so viel Erfahrung mit Javascript oder Blockly haben und möchte einen leichten Einstieg in iobroker ermöglichen. Die ganzen Funktionen erschlagen den "Erstbenutzer" meist. Da ist es doch schön, wenn man eine "fertige" Lösung hat.
      Meine Philosophie von Adaptern (bzw. Anwendungen, wie dieses Projekt) ist, möglichst alle Funktionen die benötigt werden, direkt zur Verfügung zu stellen. Was passiert z.B. mit dem Zählerstand, wenn ich iobroker warten muss, oder ich eine downtime des Servers habe? Dann stimmt der Zählerstand auch nicht mehr.
      Glaub mir, ich habe schon Erfahrung mit iobroker und vorher ccu.io. Es ist und bleibt open-source. Da ist man nach einem Update nicht davor geschützt, dass etwas nicht läuft. Es wurde schon mega viel getan, damit nichts passiert, aber in der Vergangenheit gab es immer wieder mal Probleme. Deshalb habe ich meine Wärmepumpensteuerung, ehemals Raspi, auf ein MEGA2560 umgestellt und die Firmware selbst geschrieben. Ein Microcontroller ist für Steuerungen gebaut und iobroker ist eben kein Echtzeitbetriebssystem.
      Kurzum, ich finde schon, dass man es den Usern einfacher machen kann und genau deshalb hab ich dieses Projekt gestartet. Ich kann mir gut vorstellen, dass dies die Basis für ein "all-in-one" Zählersystem werden kann. Und Dein Hinweis, dass man den TCRT5000 auch für die Datenkommunikation per IR-Auge verwenden kann, bringt noch eine neue Idee.
      Warum nicht das Projekt auch für smarte Stromzähler verwenden und die Werte 1.8.0 - 1.8.2 und 2.8.0 - 2.8.2 mit auslesen?
      Also meine Idee wäre ein universelles Image für den ESP mit folgenden Möglichkeiten:

      • Strom (Ferraris, smart mit IR-Auge, S0)
      • Gas (Reed-Kontakt, S0) (gibt es den auch schon smart?)
      • Wasser per Impuls (S0)
      • Modbus
        Somit hätte man ein günstiges System, mit dem man alle Energiearten erfassen bzw. auslesen kann.

      Leider (oder zum Glück 😉 ) habe ich bisher nur einen Ferraris, Gas werde ich nie brauchen, da ich eine Wärmepumpe habe. Solar habe ich auch nicht, also kommt eine Rückspeisung erstmal auch nicht vor. Das ganze soll auch nur ein Denkanstoß sein, falls jemand diese ganzen Medien hat und braucht und eventuell auch Arduino IDE oder C beherrscht, kann er hier gerne weiter machen oder mich ansprechen. Mich freut es auf jeden Fall immer wieder (siehe auch Onkyo Adapter), wenn andere auch davon einen Nutzen haben.
      Danke auch an Dich für deine Unterstützung von iobroker. Du hilfst ja auch an jeder Ecke!
      Gruß Eisbaeeer

      posted in Hardware
      Eisbaeeer
      Eisbaeeer
    • Ferraris Zähler mit TCRT5000 und esp8266

      Hallo zusammen.
      Es gibt schon einige Projekte, bei denen ein Ferraris Zähler per Easyesp oder ähnlichen an iobroker angebunden wurden. Diese Lösungen haben aber immer den Nachteil, dass in iobroker noch mit Scripten nachgearbeitet werden muss.
      Hier startet ein Projekt, bei dem mit Hilfe von einem ESP8266 und TCRT5000 Ferraris Zähler an iobroker per MQTT angebunden werden. Der Unterschied zu den bisherigen Lösungen ist folgender:

      • Sämtliche Einstellungen werden auf der Webpage des ESP konfiguriert und im EEProm abgespeichert
      • Die Umdrehungen pro Kilowattstunden sind konfigurierbar
      • MQTT mit Authentifizierung im Browser einstellbar
      • Die Meßwerte werden als echte Werte an iobroker übergeben (kein Umrechnen in iobroker nötig)
      • Der Sensor bekommt ein Gehäuse (3D-Drucker nötig)
      • Der ESP bekommt einen Halter für die Hutschiene (3D-Drucker nötig)
      • Zwei Zähler sind an einen ESP anbindbar (oder brauchen wir mehr?)

      Wer bei Projekt mitmachen möchte oder einfach nur Tester sein möchte ist herzlich eingeladen.
      Gruß Eisbaeeer

      posted in Hardware
      Eisbaeeer
      Eisbaeeer
    • RE: Ferraris Zähler mit TCRT5000 und esp8266

      @kral84
      @Dan-Master

      Leute ihr habt mich animiert. Der bisherige Code basierte auf Arduino IDE. Ich hab das Projekt mal auf vscode und PlatformIO konvertiert. Ich bin mal gespannt, wie lange meine zwei Ferraris Zähler noch drin bleiben. Danach muss wohl wieder der Lötkolben dran und ein Infrarot Auge gelötet werden. Spätestens dann gibt es eine neue Version 😉

      Der Code wurde auf das Framework für ESP8266 Boards angepasst. Ihr könnt die neue Firmware immer noch wie im Post beschrieben über das OTA (over the air) update einspielen: IP-Adresse/update

      Die neue Version liegt auf Github unter binary.

      Hier mal ein paar Screenshots:

      Screen1.png
      Screen2.png
      Screen3.png
      Screen4.png
      Screen5.png
      Screen6.png

      Have FUN!
      https://github.com/Eisbaeeer

      Die Framework Version ist die 0.6
      Da nightly build, kann es sein, dass sie erst am 19.08.21 verfügbar ist. Ich füttere gerade erst noch mein Gitbhub.

      posted in Hardware
      Eisbaeeer
      Eisbaeeer

    Latest posts made by Eisbaeeer

    • RE: OpenEpaperLink - Script für Tastenabfrage

      @beowolf So direkt erstmal nicht. Dazu müsstest du das Script umbauen. Vorstellbar wäre, dass du nur eine Taste zum durchblättern benutzt und die andere zum Toggeln oder schalten.
      Im Code findest du das Abfragen der Tasten hier:

      on(wakeup,function() {
      var pageVal = getState(buttons).val;
      if ( getState(wakeupR).val == 5 ) {
      if (pageVal >= pageCount) {
      setState(buttons, 1 );
      pageVal = 1;
      } else {
      pageVal++;
      setState(buttons,pageVal);
      }
      let waitForSelector = waitForSelectorArray[pageVal];
      console.log("waitForSelector: " + waitForSelector);
      var view = urlOfVISView+pageVal;
      console.log("View: " + view);
      takeScreenshots(pageVal,waitForSelector,view);
      }
      if ( getState(wakeupR).val == 4 ) {
      if (pageVal <= 1 ) {
      setState(buttons,pageCount);
      pageVal = pageCount;
      } else {
      pageVal--;
      setState(buttons,pageVal);
      }
      let waitForSelector = waitForSelectorArray[pageVal];
      console.log("waitForSelector: " + waitForSelector);
      var view = urlOfVISView+pageVal;
      console.log("View: " + view);
      takeScreenshots(pageVal,waitForSelector,view);
      }
      setState(wakeupR,0);
      });
      

      "wakeupR" : 4 ist die linke Taste, 5 die rechte Taste.

      if ( getState(wakeupR).val == 4 ) {
      
      posted in Praktische Anwendungen (Showcase)
      Eisbaeeer
      Eisbaeeer
    • OpenEpaperLink - Script für Tastenabfrage

      Es kam schon öfter die Frage auf, wie man die Tasten an einem EPaper Display für OpenEpaperLink abfragen kann.
      Leider funktioniert der Open-Epaper-Link Adapter derzeit eher mäßig, deshalb habe ich die Funktion des TCP Sockets in das Script übernommen (Danke an @Beowolf ).

      Also was macht das Script?

      • Man erstellt sich mehrere Views, die auf dem Display angezeigt werden sollen.
      • Im Script gibt man die Parameter an
      • Mit den Tasten am Display kann man dann die Seiten "hoch und runterblättern".

      Ich verwende hier ein 4" Touch Display mit integriertem Accesspoint. Das geht aber natürlich auch mit jedem anderen Epaper Display mit Taster.
      Die Uhr wird jede Minute aktualisiert. Macht also nur auf einem Accesspoint Sinn. 😉
      Das Laden der nächsten Seite dauert etwa 5-6 Sekunden. Ganz unten gibt es auch ein Video.

      0d73277b-679b-43e4-b845-21727960e4f4-Clock.png

      2fa511c0-50d2-4cd7-b78f-98b8a9e6e490-Views.png


      {
      "settings": {
      "style": {
      "background_class": ""
      },
      "theme": "redmond",
      "sizex": "480",
      "sizey": "480",
      "gridSize": "",
      "snapType": null,
      "useAsDefault": false,
      "useBackground": false
      },
      "widgets": {
      "e00001": {
      "tpl": "tplScreenResolution",
      "data": {
      "g_fixed": false,
      "g_visibility": false,
      "g_css_font_text": false,
      "g_css_background": false,
      "g_css_shadow_padding": false,
      "g_css_border": false,
      "g_gestures": false,
      "g_signals": false,
      "g_last_change": false,
      "visibility-cond": "==",
      "visibility-val": 1,
      "visibility-groups-action": "hide",
      "signals-cond-0": "==",
      "signals-val-0": true,
      "signals-icon-0": "/vis/signals/lowbattery.png",
      "signals-icon-size-0": 0,
      "signals-blink-0": false,
      "signals-horz-0": 0,
      "signals-vert-0": 0,
      "signals-hide-edit-0": false,
      "signals-cond-1": "==",
      "signals-val-1": true,
      "signals-icon-1": "/vis/signals/lowbattery.png",
      "signals-icon-size-1": 0,
      "signals-blink-1": false,
      "signals-horz-1": 0,
      "signals-vert-1": 0,
      "signals-hide-edit-1": false,
      "signals-cond-2": "==",
      "signals-val-2": true,
      "signals-icon-2": "/vis/signals/lowbattery.png",
      "signals-icon-size-2": 0,
      "signals-blink-2": false,
      "signals-horz-2": 0,
      "signals-vert-2": 0,
      "signals-hide-edit-2": false,
      "lc-type": "last-change",
      "lc-is-interval": true,
      "lc-is-moment": false,
      "lc-format": "",
      "lc-position-vert": "top",
      "lc-position-horz": "right",
      "lc-offset-vert": 0,
      "lc-offset-horz": 0,
      "lc-font-size": "12px",
      "lc-font-family": "",
      "lc-font-style": "",
      "lc-bkg-color": "",
      "lc-color": "",
      "lc-border-width": "0",
      "lc-border-style": "",
      "lc-border-color": "",
      "lc-border-radius": 10,
      "lc-zindex": 0
      },
      "style": {
      "left": "16px",
      "top": "512px"
      },
      "widgetSet": "basic"
      },
      "e00002": {
      "tpl": "tplSvgClock",
      "data": {
      "g_fixed": false,
      "g_visibility": false,
      "g_css_font_text": false,
      "g_css_background": true,
      "g_css_shadow_padding": false,
      "g_css_border": false,
      "g_gestures": false,
      "g_signals": false,
      "g_last_change": false,
      "visibility-cond": "==",
      "visibility-val": 1,
      "visibility-groups-action": "hide",
      "signals-cond-0": "==",
      "signals-val-0": true,
      "signals-icon-0": "/vis/signals/lowbattery.png",
      "signals-icon-size-0": 0,
      "signals-blink-0": false,
      "signals-horz-0": 0,
      "signals-vert-0": 0,
      "signals-hide-edit-0": false,
      "signals-cond-1": "==",
      "signals-val-1": true,
      "signals-icon-1": "/vis/signals/lowbattery.png",
      "signals-icon-size-1": 0,
      "signals-blink-1": false,
      "signals-horz-1": 0,
      "signals-vert-1": 0,
      "signals-hide-edit-1": false,
      "signals-cond-2": "==",
      "signals-val-2": true,
      "signals-icon-2": "/vis/signals/lowbattery.png",
      "signals-icon-size-2": 0,
      "signals-blink-2": false,
      "signals-horz-2": 0,
      "signals-vert-2": 0,
      "signals-hide-edit-2": false,
      "lc-type": "last-change",
      "lc-is-interval": true,
      "lc-is-moment": false,
      "lc-format": "",
      "lc-position-vert": "top",
      "lc-position-horz": "right",
      "lc-offset-vert": 0,
      "lc-offset-horz": 0,
      "lc-font-size": "12px",
      "lc-font-family": "",
      "lc-font-style": "",
      "lc-bkg-color": "",
      "lc-color": "",
      "lc-border-width": "0",
      "lc-border-style": "",
      "lc-border-color": "",
      "lc-border-radius": 10,
      "lc-zindex": 0,
      "quadSize": "80",
      "textSize": "0",
      "isSeconds": false,
      "quadTickColor": "white",
      "quadColor": "white",
      "textColor": "white",
      "tickColor": "white",
      "handsColor": "white",
      "handsColorLine": "white"
      },
      "style": {
      "left": "0px",
      "top": "0px",
      "width": "480px",
      "height": "480px",
      "background": "black",
      "z-index": "0"
      },
      "widgetSet": "timeandweather"
      },
      "e00003": {
      "tpl": "tplTwSimpleDate",
      "data": {
      "g_fixed": false,
      "g_visibility": false,
      "g_css_font_text": true,
      "g_css_background": false,
      "g_css_shadow_padding": false,
      "g_css_border": false,
      "g_gestures": false,
      "g_signals": false,
      "g_last_change": false,
      "visibility-cond": "==",
      "visibility-val": 1,
      "visibility-groups-action": "hide",
      "prependZero": "true",
      "signals-cond-0": "==",
      "signals-val-0": true,
      "signals-icon-0": "/vis/signals/lowbattery.png",
      "signals-icon-size-0": 0,
      "signals-blink-0": false,
      "signals-horz-0": 0,
      "signals-vert-0": 0,
      "signals-hide-edit-0": false,
      "signals-cond-1": "==",
      "signals-val-1": true,
      "signals-icon-1": "/vis/signals/lowbattery.png",
      "signals-icon-size-1": 0,
      "signals-blink-1": false,
      "signals-horz-1": 0,
      "signals-vert-1": 0,
      "signals-hide-edit-1": false,
      "signals-cond-2": "==",
      "signals-val-2": true,
      "signals-icon-2": "/vis/signals/lowbattery.png",
      "signals-icon-size-2": 0,
      "signals-blink-2": false,
      "signals-horz-2": 0,
      "signals-vert-2": 0,
      "signals-hide-edit-2": false,
      "lc-type": "last-change",
      "lc-is-interval": true,
      "lc-is-moment": false,
      "lc-format": "",
      "lc-position-vert": "top",
      "lc-position-horz": "right",
      "lc-offset-vert": 0,
      "lc-offset-horz": 0,
      "lc-font-size": "12px",
      "lc-font-family": "",
      "lc-font-style": "",
      "lc-bkg-color": "",
      "lc-color": "",
      "lc-border-width": "0",
      "lc-border-style": "",
      "lc-border-color": "",
      "lc-border-radius": 10,
      "lc-zindex": 0,
      "shortYear": true,
      "shortWeekDay": false,
      "showWeekDay": false,
      "monthWord": false,
      "shortMonth": false,
      "noClass": true
      },
      "style": {
      "left": "19px",
      "top": "22px",
      "color": "white",
      "font-size": "xx-large",
      "z-index": "1"
      },
      "widgetSet": "timeandweather"
      }
      },
      "name": "Tag4Zoll1",
      "filterList": []
      }


      // #############################################
      // Author: Eisbaeeer
      // Date: 20250519
      //
      // Dieses Script ermöglicht es, mit einem OpenEpaperTag und Tastern an dem Display (oder touch mit 4" Display), mehrere View´s durchzublättern. Die Tasten werden zum vor- bzw. zurückblättern
      // verwendet. Bevor das Script verwendet werden kann, müssen die Views angelegt werden. Die Views werden durchnummeriert, beginnend bei 1. Der "Basis" Name der View muss unten konfiguriert werden.
      // Die Anzahl der verwendeten Seiten werden mit "pageCount" konfiguriert.
      // Für jede View muss noch der Selektor 'waitForSelectorArray' definiert werden. Im Beispiel wartet puppettier beim View1 auf den Selector '#w00042'.
      // Die Erste View ist eine Uhr, welche jede Minute aktualisiert wird.
      //
      // In dem Script wird die Socket-Verbindung von Beowolf verwendet (https://forum.iobroker.net/topic/66380/e-ink-display-openepaperlink-displayanzeige-mit-batterie/809?_=1747419968864)
      //
      // Version: 0.4 : 20250519 Added socket
      // Version: 0.3 : 20250518 AP-4" kann in Verbindung mit iobroker.open-epaper-llink Adapter mehrere Ansichten durchblättern
      // Version 0.2 : Bugfix async pictures
      // Version: 0.1 : Convert from Blockly to js
      //
      // Benötigt:
      // - Puppeteer Adapter
      // - Chrome Headless
      //
      // #############################################
      // Hier die Anpassungen vornehmen!

      const urlOfVISView = 'http://192.168.1.200:8082/vis/index.html?OpenEpaper#Tag4Zoll'; // Eure View oder URL vom Bild + Nummer der View beginnend bei 1
      const targetWidth = 480; // Breite des Displays
      const targetHeight = 480; // Höhe des Displays
      const cutoutX = 0; // Abstand Pixel von links für Screenshot
      const cutoutY = 0; // Abstand Pixel von oben für Screenshot
      const pquality = 100; // Bildqualität
      const pageCount = 3; // Anzahl der Seiten zum Durchblättern
      const waitForSelectorArray = ["","#w00042","#w00044","#w00053"]; // Letztes Element auf das Peppeteer wartet als Array
      const inputPath = "/tmp/Tag01_480x480"; // Screenshot temporär Format: /Pfad/prefix
      const accesspointIP = '192.168.1.78'; // Accesspoint IP Adresse
      const macAddress = '0000840B822F3728'; // MAC-Adresse des Displays anpassen
      const ditherValue = 1; // Setze den Dither-Wert (Farbanpassungen: 0 = View hat gleiche Farben | 1 = View hat andere Farben als das Display
      const autostart = true; // Websocket automatisch starten? true|false

      // ENDE Anpassungen! Ab hier nichts mehr ändern!
      // #############################################

      var buttons = '0_userdata.0.open-epaper-link.Tag_Buttons.' + macAddress + '.page';
      createState(buttons,1);
      var uploadUrl = 'http://' + accesspointIP + '/imgupload';
      var wakeupR = '0_userdata.0.open-epaper-link.Tag_Buttons.' + macAddress + '.wakeupReason';
      var wakeup = '0_userdata.0.open-epaper-link.Tag_Buttons.' + macAddress + '.lastseen';

      schedule("* * * * *", function() {
      console.log("Send clock page every minute if pageVal is 1");
      var pageVal = getState(buttons).val;
      console.log("Page: " + pageVal);
      let waitForSelector = waitForSelectorArray[pageVal];
      console.log("waitForSelector: " + waitForSelector);
      var view = urlOfVISView+pageVal;
      console.log("View: " + view);
      if ( pageVal == 1 ) {
      takeScreenshots(pageVal,waitForSelector,view);
      }
      });

      on(wakeup,function() {
      var pageVal = getState(buttons).val;
      if ( getState(wakeupR).val == 5 ) {
      if (pageVal >= pageCount) {
      setState(buttons, 1 );
      pageVal = 1;
      } else {
      pageVal++;
      setState(buttons,pageVal);
      }
      let waitForSelector = waitForSelectorArray[pageVal];
      console.log("waitForSelector: " + waitForSelector);
      var view = urlOfVISView+pageVal;
      console.log("View: " + view);
      takeScreenshots(pageVal,waitForSelector,view);
      }
      if ( getState(wakeupR).val == 4 ) {
      if (pageVal <= 1 ) {
      setState(buttons,pageCount);
      pageVal = pageCount;
      } else {
      pageVal--;
      setState(buttons,pageVal);
      }
      let waitForSelector = waitForSelectorArray[pageVal];
      console.log("waitForSelector: " + waitForSelector);
      var view = urlOfVISView+pageVal;
      console.log("View: " + view);
      takeScreenshots(pageVal,waitForSelector,view);
      }
      setState(wakeupR,0);
      });

      // Requirements
      const puppeteer = require('puppeteer');
      const axios = require('axios');
      const fs = require('fs');
      const FormData = require('form-data');

      async function takeScreenshots(pageVal,waitForSelector,view) {
      console.log("*** function takeScreenshot");
      sendTo('puppeteer.0', 'screenshot', {
      url: view,
      path: inputPath+macAddress+pageVal+'.jpg',
      width: targetWidth,
      height: targetHeight,
      quality: pquality,

          waitOption: {
              waitForSelector: waitForSelector,  
              waitForTimeout: 10000              
          },
       
          fullPage: false,                       
       
          clip: {         
              x: cutoutX,                        
              y: cutoutY,                        
              width: targetWidth,                
              height: targetHeight               
          }
      }, obj => {
        if (obj.error) {
          log(`Error taking screenshot: ${obj.error.message}`, 'error');
        } else {
          // the binary representation of the image is contained in `obj.result`
          log(`Successfully took screenshot: ${obj.result}`);
          console.log("*** upload Image");
          // uploading Screenshot
          async function uploadImage() {
      	try {
      		// Prüfen, ob die Datei existiert
      		if (!fs.existsSync(inputPath+pageVal+'.jpg')) {
      		throw new Error(`Datei nicht gefunden: ${inputPath+macAddress+pageVal+'.jpg'}`);
      	}
      // FormData erstellen
      const form = new FormData();
      form.append("mac", macAddress);
      form.append("dither", ditherValue); // Dither-Parameter hinzufügen
      form.append("file", fs.createReadStream(inputPath+macAddress+pageVal+'.jpg'));
      // POST-Anfrage senden
      const response = await axios.post(uploadUrl, form, {
      headers: {
      	...form.getHeaders(),
      },
      });
      
      console.log('Upload erfolgreich:', response.data);
      } catch (error) {
      if (error.response) {
      	console.error('Server-Antwort:', error.response.status, error.response.data);
      } else if (error.request) {
      	console.error('Keine Antwort erhalten:', error.request);
      } else {
      	console.error('Fehler beim Hochladen:', error.message);
      }
      }
      }
      uploadImage();
      }
      })
      

      }

      const WebSocket = require('ws');
      const http = require('http');
      const wsUrl = ws://${accesspointIP}/ws; // WebSocket-URL

      let ws;
      let pingInterval;
      let scriptStopping = false; // Flag, um zu prüfen, ob das Skript gestoppt wird

      const controlState = '0_userdata.0.open-epaper-link.Start'; // Datenpunkt zur Steuerung des Skripts - anhalten oder starten

      function ensureOpenEPaperLinkFolderExists(callback) {
      const OpenEPaperLinkFolderPath = '0_userdata.0.open-epaper-link.Tag_Buttons';
      getObject(OpenEPaperLinkFolderPath, (err, obj) => {
      if (err || !obj) {
      setObject(OpenEPaperLinkFolderPath, {
      type: 'channel',
      common: { name: 'Open E-Paper Link' },
      native: {}
      }, callback);
      } else {
      callback();
      }
      });
      }

      function ensureChannelExists(path, alias, callback) {
      getObject(path, (err, obj) => {
      if (err || !obj) {
      setObject(path, {
      type: 'channel',
      common: { name: alias || 'Unbekanntes Gerät' },
      native: {}
      }, callback);
      } else if (obj.common.name !== alias) {
      extendObject(path, { common: { name: alias } }, callback);
      } else {
      callback();
      }
      });
      }

      function createStateAndSet(statePath, value) {
      setObject(statePath, {
      type: 'state',
      common: {
      name: statePath.split('.').pop(),
      type: 'string',
      role: 'value',
      read: true,
      write: true
      },
      native: {}
      }, (err) => {
      if (!err) {
      setState(statePath, String(value), true);
      }
      });
      }

      function updateStateIfChanged(statePath, value) {
      getState(statePath, (err, state) => {
      if (err || !state) {
      createStateAndSet(statePath, String(value));
      } else if (state.val !== String(value)) {
      setState(statePath, String(value), true);
      }
      });
      }

      function fetchDimensions(hwType, callback) {
      const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase(); // Convert hwType to two-digit uppercase hexadecimal
      const url = http://${accesspointIP}/tagtypes/${hwTypeHex}.json;
      http.get(url, (res) => {
      let data = '';
      res.on('data', (chunk) => data += chunk);
      res.on('end', () => {
      if (res.statusCode === 200) {
      try {
      const dimensions = JSON.parse(data);
      callback(null, dimensions);
      } catch (e) {
      callback(Error parsing JSON from ${url}: ${e});
      }
      } else {
      callback(HTTP Error ${res.statusCode} from ${url});
      }
      });
      }).on('error', (err) => {
      callback(Error fetching ${url}: ${err.message});
      });
      }

      function handleHWType(basePath, hwType) {
      createStateAndSet(${basePath}.hwType, String(hwType)); // Save hwType as a state
      fetchDimensions(hwType, (err, dimensions) => {
      if (!err && dimensions) {
      createStateAndSet(${basePath}.height, String(dimensions.height));
      createStateAndSet(${basePath}.width, String(dimensions.width));
      createStateAndSet(${basePath}.name, String(dimensions.name));
      if (dimensions.colors) {
      createStateAndSet(${basePath}.colors, String(dimensions.colors));
      }
      if (dimensions.colortable) {
      createStateAndSet(${basePath}.colortable, JSON.stringify(dimensions.colortable));
      }
      } else {
      // console.error(Failed to fetch or set dimensions for hwType ${hwType}: ${err});
      }
      });
      }

      function connectWebSocket() {
      if (scriptStopping) {
      return; // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
      }

      ws = new WebSocket(wsUrl);
      ws.on('open', function open() {
          // console.log('Verbunden mit WebSocket');
          startHeartbeat();
      });
      
      ws.on('message', function incoming(data) {
          // console.log('Daten empfangen:', data);
          if (data) {
              try {
                  let parsedData = JSON.parse(data);
                  // console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
                  handleData(parsedData);
              } catch (err) {
                  // console.error('Fehler bei der Verarbeitung der Daten:', err);
              }
          } else {
              // console.log('Keine Daten oder leere Nachricht empfangen');
          }
      });
      
      ws.on('close', function close() {
          if (!scriptStopping) {
              // console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
              clearInterval(pingInterval);
              setTimeout(connectWebSocket, 5000);
          }
      });
      
      ws.on('error', function error(err) {
          // console.error('WebSocket-Fehler:', err);
      });
      

      }

      function startHeartbeat() {
      pingInterval = setInterval(() => {
      if (ws.readyState === WebSocket.OPEN) {
      ws.ping(() => {
      // console.log('Ping sent');
      });
      }
      }, 10000); // Send ping every 10 seconds

      ws.on('pong', () => {
          // console.log('Pong received');
      });
      

      }

      function handleData(parsedData) {
      if (parsedData.tags && Array.isArray(parsedData.tags)) {
      parsedData.tags.forEach(tag => {
      let basePath = 0_userdata.0.open-epaper-link.Tag_Buttons.${tag.mac.replace(/:/g, '')};
      ensureChannelExists(basePath, tag.alias, () => {
      Object.keys(tag).forEach(key => {
      let statePath = ${basePath}.${key};
      let value = tag[key];
      updateStateIfChanged(statePath, value);
      if (key === 'hwType') {
      handleHWType(basePath, tag.hwType);
      }
      });
      });
      });
      }
      }

      function disconnectWebSocket() {
      if (ws) {
      ws.close();
      ws = null;
      }
      clearInterval(pingInterval);
      }

      // Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
      function setupScriptControl() {
      if (autostart == true) {
      ensureOpenEPaperLinkFolderExists(connectWebSocket);
      }
      setObject(controlState, {
      type: 'state',
      common: {
      name: 'EPaper Script Control',
      type: 'boolean',
      role: 'switch',
      read: true,
      write: true,
      def: false
      },
      native: {}
      });

      on({id: controlState, change: 'ne'}, (obj) => {
          const state = obj.state.val;
          if (state) {
              // Skript starten
              scriptStopping = false;
              ensureOpenEPaperLinkFolderExists(connectWebSocket);
          } else {
              // Skript stoppen
              scriptStopping = true;
              disconnectWebSocket();
              // console.log('Skript beendet durch Steuer-Datenpunkt');
          }
      });
      

      }

      // Initiale Einrichtung
      setupScriptControl();

      6807aa39-be12-4cbf-85e1-666b3c46749b-20250519_202102.jpg
      64c057dd-e8d9-428f-80c0-c3d6e928ddc0-20250519_202121.jpg
      674ec975-4bd9-482d-81b0-7e96eabf10ce-20250519_202136.jpg

      https://youtube.com/shorts/G4g4ynx-t_k?feature=share

      posted in Praktische Anwendungen (Showcase)
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow Wallbox AC011E-01 erfolgreich mit Modbus eingebunden

      @kklaus
      Ändere mal deinen Faktor im Modbus Register. Der ist falsch gesetzt im Github. So sollte er aussehen, dann stimmen deine KWh.
      8acede95-b3f7-42dc-a2bb-8584bde6934d-image.png

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow Wallbox AC011E-01 erfolgreich mit Modbus eingebunden

      @maddm @kklaus
      Ich möchte nochmal genauer erklären, wie ich meine Wallbox über VIS ansteuere. Voraussetzung ist, dass man einen Sungrow Wechselrichter mit EMS hat (z.B. SH-10RT, etc.) und eine Wallbox AC011E-01 über Modbus am WR.

      Um die Wallbox im slave Mode anzusteuern, muss dies über das EMS des Wechselrichters gemacht werden. Ein Ändern der Register der Wallbox bringt nix! Das ist nur für den "Standalone" Modus gedacht. Irgendwie auch logisch, wenn die WB am WR hängt und der ein EMS hat.

      Also was kann man machen und was muss eingestellt sein?

      • Die Wallbox muss "enabled" sein (normalerweise sollte das so sein, bitte die Register siehe unten der Wallbox prüfen).
      • Es muss kein Fahrzeug angeschlossen sein, damit man die Einstellungen auch in der iSolar Cloud sieht. Die Einstellungen, die man im WR macht, sind ein paar Sekunden später in der App sichtbar. Wenn nicht, hat etwas nicht geklappt. Protokolle im iobroker prüfen, Modbus Instanz prüfen.

      Hier eine Auflistung, die ich über VIS einstelle:

      1. Charger enablen:		modbus.1.holdingRegisters.21210_Charger_Enable	
      				Charger Enable |  0=disable 1=enable	 --> 1
      
      2. EMS am Wechselrichter:	modbus.0.holdingRegisters.33540_WB_charging_mode wb charging mode 
      				(160=fastCharge 161=pvSurplus 162=quantity&timeBased 163=userDefined) --> was auch immer ihr wollt
      
      				modbus.0.holdingRegisters.33541_WB_charching_quantity
      				wb charching quantity (e.g. 12kwh = 120) --> 60
      
      				modbus.0.holdingRegisters.33542_WB_charching_duration
      				Unix-Timestamp --> Timestamp
      
      				modbus.0.holdingRegisters.33544_WB_charching_power_user_defined_charge
      				wb user defined charching (eg. 10A = 100) --> 60 entspricht 6A Ladestrom (lässt sich nur im charging mode 163 setzen)
      
      				modbus.0.holdingRegisters.33545_WB_user_defined_charge_start_time
      				modbus.0.holdingRegisters.33547_WB_user_defined_charge_end_time_
      				Unix-Timestamp --> Timestamp
      
      				modbus.0.holdingRegisters.33549_WB_surplus_power_from_grid_
      				wb surplus 85=NO 170=YES	--> Mit Netzbezug 170 setzen
      

      Die Modbus Register findet ihr im Github.
      Grüße Lars

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow Wallbox AC011E-01 erfolgreich mit Modbus eingebunden

      @kklaus Bitte achte darauf, dass im Modbus Adapter das Word geswapt werden muss.
      9e460c28-5619-4900-80f7-bf1634d02eea-image.png

      Dann sollte deine Anzeige passen.
      VG Lars

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: TESTER: Neuer Adapter Webuntis

      Ich habe eben mal den Adapter installiert und bekomme sehr wenig Infos:
      e9fca9c2-878b-487d-ac10-a50860af6670-image.png

      Im Log steht, dass er den Kalender nicht abrufen kann. In der Weboberfläche sehe ich den Kalender aber.

      --- Edit ---
      Ok, mit dem Account vom Schüler bekomme ich den Stundenplan (macht irgendwie auch Sinn).
      Leider sind im Adapter die Klassenarbeiten nicht ersichtlich. Hat da schon jemand eine Lösung?
      VG Lars

      posted in Tester
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden

      @chris0706
      Ich nutze zwei Instanzen.
      Eine zum LAN vom SGH10RT und eine zum Winet-S.
      Über die GUI vom Winet-S (Browser) bekommst du die ID´s.
      Schau mal im Github ein paar Posts weiter oben. Da ist ein Screenshot von den ID´s vom Winet-S.

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden

      @chris0706 Hast du einen Winet-S? Über den solltest du die ID´s sehen.

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow Wallbox AC011E-01 erfolgreich mit Modbus eingebunden

      @maddm
      Erstmal tut es ja nicht weh, wenn du die Holding und Input Register komplett einliest.
      Ich empfehle dir die Register von https://github.com/Eisbaeeer/sungrow über import in deinen iobroker modbus Adapter einzulesen.

      Ob du dann die Holding Register beschreibst, bleibt dir ja überlassen.

      Beschreibbar sind nur die Holding Register.

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    • RE: Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden

      @silgri sagte in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:

      Dazu lese ich den DTSU, welcher vor dem Netzübergabepunkt hängt, per Modbus-Adapter über einen Protoss PE-11 alle 600ms Sekunden aus.
      Über 13050 und 13051 steuere ich das Laden und Entladen der BYD, je nach Bedarf, z.B. auch Warmwasser Boiler.
      E-Auto kommt wohl nächstes Jahr noch dazu.

      Sehr interessant. Ich glaube wir müssen uns mal unterhalten 😉
      Deine Konstellation ist auch "besonders". Ich lese auch immer wieder, dass sich Kaskade nicht rentiert. 🙂
      Argumente sind oft Zählermiete, etc. Letztendlich muss man sich das ausrechnen. Mir ist auch klar, dass ich damit keine 100€ einspare, aber warum soll ich meine WP (indirekt) mit dem "teuren" Haushaltsstrom speisen, wenn ich den Akku für den Haushalt verwenden kann.

      @carsten-sauermann sagte in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:

      1. Macht es eigentlich keinen Sinn, denn so oder so brauchst du am Ende dieselbe Leistung aus dem Netz. Bzw. Wenn du dann am nächsten Tag noch ladung im Akku hast "verschenkst" die diese.

      Der Einwand ist richtig. Mein Akku (10KWh) ist im Sommer manchmal morgens nicht vollständig entladen. Das ist aber sehr selten (ca. 5x um 5 oder 6 Uhr über das ganze Jahr). Meine Frau belädt aber dann beim Aufstehen die Waschmaschine und bis 7 Uhr ist er dann immer leer bis die Sonne wieder auflädt. Eventuell kann sich das ja bei meiner Optimierung noch ändern, aber dann würde ich die Optimierung einfach um 2 Uhr morgens ausschalten. Meine Grundwasserwärmepumpe startet jede Nacht gegen 3 Uhr und würde den Akku dann vollends leer ziehen und anschließend über den Wärmestrom beziehen.

      Das ganze ist schon "Jammern" auf hohem Niveau. Optimum ist, wenn sich der Akku einmal am Tag vollständig entlädt. Aber warum sollte man sowas nicht auch noch optimieren?

      Das interne EMS von Sungrow ist schon ziemlich gut. Ich würde am liebsten nur auf "manuelle" Steuerung umschalten, wenn die Wärmepumpe läuft und von der PV nichts mehr kommt. @silgri du machst dein EMS komplett selbst in iobroker?

      posted in ioBroker Allgemein
      Eisbaeeer
      Eisbaeeer
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo