Ankündigung

Einklappen
Keine Ankündigung bisher.

Neu: Vbus Solarregler Resol -> Arduino -> Klartext über USB-Seriell (inkl. WG Plugin)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Neu: Vbus Solarregler Resol -> Arduino -> Klartext über USB-Seriell (inkl. WG Plugin)

    Hallo zusammen,

    hier habe ich vor über zwei Jahren ein Plugin für das Wiregate veröffentlicht, um einen Resol Solarregler anzubinden. Ein Problem des Plugins ist, daß der Solarregler den Status nur von sich aus sendet und nicht auf Anfrage. Daher muß das Plugin auf ein eingehendes Paket warten und blockiert in der Zeit (AFAIR bis zu 2sec) alle anderen Aktionen/Plugins des Wiregated (soweit ich das verstanden habe).
    Mir kam die Idee, daß ein Arduino hilfreich sein könnte: eingehende Pakte werden zwischengespeichert und auf Anforderung dekodiert und als Klartext geschickt.Damit kann die Lösung überall leicht eingesetzt werden. Egal welcher Computer oder welche Programmiersprache (solange USB vorhanden ist und der Arduino als COM-Port erkannt wird).

    Es reicht ein simpler Arduino Nano. Durch seine Stiftleisten kann er auch auf Steckbretter gesetzt werden.
    WICHTIG: wer sich einen günstigen Nachbau des Nano kaufen will, sollte darauf achten, daß ein FTDI-Chip drauf ist. Viele Nachbauten bei Ebay haben z.B. einen CH340 drauf. So weit ich mich erinnere kann es damit zu Problemen kommen (speziell unter Linux). Die Information mag veraltet oder gar falsch sein, aber FTDI ist mit Sicherheit die problemlosere Variante.
    • Der Adapter von VBus zu TTL aus dem verlinktem Thread wird immer noch benötigt
    • Ich habe den Nano auf so ein winziges 170 Pin Steckbrett gesteckt.
    • Zumindest unter Perl wird beim Öffnen der seriellen Schnittstelle ein Reset des Arduinos ausgelöst. Ungeschickt wenn man eigentlich das letzte empfangene Paket abholen will. Die Lösung ist ein mindestes 10µF großer Kondensator zwischen GND und RST. Freundlicherweise sind die beiden Pins am Nano direkt nebeneinander und ein Elko mit 2,54mm Rastermaß paßt direkt. Es gibt wohl auch Möglichkeiten das im (Perl-)Skript zu lösen, aber der Elko ist IMHO die intelligentere Lösung, da er immer funktioniert (egal wer oder was die serielle Verbindung aufbaut).
      WICHTIG: mit dem Elko läßt sich der Nano nicht mehr über USB programmieren. Der Reset wird genutzt, um den Bootloader zu starten. Auf dem Steckbrett kann man den Elko einfach entfernen. Wenn man den Nano aber auf eine andere Platine stecken möchte, sollte man eine Trennmöglichkeit vorsehen (Jumper).
    • Der Arduino wird per USB mit Strom versorgt und liefert an einem Pin 5V mit denen man die Konverter aus dem ersten Link versorgen kann. Und natürlich GND an GND
    • Der Nano hat nur eine serielle Schnittstelle, welche am USB-Port zur Verfügung steht. Zum Glück gibt es mit "SoftwareSerial" eine Library, welche einen UART an I/O-Pins abbildet. Der Soalrregler kommuniziert nur mit 9600bit/s. Dafür reicht es dicke.
      In Zeile 11 werden die Digtial-Pins definiert: SoftwareSerial VBusSerial(8, 11); // RX, TX */
      In diesem Fall ist RX an D8 und TX an D11 (siehe Beschriftung auf der Platine). Damit muß D8/RX mit TX vom Konverter verbunden werden. D11/TX kann man in diesem Fall ignorieren, da keine Daten zum Solarregler geschickt werden sollen
    • Der beigefügte Code kann über die Arduino IDE in den Nano geladen werden. Einfach in das Fenster pasten und speichern. Im Tools-Menü muß noch Board, CPU und Port angepaßt werden (Arduino Nano, ATmega328. Unter Port sollte der Nano zu sehen sein)
      Eventuell muß vorher noch die Library SoftwareSerial installiert werden: Menü Sketch\Include Library\Manage Libraries...


    Wer nicht gerade den gleichen Solarregler wie ich besitzt, muß im Code noch einiges anpassen:
    Code:
    const byte vbus_metercount = 12;                        //  Anzahl der zu analysierenden Werte
                                                // vbus_text: Array für die Bezeichnung der Werte
    const char* vbus_text[vbus_metercount] = {    "KOL",        //    Temperatur Kollektor
                                                "TSP",        //    Temperatur Speicher
                                                "ZUL",        //    Temperatur Zulauf
                                                "RUE",        //    Temperatur Ruecklauf
                                                "PDZ",        //    Drehzahl Pumpe
                                                "PBS",        //    Betriebsstunden Pumpe
                                                "ERR",        //    ErrorMask
                                                "SKL",        //    Sensor Kollektor defekt
                                                "STS",        //    Sensor Speicher defekt
                                                "SZU",        //    Sensor Zufluss defekt
                                                "SRU",        //    Sensor Ruecklauf defekt
                                                "STA" };    //    Statusmask
    
    
    
                    //                              Offset, bitsize, bitpos, Divider, signed
    const int vbus_meters[vbus_metercount][5] = {    {  0,      15,     -1,      10,      1 },
                                                    {  2,      15,     -1,      10,      1 },
                                                    {  4,      15,     -1,      10,      1 },
                                                    {  6,      15,     -1,      10,      1 },
                                                    {  8,       8,     -1,       0,      0 },
                                                    { 10,      16,     -1,       0,      0 },
                                                    { 20,      16,     -1,       0,      0 },
                                                    { 20,       1,      0,       0,      0 },
                                                    { 20,       1,      1,       0,      0 },
                                                    { 20,       1,      2,       0,      0 },
                                                    { 20,       1,      3,       0,      0 },
                                                    { 24,      32,     -1,       0,      0 } };
    
    
    const unsigned int vbus_source = 0x427b;    // ID of your own solar device
    const unsigned int vbus_buffersize = 64;    // size in bytes of a valid packet
    vbus_metercount: Anzahl der Werte. Muß unbedingt mit der Anzahl der Einträge der nächsten beiden Arrays entsprechen.
    vbus_text: beliebiger Text, der dem jeweiligem Wert vorangestellt wird. Z.B.: "KOL" für die Kollektor Temperatur: KOL:62.5
    vbus_meters: siehe anderes Posting zum Ermitteln der Daten aus der entsprechenden XML-Datei. Achtung: im XML ist ein "factor", hier muß aber ein Divisor angegeben werden. Wenn der factor 0.1 ist, ist der "Divider" 10.
    vbus_source: die Adresse des Solarreglers. Pakete mit einer anderen Adresse werden verworfen! Siehe ersten Link.
    vbus_buffersize: Größe der eingehenden Pakete. Ich weiß leider nicht mehr, woher ich den Wert habe und ob der sich ändern kann... Im Zweifellsfall vorher mit einem Terminalprogramm ermitteln.

    Der Arduino kann als Schnittstelle für das "Resol Servicecenter" dienen. Dafür muß er zuerst in den Bridge-Modus gebracht werden:
    Beliebiges Terminalprogramm (z.B. HTerm) öffnen und 115200,8n1 einstellen und die Verbindung öffnen. Danach ein einzelnes "b" senden. Der Arduino ändert die Geschwindigkeit auf 9600. Nach Disconnect, anpassen auf 9600 und wieder verbinden sollten einzelne Daten kommen. In HTerm kann man "HEX" zum besseren Ablesen der Pakete aktivieren. Unter "Tools\Modify newline at..." fügt man einen neuen Eintrag hinzu: "Line end marker": HEX AA
    Diesen wählt man bei "Newline at" aus. Damit erhält man einen Zeilenumbruch bei jedem neuen Paket (diese beginnen mit 0xAA).
    Jetzt HTerm schließen und das Resol Servicecenter starten. Damit sollte sich jetzt eine Verbindung zum Solarregler aufbauen lassen.
    Der Arduino kann nur durch einen Reset wieder in den normalen Betrieb zurückgeholt werden.

    Im Normalbetrieb sammelt der Arduino eingehende Daten und immer wenn ein Paket vollständig ist, wird dieses zwischengespeichert. es erfolgt keine selbstständige Ausgabe. Durch senden eines einzlenen "s" wird das letzte valide Paket analysiert und die Werte ausgegeben. Z.B. "KOL:7.50 TSP:27.80 ZUL:30.90 RUE:888.80 PDZ:0 PBS:8331 ERR:0 SKL:0 STS:0 SZU:0 SRU:0 STA:0 AGE:229340"
    Mein Kollektor (KOL) hat gerade 7,5°C und der Pufferspeicher (TSP) 27,8°C. Der Eintrag AGE gibt das Alter des Pakets in Microsekunden aus.
    Die Werte sind TAB-getrennt und lassen sich damit schön zerlegen.

    Durch den FTDI-Chip wird der Nano vom Wiregate sofort erkannt und eingerichtet. Ein passendes Plugin gibt es natürlich auch. Weil der Arduino die ganze Arbeit macht und das Plugin nicht warten muß bis ein Paket ankommt, benötigt das Plugin weniger als 100msec.
    Code:
    2016-05-16 01:03:31.206,Resol_Arduino, reading conf file [/etc/wiregate/plugin/generic/conf.d/Resol_Arduino.conf].
    2016-05-16 01:03:31.210,Resol_Arduino,conf file [/etc/wiregate/plugin/generic/conf.d/Resol_Arduino.conf] returned result[28]
    2016-05-16 01:03:31.222,Resol_Arduino,Serielle Schnittstelle erfolgreich geöffnet: '/dev/usbserial-1-4.5'
    2016-05-16 01:03:31.232,Resol_Arduino,'Return' received
    2016-05-16 01:03:31.233,Resol_Arduino,Time needed: 0.028102
    2016-05-16 01:03:31.233,Resol_Arduino,Answer: 'KOL:7.50    TSP:27.80    ZUL:30.90    RUE:888.80    PDZ:0    PBS:8331    ERR:0    SKL:0    STS:0    SZU:0    SRU:0    STA:0    AGE:229340'
    2016-05-16 01:03:31.233,Resol_Arduino,Temperatur Kollektor: 7.50°C
    2016-05-16 01:03:31.242,Resol_Arduino,Temperatur Speicher: 27.80°C
    2016-05-16 01:03:31.246,Resol_Arduino,Temperatur Vorlauf: 30.90°C
    2016-05-16 01:03:31.251,Resol_Arduino,Temperatur Sensor 4: 888.80°C
    2016-05-16 01:03:31.256,Resol_Arduino,Drehzahl Pumpe: 0%
    2016-05-16 01:03:31.260,Resol_Arduino,Betriebsstunden Pumpe: 8331h
    2016-05-16 01:03:31.266,Resol_Arduino,ErrorMask: 0
    2016-05-16 01:03:31.266,Resol_Arduino,Sensor Kollektor defekt: 0
    2016-05-16 01:03:31.271,Resol_Arduino,Sensor Speicher defekt: 0
    2016-05-16 01:03:31.278,Resol_Arduino,Sensor Zufluß defekt: 0
    2016-05-16 01:03:31.283,Resol_Arduino,Sensor 4 defekt: 0
    2016-05-16 01:03:31.290,Resol_Arduino,Statusmaske: 0
    2016-05-16 01:03:31.290,Resol_Arduino,Alter: 229340µs
    2016-05-16 01:03:31.290,Resol_Arduino,Time needed: 0.086042
    2016-05-16 01:03:31.297,Resol_Arduino,1,0s,
    In der Resol_Arduino.conf müssen die gleichen Einträge wie bei vbus_text stehen.
    Code:
    %values = (
                KOL    => {  Name_en=>'Temperature sensor 1'    , Name_de=>'Temperatur Kollektor'    ,    Unit=>'°C',    GA=>'3/7/0' , DPT=>'9.001' },
                TSP    => {  Name_en=>'Temperature sensor 2'    , Name_de=>'Temperatur Speicher'     ,    Unit=>'°C',    GA=>'3/7/1' , DPT=>'9.001' },
    .......
            );

    Mehr fällt mir erstmal nicht ein.
    Das war mein erstes Arduinoprojekt und mein erstes C++-Programm. Also bitte ich um ein bisschen Nachsicht, falls etwas nicht so elegant gelöst wurde.

    Wenn es Fragen gibt: stellen :-)
    VBus.zip
    Angehängte Dateien
    Zuletzt geändert von Northman; 23.05.2016, 17:59. Grund: Korrektur und Ergänzungen zu den Pins
    Gruß, Carsten

    #2
    Hallo Carsten,

    vielen Danke!
    Ich schaue mir das (heute abend?) mal an.
    Könntest Du vllt 1-2 bilder anhängen?

    Danke und Grüße!
    Lio

    Kommentar


      #3
      Hallo Lio,
      ein Bild des Steckbretts mit Arduino und Kondensator.
      Irgendwie hatte ich am Anfang angenommen, daß der Nano auch mit 3,3V Logikpegel arbeitet (so wie es der Arduino Due macht). Da der Konverter 5V liefert, habe ich mit den beiden Widerständen einen Teiler eingebaut, der die 5V auf ungefähr 3,3V runterbringt. Gestern habe ich dann bei der Suche nach den Links für den Nano gesehen, daß der doch noch mit 5V arbeitet. Die Widerstände sind also nutzlos.
      VBus.jpg

      Links ist meine Lochrasterversion des VBUS-UART-Umsetzers.


      Gruß, Carsten



      Gruß, Carsten

      Kommentar


        #4
        Super danke!
        Dachte / hoffte, dass die Lösung ohne weitere Plugins auskommt.
        Möchte eigentlich mehr vom WG weg. Edomi ist angesagt. Aber ich probiers aus-das Ding wird doch wohl endlich mal wieder laufen!? Habe mir nun einen Nano bestellt, da meine keinen FTDI-Chip hatten. Denke der wird zum Wochenende geliefert-dann geht's dran.

        Melde mich zurück.

        Carsten, nochmals danke. Ich weis das zu schätzen.
        Grüße,
        Lio

        Kommentar


          #5
          Hallo
          Warum nicht gleich eine KNX-Schnittstelle mit verpassen und alles auf den KNX-Bus senden.
          Gruß NetFritz
          KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
          WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
          PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

          Kommentar


            #6
            Da ich ein WG besitze (und einsetze ;-) ), ist das meine Lösung. Die Kommunikation erfolgt im Klartext und daher sollte eine Einbindung in andere Systeme möglich sein, solange man irgendwie an die serielle Schnittstelle kommt.
            Nach Edomi mußte ich erstmal googlen... Daher kann ich dazu nichts sagen.

            Eine direkte Anbindung an den Bus wäre natürlich auch eine Option. Damit habe ich mich noch nicht beschäftigt. Eine kurze Websuche brachte diverse Treffer, also ist es prinzipiell möglich. Stellt sich nur die Frage nach dem Aufwand und dem Preis. Der Vorteil eines Plugins ist die schnelle Anpaßbarkeit (z.B. Sendeintervall).
            Natürlich könnte man das ganze auch auf einen größeren Ardunio bringen, der per Ethernet angesschloßen ist und die Konfig per UDP geschickt bekommt, oder sich diese selber von einem Webserver holt (Download einer Textdatei).

            Mein Fernziel ist, diesen VBus-Code zusammen mit meinem anderen Projekt zur Ansteuerung einer ComfoAir CA350 auf einen Arduino Due zu bringen (der hat vier UARTs).
            Deswegen haben alle Variablen und (einige) Funktionen ein "vbus_" als Prefix.

            Wenn das alles zusammen kommt, wäre das ein ziemlich dickes Arduino-Sandwich :-)
            - Arduino Due
            - Shield mit MAX3232 für ComfoAir (zweimal seriell, da eingeschleift zwischen CA und CCEase)
            - Shield mit VBus-Adapter (vll paßt das auch auf das CA Shield)
            - Ethernet-Shield
            - KNX-Shield
            - Shield für XXXXX (ich habe da noch eine Idee, mal sehen was daraus wird....)

            Gruß, Carsten
            Gruß, Carsten

            Kommentar


              #7
              Hallo
              Die KNX-Busanbindung ist einfach, schaue hier:
              https://knx-user-forum.de/forum/%C3%...arduino-am-knx
              Der Nano geht aber nicht, ich habe den Mega und den Siemens BTM.
              Gruß NetFritz

              KNX & Wago 750-849 ,Wiregate u. Cometvisu, iPad 3G 64GB.
              WP Alpha-Innotec WWC130HX (RS232-Moxa-LAN),Solaranlage für Brauchwasser und Heizung.
              PV-Anlage = SMA Webbox2.0 , SunnyBoy 4000TL, Sharp 4kWP

              Kommentar


                #8
                Ein wichtiger Nachtrag, den ich auch oben ergänzt habe:

                WICHTIG: mit dem Elko läßt sich der Nano nicht mehr über USB programmieren. Der Reset wird genutzt, um den Bootloader zu starten. Auf dem Steckbrett kann man den Elko einfach entfernen. Wenn man den Nano aber auf eine andere Platine stecken möchte, sollte man eine Trennmöglichkeit vorsehen (Jumper).
                Gruß, Carsten

                Kommentar


                  #9
                  Zitat von NetFritz Beitrag anzeigen
                  Die KNX-Busanbindung ist einfach, schaue hier:
                  https://knx-user-forum.de/forum/%C3%...arduino-am-knx
                  Was haben wir nur früher ohne Internet gemacht :-)
                  Wer hätte gedacht, daß das so einfach ist. Als ich vorhin kurz Google befragt habe, kamen eher Bastellösungen zur Ankopplung zu Tage. Einen zertifizierten Busankoppler ziehe ich jederzeit vor.

                  Danke. Jetzt ist die Busankopplung für mich gesetzt. Jetzt muß ich nur noch den ganzen Thread lesen... :-)


                  Der Nano geht aber nicht, ich habe den Mega und den Siemens BTM.
                  Der Nano ginge auch, wenn man den Busankoppler an den UART hängt. TX/RX sind an Pin 1 und 2. Dann geht natürlich die USB-Schnittstelle nicht mehr.
                  Oder eben SoftwareSerial einsetzt. Für eine weitere Software-Schnittstelle kann man noch AltSoftSerial benutzen. Allerdings mag es dann mit dem RAM knapp werden.
                  Dann doch lieber einen Mega oder einen Due. Letzterer hat sogar noch zweimal CAN.
                  Gruß, Carsten

                  Kommentar


                    #10
                    Hallo Carsten,

                    der FTDI-Arduino ist mittlerweile gekommen und wollte mich gerade dran machen zumindest die Daten meines RESOL anzupassen.
                    Jetzt habe ich die weiteren Antworten gelesen. Die Busankopplung wäre für mich natürlich DIE Lösung, da ich unabhängig wäre.
                    D.H. Du gehst das Thema an und kann darauf hoffen? Hättest Du da eine absehbare Zeit?

                    ...mach mich trotzdem mal dran die letzte Lösung zum implementieren..


                    Danke und Grüße,
                    Lio

                    Kommentar


                      #11
                      Hallo,

                      habe einen Fehler: "ERR: No valid packet in buffer"

                      hab jetzt mal Tx an den Pin "D8" gelötet, da es auf dem Foto so aussieht als würdest Du den benutzten.
                      Pin 8 ist eigentlich "D5"
                      Stimmt das so?

                      Danke und Gruß,
                      Lio
                      Zuletzt geändert von lio123; 23.05.2016, 17:49.

                      Kommentar


                        #12
                        Hallo Lio,

                        ich habe "erst" gut 650 der 830+ Antworten des anderen Thread gelesen. Wenn in den letzten 180 Postings nicht noch eine bessere Möglichkeit der Anbindung, als die Siemens BCU genannt wird, werde ich mir davon mal zwei Stück bestellen und den Code entsprechend anpassen. Zeitplan kann ich Dir noch keinen nennen. Aber soweit ich das bis jetzt gelesen habe, dürfte die Einbindung simpel sein.
                        Eine kleine Herausforderung wird noch, die Konfiguration zur Auswahl der richtigen Funktion zum Senden des Wertes. Die Temperatur soll als Temperatur auf den Bus gehen, die Drehzahl als Prozent, die Betriebsstunden als 16bit Wert, usw... Im Moment wird einfach nur die Zahl ausgegeben und das WG-Plugin erledigt den Rest.
                        Ich habe aber schon eine Idee, wie ich das flexibel in den Code bekomme.

                        Mit den Pins hast Du natürlich recht. Es ist D8 und nicht Pin 8. Werde ich oben gleich auch noch korrigieren.


                        Gruß, Carsten
                        Gruß, Carsten

                        Kommentar


                          #13
                          Ok, das hört sich viel versprechend an.
                          Ich habe gesehen, dass Du andere Parameter abfragst, ich denke aber das wird kein Problem sein.

                          Ich bin mittlerweile mit Hterm am Problem. Da ich ja nachgeschaltet einen MAX232 auf dem UART sitzen habe, hatte ich erstmal die o.g. Verbindungen zum NANO dirket auf den 4093 gelötet. Das müsste doch aber auch nach dem MAX232 auch noch klappen, oder?
                          Zwischenablage011.jpg

                          Danke und GRüße.
                          Lio
                          Zuletzt geändert von lio123; 23.05.2016, 21:28.

                          Kommentar


                            #14
                            Ich hatte zwar auf den Konverter verwiesen, aber nicht mehr daran gedacht, daß ich diesen ohne MAX232 verwende. Der MAX232 ist nur nötg, wenn man wirklich an eine echte serielle Schnittstelle gehen möchte (RS232). Der Nano emuliert den UART an Digital-Pins, welche mit TTL (5V) arbeiten. Daher kann man die Pins direkt anschließen. Siehe auch meine Postings in dem anderen Thread #44 und #46.
                            Hast Du den MAX232 gesockelt? Dann würde ich den rausziehen und D8 mit Pin 11 des MAX232-Sockels verbinden.

                            Als wenn ich es geahnt hätte: in den letzten Postings des "ARDUINO am KNX"-Thread wurde "Konnekting" erwähnt und jetzt muß/will ich mich erstmal dort einlesen. Dann entscheide ich, welche Lib ich zur Einbindung benutze. Und welche Hardware ich brauche. Der Nano ist wohl nicht geeignet, da für die Verbindung zum KNX der Hardware-UART benötigt wird, dieser aber am FTDI-Chip hängt, welche die Kommunikation stört. Wie gut, daß ich nur drei Stück davon habe... :-]
                            Zum Glück habe ich noch zwei Arduino Due hier. Der hat vier echte UARTs. Die sind eigentlich totaler Overkill für so ein kleines Projekt, aber zumindest kann ich damit meinen Sketch entwickeln. Und da der noch mehr Aufgaben bekommen soll....

                            Gruß, Carsten
                            Gruß, Carsten

                            Kommentar


                              #15
                              Hi Carsten,

                              könntest Du bitte nochmal ein Bild Deines UART dirrekt von oben und direkt von unten senden?
                              Ich glaub ich muss den neu aufbauen, irgendwas funktioniert doch nicht.

                              Danke und Gruß,
                              Lio

                              Kommentar

                              Lädt...
                              X