Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: THZ/LWZ 30x/40x

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

    Manchmal führt ungünstige Verkabelung zu Aussetzern in der Kommunikation am seriellen Port. Ich habe keine Ahnung, ob es in pySerial passiert oder im seriellen Treiber oder weil irgendwann mehrere Threads durcheinander Daten senden und die WP sie nicht mehr quittiert. Dies wird im Plugin nicht wirklich abgefangen, weil das Handshake immer synchron abgewickelt wird (Send - Receive). D.h. nach jedem PortHandler.sendData() wird sofort PortHandler.readData() aufgerufen.

    readData() hat ein Timeout von 1 Sekunde. Wenn man 50 Parameter pro Zyklus abfragt, kann so ein Zyklus mit gestörter Kommunikation 50 Sekunden in Anspruch nehmen. Wird alle 30 Sekunden gepollt, so wird ein neuer Thread gestartet, bevor der alte fertig geworden ist. Und wenn die serielle Kommunikation wieder in Ordnung wäre, könnten mehrere Threads theoretisch ihre Daten durcheinander senden, was von der WP nicht akzeptiert wird und zu weiteren Kommunikationsproblemen führt. Und so könnte die Anzahl der Threads ansteigen.

    Bei mir habe ich Probleme mit den Threads nur dann beobachtet, nachdem ich das Kabel von der WP abgezogen hatte.

    Versuch mal requestData() in ThzProtocol.py mit folgendem Code zu ersetzen:
    PHP-Code:
      def requestData(selfrequest):
        
    # check the port status
        
    if not self._portHandler.isPortOpen():
          
    self._portErrorCount += 1
          
    if not self._portHandler.openPort(self._serial_portself._baudrate):
            return {}

        
    response = {}
        try:
          
    noResponseCount 0
          
    for name in request:
            
    msg1 self._sendGetRequest(MsgTemplate[name]['cmd1'])
            if 
    not msg1 == None:
              
    noResponseCount 0
              
    if 'cmd2' in MsgTemplate[name]:
                
    # there is a second command to retrieve the most significant part
                
    msg2 self._sendGetRequest(MsgTemplate[name]['cmd2'])
                if 
    not msg2 == None:
                  
    # get the name of the one and only parameter
                  
    param = list(msg1[name].keys())[0]
                  try:
                    
    # combine the two values (the most significant part is to
                    # be multiplied by 1000)
                    
    msg1[name][param] = round(msg2[name][param] * 1000 msg1[name][param],3)
                    
    response.update(msg1[name])
                  
    except:
                    
    logger.warning(sys.exc_info())
              else:
                
    # there is only one response
                
    response.update(msg1[name])
            else:
              
    # no response received
              
    noResponseCount += 1
              
    if noResponseCount 10:
                
    # missing 10 responses in a row
                
    logger.error('Heat pump did not respond for 10 seconds')
                
    self._portHandler.closePort()
                break
        
    except:
          
    logger.warning(sys.exc_info())

        return 
    response 
    Der Code schließt nach 10 Versuchen den Port, sodass er im nächsten Zyklus wieder geöffnet wird. Das Pollintervall darf aber 10 Sekunden nicht unterschreiten.

    Kommentar


      toggle : Danke für deinen Code. Hab's gerade erst gesehen und gleich abgeändert. Die Erhöhung des Poll-Intervalls hat schon viel gebracht. Hoffentlich läuft es jetzt wieder komplett stabil bzw. fängt sich wieder bei Kommunikationsproblemen. Wenn das immer noch nicht hilft, werde ich auch mal den USB-seriell-Adapter tauschen.

      --
      Thorsten

      Kommentar


        Anbei noch der jüngste Stand des Plugins THZ.
        Angehängte Dateien

        Kommentar


          Ok, ich habe mir das mal runtergeladen und baue jetzt noch einiges auf die letzte Version der SmartPlugins um und pushe das dann in develop.

          Kommentar


            Ach ja: Wen kann ich denn offziell als Tester für das Plugin eintragen? Und toggle und zittho als maintainer?

            Noch 'ne Frage: Wozu braucht das Plugin einen UDP-Server?

            Kommentar


              Bitte um Tests. thz_0.2.2.b.zip

              Achtung: Keine Garantie für nix, ich kenne mich mit der Hardware nicht aus und habe nichts um prüfen zu können ...

              Kommentar


                Hi,

                vielen Dank für die Arbeit, bei mir läuft diese Version. Ich bekomme zwar immer wieder solche und ähnliche Fehlermeldung...
                Code:
                2019-05-06  01:26:51 WARNING  plugins.thz.THZ NACK: Unknown register 0A024B
                ...aber das war vorher auch schon so.

                Es lief übrigens auch mit einer niedrigeren pyserial-Version. Ich habe dennoch anschließend ein Upgrade auf die requirements gemacht.

                Noch zur Info, ich habe folgende Umgebung

                Unbenannt.png

                Kommentar


                  In Patch von Beitrag #136 wird die Methode
                  Code:
                  self._portHandler.closePort()
                  aufgerufen. Bei mir gibt es die jedoch nicht. Ich habe deshalb in PortHandler.py folgendes am Ende hinzugefügt:

                  Code:
                    def closePort(self):
                      if not self._fd == None:
                        self._fd.close();
                        self._fd = None

                  Kommentar


                    Zitat von bmx Beitrag anzeigen
                    Noch 'ne Frage: Wozu braucht das Plugin einen UDP-Server?
                    Vielleicht war es gedacht für die Kompatibilität zum FHEM-Plugin. Ich vermute kaum, dass dies jemand benötigt. Wenn niemand widerspricht, würde ich das bei Gelegenheit herausnehmen.

                    Kommentar


                      Hallo zusammen,

                      das Plugin steigt seit geraumer Zeit bei mir immer nach einer gewissen Zeit aus, so dass keine Werte-Abfragen mehr erfolgen. Ich habe meine Stiebel Eltron LWZ über USB angeschlossen und wenn ich SmarhomeNG starte, funktioniert auch immer alles. Aber nach mehreren Stunden kommt dann immer folgende Fehlermeldung

                      Code:
                      2020-11-04 23:57:25 ERROR plugins.thz Heat pump did not respond for 10 seconds
                      2020-11-04 23:57:25 ERROR plugins.thz select failed - (<class 'OSError'>, OSError(9, 'Ungültiger Dateideskriptor'), <traceback object at 0xa3ccecb0>)
                      2020-11-04 23:57:25 INFO plugins.thz Closed serial port.
                      Kann damit jemand etwas anfangen? Wenn ich smarthomeNG neu starte, funktioniert es wieder.
                      Zur Info: Ich nutze einen Raspberry Pi 4 und mit SmarthomeNG 1.7.1.

                      Viele Grüße

                      Arne

                      Kommentar


                        Arne, der Log ist ein wenig dürftig. Steht davor nix im Log drin? Vielleicht kannst Du mal ein debug log erstellen und dann das Log vor dem Fehler posten? (Vielleicht lieber einen Gist machen als das hier reinpacken)

                        Füge mal in ThzProtocol.py unter Zeile 1253 (self.logger.error('Heat pump did not respond for 10 seconds.'))
                        folgende Zeile ein:
                        Code:
                        self.logger.debug('Status: isPortOpen: {}, request: {}, portErrorCount: {}, name: {}'.format(self._portHandler.isPortOpen(),request,self._portErrorCount,name))
                        Vielleicht lassen sich so rausfinden ob das ein bestimmer request-Teil ist (name) oder ob die Schnittstelle bereits geschlossen ist.
                        Zuletzt geändert von bmx; 05.11.2020, 21:01.

                        Kommentar


                          Danke für die schnelle Antwort.

                          Im Log vor dem Fehler steht m.E. nix Wesentliches drin. So lange das Plugin läuft (hier bis 23:57), kommt immer "NACK:Unknown register" Aber das war schon immer so. Dann kommt der Ausstieg um 23:57 und danach alle 2 Mintuten der vergebliche Abruf. Ich habe das beispielhaft hier im Log dargestellt.

                          Code:
                          2020-11-04 23:55:14 WARNING plugins.thz NACK: Unknown register 0A033B
                          2020-11-04 23:55:14 WARNING plugins.thz NACK: Unknown register 0A024B
                          
                          2020-11-04 23:57:25 ERROR plugins.thz Heat pump did not respond for 10 seconds
                          2020-11-04 23:57:25 ERROR plugins.thz select failed - (<class 'OSError'>, OSError(9, 'Ungültiger Dateideskriptor'), <traceback object at 0xa3ccecb0>)
                          2020-11-04 23:57:25 INFO plugins.thz Closed serial port.
                          
                          2020-11-04 23:59:14 INFO plugins.thz Reconnected to serial port - /dev/ttyUSB0
                          2020-11-04 23:59:25 ERROR plugins.thz Heat pump did not respond for 10 seconds
                          2020-11-04 23:59:25 INFO plugins.thz Closed serial port.
                          Die Codezeile habe ich eingefügt und werde berichten. Da ich neu gestartet habe, dauert es vermutlich wieder 1-2 Tage, bis der Fehler kommt.

                          Kommentar


                            Zwei Fragen:
                            Welche pyserial Version hast Du im Einsatz?
                            Reicht ein Neustart von SHNG aus, brauchst Du einen Reboot oder richtig Reset bzw. Stecker rausziehen?

                            Kommentar


                              Ich habe die pyserial-Verision 3.4 im Einsatz. Es reicht ein Neustart von SHNG.

                              Das Plugin hat heute Nacht wieder angehalten, aber die Codezeile hat keinen Eintrag produziert. Ich habe jetzt mal auf self.logger.error umgestellt.

                              Grüße

                              Kommentar


                                arnix Eigentlich solltest Du lieber den Logger anpassen und nicht die Codezeile. Das hätte den Vorteil, das man auch ein paar Debug Meldungen vorher mitbekommt und eine Idee davon bekommt ob es noch woanders kracht im Gebälk.

                                Kommentar

                                Lädt...
                                X