Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: NibeUplink

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

    Neues Plugin: NibeUplink

    Hallo zusammen,

    ich habe mal meinen ersten Schuss für das Plugin "NibeUplink" bei github eingecheckt.
    Das Plugin ist im Prinzip ein Web-Scraper, der sich bei NibeUplink einloggt und dort die fast in Echtzeit aktualisierten Daten ausliest und innerhalb von sh.py zur Verfügung stellt.


    2015-07-15 13_44_17-Serviceinfo - F1145-6 PC EM - NIBE Uplink™.png
    Screenshot_2015-07-15-13-46-26.jpg

    Da das Plugin die Daten aus einer HTML Seite liest, kann es sein dass bei Updates seitens Nibe das ganze nicht mehr zuverlässig funktioniert. Im nächsten Schritt versuche ich mich mal an der JSON Schnittstelle. Habe da mal bei Nibe angefragt.

    Benutzung ist in der Readme beschrieben. Würde mich freuen wenn der eine oder andere Nibe-Besitzer das Plugin mal testet und Feedback gibt.

    Download hier: https://github.com/SgtSeppel/nibeuplink

    Angehängte Dateien

    #2
    Habe ein kleines Update gepusht.
    - Nibe formattiert die Gradminuten neu.
    - Durchflussmenge am WMZ kann jetzt auch korrekt interpretiert werden.

    Kommentar


      #3
      Hi Seppel,

      ich habe Dein Plugin mal installiert, bekomme aber folgende Fehler:
      Code:
      2016-02-28 20:42:53,896 DEBUG    Scheduler    NibeUplink next time: 2016-02-28 20:43:03+01:00 -- scheduler.py:_next_time:289
      2016-02-28 20:42:57,400 ERROR    NibeUplink   Method NibeUplink exception: 'LogRecord' object has no attribute 'message' -- scheduler.py:_task:348
      Traceback (most recent call last):
        File "/usr/smarthome/plugins/nibeuplink/__init__.py", line 126, in _update_values
          self.parser.feed(str(page))
        File "/usr/lib/python3.2/html/parser.py", line 142, in feed
          self.goahead(0)
        File "/usr/lib/python3.2/html/parser.py", line 186, in goahead
          k = self.parse_starttag(i)
        File "/usr/lib/python3.2/html/parser.py", line 319, in parse_starttag
          endpos = self.check_for_whole_start_tag(i)
        File "/usr/lib/python3.2/html/parser.py", line 409, in check_for_whole_start_tag
          self.error("malformed start tag")
        File "/usr/lib/python3.2/html/parser.py", line 149, in error
          raise HTMLParseError(message, self.getpos())
      html.parser.HTMLParseError: malformed start tag, at line 1, column 45508
      
      During handling of the above exception, another exception occurred:
      
      Traceback (most recent call last):
        File "/usr/smarthome/lib/scheduler.py", line 344, in _task
          obj()
        File "/usr/smarthome/plugins/nibeuplink/__init__.py", line 128, in _update_values
          logger.warn('Fehler:', e.args)
        File "/usr/lib/python3.2/logging/__init__.py", line 1252, in warning
          self._log(WARNING, msg, args, **kwargs)
        File "/usr/lib/python3.2/logging/__init__.py", line 1372, in _log
          self.handle(record)
        File "/usr/lib/python3.2/logging/__init__.py", line 1382, in handle
          self.callHandlers(record)
        File "/usr/lib/python3.2/logging/__init__.py", line 1444, in callHandlers
          hdlr.handle(record)
        File "/usr/lib/python3.2/logging/__init__.py", line 835, in handle
          self.emit(record)
        File "/usr/smarthome/bin/smarthome.py", line 100, in emit
          self._log.add([timestamp, record.threadName, record.levelname, record.message])
      AttributeError: 'LogRecord' object has no attribute 'message'
      Irgend eine Idee?

      Kommentar


        #4
        Hast du es installiert und korrekt konfiguriert?
        Habe grade bei mir nachgeschaut. Läuft alles. Dachte zuerst an ein Update seitens Nibe.
        Zuletzt geändert von DerSeppel; 29.02.2016, 08:14.

        Kommentar


          #5
          Zitat von DerSeppel Beitrag anzeigen
          Hast du es installiert und korrekt konfiguriert?
          Habe grade bei mir nachgeschaut. Läuft alles. Dachte zuerst an ein Update seitens Nibe.
          Hi Sebastian,

          Ich habe das zip-File im plugins-Ordner entpackt, muss das anders installiert werden?
          In der etc/plugins.conf steht:
          Code:
          [nibeuplink]
              class_name = NibeUplink
              class_path = plugins.nibeuplink
              nibe_email = meine.adresse@blah.com
              nibe_password = MeinPasswort
              nibe_system = MeineID
          Das Plugin startet ja auch:
          Code:
          2016-02-29 09:36:41,244 DEBUG    Main         Plugin: nibeuplink -- plugin.py:__init__:43
          2016-02-29 09:36:41,828 WARNING  Main         Init NibeUplink -- __init__.py:__init__:49
          .
          .
          2016-02-29 09:36:53,085 WARNING  nibeuplink   Logged in -- __init__.py:run:104
          .
          .
          .
          2016-02-29 09:36:53,110 DEBUG    nibeuplink   NibeUplink next time: 2016-02-29 09:37:08+01:00 -- scheduler.py:_next_time:289
          .
          .
          .
          2016-02-29 09:37:08,603 DEBUG    Scheduler    NibeUplink next time: 2016-02-29 09:37:18+01:00 -- scheduler.py:_next_time:289
          .
          .
          .
          2016-02-29 09:37:16,528 ERROR    NibeUplink   Method NibeUplink exception: 'LogRecord' object has no attribute 'message' -- scheduler.py:_task:348
          Traceback (most recent call last):
            File "/usr/smarthome/plugins/nibeuplink/__init__.py", line 126, in _update_values
              self.parser.feed(str(page))
            File "/usr/lib/python3.2/html/parser.py", line 142, in feed
              self.goahead(0)
            File "/usr/lib/python3.2/html/parser.py", line 186, in goahead
              k = self.parse_starttag(i)
            File "/usr/lib/python3.2/html/parser.py", line 319, in parse_starttag
              endpos = self.check_for_whole_start_tag(i)
            File "/usr/lib/python3.2/html/parser.py", line 409, in check_for_whole_start_tag
              self.error("malformed start tag")
            File "/usr/lib/python3.2/html/parser.py", line 149, in error
              raise HTMLParseError(message, self.getpos())
          html.parser.HTMLParseError: malformed start tag, at line 1, column 2168
          
          During handling of the above exception, another exception occurred:
          
          Traceback (most recent call last):
            File "/usr/smarthome/lib/scheduler.py", line 344, in _task
              obj()
            File "/usr/smarthome/plugins/nibeuplink/__init__.py", line 128, in _update_values
              logger.warn('Fehler:', e.args)
            File "/usr/lib/python3.2/logging/__init__.py", line 1252, in warning
              self._log(WARNING, msg, args, **kwargs)
            File "/usr/lib/python3.2/logging/__init__.py", line 1372, in _log
              self.handle(record)
            File "/usr/lib/python3.2/logging/__init__.py", line 1382, in handle
              self.callHandlers(record)
            File "/usr/lib/python3.2/logging/__init__.py", line 1444, in callHandlers
              hdlr.handle(record)
            File "/usr/lib/python3.2/logging/__init__.py", line 835, in handle
              self.emit(record)
            File "/usr/smarthome/bin/smarthome.py", line 100, in emit
              self._log.add([timestamp, record.threadName, record.levelname, record.message])
          AttributeError: 'LogRecord' object has no attribute 'message'
          Ich bin noch auf dem Master-Zweig. Kann das das Problem sein?

          Danke und Gruß,
          Norbert

          Kommentar


            #6
            Der Fehler kommt irgendwo aus der Parser-Klasse.
            Sieht aus als ob keine gültige Seite geliefert wird. Da könnte man sicher noch ein bisschen an der Fehlerbehandlung feilen, aber mich wundert, dass es überhaupt soweit kommt.
            Hast du es noch mal probiert? Bei mir waren gestern auch Fehler im Log. Da gab es 500er Fehler auf Seiten von Nibe.
            Das andere scheint dann ein Folge-Fehler zu sein.

            Bist du 100% sicher, dass die Zugangsdaten stimmen? Und die System-ID? Hast du die einfach als Nummer angegeben á la 12345?
            Welche WP hast du denn? Vielleicht ist die Seite ja bei deiner anders aufgebaut?

            Kommentar


              #7
              Ich habe eine F1245-6 E PC EM.
              Ich habe es immerwieder probiert, immer der gleiche Fehler.
              Die System-ID habe ich als 5-stellige Zahl eingegebn, klar.
              Die Login-Daten stimmen auch, per wget und anschliessenden sed bekomme ich ja Werte:

              Code:
              root@smarthome.local:Nibe# wget --save-cookies cookies.txt --keep-session-cookies --post-data 'Email=***.***@web.de&Password=***' https://www.nibeuplink.com/LogIn
              --2016-02-29 11:27:19--  https://www.nibeuplink.com/LogIn
              Resolving www.nibeuplink.com (www.nibeuplink.com)... 193.218.206.136
              Connecting to www.nibeuplink.com (www.nibeuplink.com)|193.218.206.136|:443... connected.
              HTTP request sent, awaiting response... 302 Found
              Location: /System/***** [following]
              --2016-02-29 11:27:25--  https://www.nibeuplink.com/System/*****
              Reusing existing connection to www.nibeuplink.com:443.
              HTTP request sent, awaiting response... 302 Found
              Location: /System/*****/Status/Overview [following]
              --2016-02-29 11:27:30--  https://www.nibeuplink.com/System/*****/Status/Overview
              Reusing existing connection to www.nibeuplink.com:443.
              HTTP request sent, awaiting response... 200 OK
              Length: 14139 (14K) [text/html]
              Saving to: `LogIn'
              
              100%[================================================================================================================================================================================================>] 14,139      --.-K/s   in 0.03s
              
              2016-02-29 11:27:35 (424 KB/s) - `LogIn' saved [14139/14139]
              
              root@smarthome.local:Nibe# wget --load-cookies cookies.txt https://www.nibeuplink.com/System/*****/Status/ServiceInfo
              --2016-02-29 11:27:42--  https://www.nibeuplink.com/System/*****/Status/ServiceInfo
              Resolving www.nibeuplink.com (www.nibeuplink.com)... 193.218.206.136
              Connecting to www.nibeuplink.com (www.nibeuplink.com)|193.218.206.136|:443... connected.
              HTTP request sent, awaiting response... 200 OK
              Length: 26877 (26K) [text/html]
              Saving to: `ServiceInfo'
              
              100%[================================================================================================================================================================================================>] 26,877      --.-K/s   in 0.008s
              
              2016-02-29 11:27:51 (3.10 MB/s) - `ServiceInfo' saved [26877/26877]
              
              root@smarthome.local:Nibe# sed -n 's/.*ID40004\">\([^<]*\).*/\1/p' ServiceInfo
              1.9°C
              root@smarthome.local:Nibe#
              Gruß,
              Norbert

              Kommentar


                #8
                Okay, ich habe nochmal nachgeschaut.
                Der Fehler tritt bei mir auch auf. Hat aber keine Auswirkungen. Das Plugin funktioniert.
                Das Problem: Der Quellcode der Statusseite, die mein Plugin ausliest, ist kein valides HTML.
                Das sieht man auch ganz schön, wenn man den Quellcode der Seite mal durch den w3c validator schickt.

                Ich arbeite gerade an einer Version, die ohne Parsen der Webseite auskommt. Mangels Zeit und fehlender Rückmeldung seitens Nibe, wird das noch ne Weile dauern.

                Kannst du mal Items anlegen und schauen ob die Updates gehen?

                Kommentar


                  #9
                  Ich habe jetzt ein Item für die Außentemperatur angelegt:

                  Code:
                  [Erdgeschoss]
                      [[Aussen]]
                          [[[Waermepumpe]]]
                              [[[[TempAussen]]]]
                                  type = num
                                  nibe_reg = ID40004
                                  sqlite = true
                                  visu_acl = true
                  Das Ergebnis ist 0:
                  Code:
                  SmartHome.py v1.0-45-g02cf972+
                  Enter 'help' for a list of available commands.
                  > ls Erdgeschoss.Aussen.Waermepumpe.TempAussen
                  Items:
                  ======
                  Erdgeschoss.Aussen.Waermepumpe.TempAussen = 0
                  >
                  Während der wirkliche Wert 2,9 Grad ist.

                  Kommentar


                    #10
                    seppel, hast Du noch eine Idee warum das bei mir nicht klappt?
                    Gibt's eventuell noch Abhängigkeiten zu Software, die ich nachinstallieren müsste?

                    Ich habe leider überhaupt keine Ahnung von Python, hätte aber gedacht, dass die Funktion eines 3-zeiligen Shellscripts nicht soo problematisch sein sollte.
                    Dein Python-Script ist da ja weitaus umfangreicher.

                    Gruß,
                    Norbert

                    Kommentar


                      #11
                      Hm..., ich habe jetzt mal versucht den Weg andersherum zu gehen.
                      Ich habe also den ausgelesenen Wert mittels "rrdtools update" in die entsprechende Datenbank geschrieben.
                      Mit "rrdtool lastupdate" sehe ich auch den korrekten Wert, das Item bleibt allerdings 0.

                      Ich bin ratlos...

                      Kommentar


                        #12
                        Komisch. Kannst du mal ein komplettes Item posten?

                        Kommentar


                          #13
                          Aaaalso, ich versuche ja jetzt, wie schon vorher geschrieben, einen anderen Weg als Dein Plugin zu nutzen.
                          Ich habe ein Shellscript, welches mir die Daten von der NibeUplink-Webseite holt und in entsprechende rrd-Dateien schreibt.
                          Per Cronjob wird das Script alle 5 Minuten ausgeführt. Das funktioniert zuverlässig. Hier ein Beispiel für die Temperatur des Aussenfühlers:
                          Code:
                          #!/bin/bash
                          #
                          
                          rm LogIn
                          
                          wget --save-cookies cookies.txt --keep-session-cookies --post-data 'Email=<MeineMailAdresse>@<Provider.com>&Password=<MeinPasswort>' https://www.nibeuplink.com/LogIn
                          wget --load-cookies cookies.txt https://www.nibeuplink.com/System/<MeineNibeID>/Status/ServiceInfo
                          mv ServiceInfo.1 ServiceInfo
                          AUSSEN_TEMP=$(echo "$(sed -n 's/.*ID40004\">\([^°]*\).*/\1/p' ServiceInfo)")
                          rrdtool update /usr/smarthome/var/rrd/Erdgeschoss.Aussen.Waermepumpe.TempAussen.rrd N:$AUSSEN_TEMP
                          Problem ist jetzt, dass das zugehörige Item das nicht liest, sondern ebenfalls in diese rrd-Datei schreibt.
                          Das Item ist aber immer "0", dadurch dass es eben nicht aus der rrd-Datei liest.
                          Es schreibt mir also alle 5 Minuten eine 0 in die rrd-Datei.
                          Zu sehen ist das an diesem Graphen:
                          Graph.PNG

                          Die schwarze Kurve springt immer mal wieder auf 0.

                          Was ich jetzt bräuchte wäre ein Item, welches nicht in die rrd schreibt, sondern von dort liest.
                          Ähnlich dem Visu_acl-Parameter. Man müsste jetzt also das rrd-Plugin dahingehend erweitern, dass man auch Items erstellen kann, die nur aus der rrd-Datei lesen.
                          Leider bin ich, wie auch schon erwähnt, ein absoluter Python-Noob, so dass ich hier nicht weiter komme

                          Gruß,
                          Norbert
                          Zuletzt geändert von NorbertB; 11.03.2016, 13:14.

                          Kommentar


                            #14
                            DerSeppel, ich habe jetzt nochmal mit Deinem Plugin experimentiert.
                            Ich habe es mal versucht von der Konsole zu starten:

                            Code:
                            admin@smarthome:/usr/smarthome$ python plugins/nibeuplink/__init__.py
                            Traceback (most recent call last):
                              File "plugins/nibeuplink/__init__.py", line 42, in <module>
                                from .NibeHTMLParser import NibeHTMLParser
                            ValueError: Attempted relative import in non-package
                            admin@smarthome:/usr/smarthome$
                            Da scheint also noch was Grundlegendes schief zu sein...

                            Kommentar


                              #15
                              Liegt vielleicht an der Python-Version?

                              Versuch mal testweise bitte folgendes:

                              - Im Pluginordner einen neuen Ordner anlegen: "NibeHTMLParser"
                              - Da verschiebst du die Datei NibeHTMLParser.py rein.

                              Dann nochmal über die Konsole starten.

                              Edit: Welche Python-Version hast du?

                              Kommentar

                              Lädt...
                              X