Ankündigung

Einklappen
Keine Ankündigung bisher.

ebusd - Ethernet Koppler

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

    ebusd - Ethernet Koppler

    Hallo zusammen!

    Umgebung:
    - ebusd: 0.5.0-beta.3
    - OS: Debian 7.7 (IP: 10.30.30.21)
    - eBUS Koppler Ethernet (link) (IP: 10.30.30.55)

    Beide Systeme (ebusd Server und Koppler) können sich per Netzwerk gegenseitig erreichen.
    - vom Debian System per telnet (Port 5000) auf den Koppler
    - vom Koppler per ping zum Server (nur ICMP Tests möglich)

    ebusd wird mit folgenden Optionen gestartet:
    EBUSD_OPTS="-d 10.30.30.55:5000 --receivetimeout 60000"

    ebusd meldet in /var/log/ebusd.log:
    2015-01-03 07:17:57.039 [bus error] can't open 10.30.30.55:5000

    Ich habe weder csv-Dateien eingebunden noch am Poti gedreht. Die IP Kommunikation sollte mal stehen, bevor ich mich um sie Datagramms und deren Interpretation kümmere. Scheinbar nutzen viele die USB Variante des Kopplers - entsprechend wenig hilfreiche threads habe ich leider zur Ethernet-Variante gefunden.

    Kann mir jemand Hinweise geben, wie ich die oben genannte Meldung debuggen kann? Bin mir im Moment nicht mal sicher, ob es ein Linux oder ebusd Thema ist... Falls noch Infos fehlen, liefere ich die gerne nach!

    Danke für eure Hilfe!
    Markus

    #2
    Hi,

    teste bitte mal die Option '-n'.

    lg roland

    Kommentar


      #3
      Sollte behoben sein https://knx-user-forum.de/449472-post114.html

      Kommentar


        #4
        Hi,

        habe soeben das letzte Commit neu compiliert, komme aber trotzdem nicht um die Optionen:

        file: /etc/defaults/ebusd
        EBUSD_OPTS="-d 10.30.30.55:5000 --nodevicecheck --receivetimeout 60000"

        herum.

        Ohne -n geht's nach wie vor nicht.


        Sonst funktioniert das Auslesen mittlerweile ganz gut. Folgendes Problem habe ich aber noch, sobald ich die ausgegebenen Werte weiter verarbeiten möchte. Wenn ich zum Beispiel das ebus Plugin von smarthome.py nutze und die Werte in die Datenbank schreiben möchte, wird mir das übergebene "...;ok" zum Verhängnis.

        root@athasrv05:~/compile/ebusd-0.5.0-beta.3# ebusctl
        localhost: read FlowTemp
        22.81;ok

        smarthome.py beschwert sich dann, dass der übergebene Wert nicht vom Typ "num" ist (hat ja nicht ganz so unrecht...)

        2015-01-07 14:13:33,261 WARNING eBusd Item ebus.vorlauftemperatur: value 22.81;ok does not match type num. Via eBus refresh -- item.py:__update:347

        Ist das "...;ok" bei der Antwort beabsichtigt?

        Danke & LG,
        Markus

        Kommentar


          #5
          Das smarthome.py Plugin unterstützt den aktuellen ebusd noch nicht.
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Mit einer kleinen Anpassung (hier beschrieben) funktioniert es.
            root@athasrv05:/usr/local/smarthome/items# telnet localhost 2323
            Trying 127.0.0.1...
            Connected to localhost.
            Escape character is '^]'.
            SmartHome.py v1.0-35-gf62db45+
            Enter 'help' for a list of available commands.
            > ls ebus.speichertemperatur_ist
            Items:
            ======
            ebus.speichertemperatur_ist = 48.19;ok
            >

            Nur eben das ;ok beim Wert erschwert die Weiterverarbeitung in einer SQL Datenbank. Ich möchte ungern einen Wert als String definieren.

            Aber zurück zur eigentlichen Frage:

            Ist das "...;ok" bei der ebusctl-Antwort beabsichtigt? Bei einem anderen Objekt bekomme ich kein ok...
            root@athasrv05:/usr/local/smarthome/items# ebusctl
            localhost: read SystemMode
            heat

            Kommentar


              #7
              Das kommt auf den Wert an, den du auslesen willst. Bei der Temperatur handelt es sich um einen Fühler, welcher die Temperatur an sich (temp) und den Fühlerstatus (sensor) anzeigt. Also temp;sensor --> 48.19;ok

              Kommentar


                #8
                Hallo Markus,

                siehe auch das Thema https://knx-user-forum.de/smarthome-...-auslesen.html
                Meinen Wärmespeicher PMW00 habe ich soweit ausgelesen.
                Jetzt geht es an die EPH00.
                Evtl. können wir uns austauschen.

                Gruß
                Henry
                Neustes Projekt: Ubutu als VM (Parallels) auf einem MacMini
                Raspberry Pi - MacMini - geoTHERM VWL S

                Kommentar


                  #9
                  Hallo Zusammen,

                  ich nutze das ebusd 1.2.0, leider bekomme ich keine Werte zurück. Mit dem ebusctl funktioniert es.

                  Code:
                  ########################## BEGIN SourceHours #################################
                                   [[[SourceHours]]]
                                           type = num
                                           #sqlite = yes
                                           ebus_cmd = "-c ehp SourceHours"
                                           ebus_type = "read"
                                           comment = "SourceHours"
                  ########################## END SourceHours #################################
                  ########################## BEGIN Source2PumpHours #################################
                                   [[[Source2PumpHours]]]
                                           type = num
                                           #sqlite = yes
                                           ebus_cmd = "-c ehp Source2PumpHours"
                                           ebus_type = "read"
                                           comment = "Source2PumpHours"
                  ########################## END Source2PumpHours #################################
                  LOG:
                  Code:
                  2015-10-12 18:09:34,439 DEBUG    eBusd        REQUEST: read -c ehp SourceHours -- __init__.py:request:79
                  2015-10-12 18:09:36,441 WARNING  eBusd        error receiving answer: timeout -- __init__.py:request:90
                  2015-10-12 18:09:37,445 DEBUG    eBusd        REQUEST: read -c ehp Source2PumpHours -- __init__.py:request:79
                  2015-10-12 18:09:39
                  ebusctl:
                  Code:
                  time ebusctl read -c ehp Source2PumpHours
                  6500
                  
                  real    0m0.018s
                  user    0m0.010s
                  sys     0m0.000s
                  
                  
                  
                  time ebusctl read -c ehp SourceHours
                  6499
                  
                  
                  real    0m0.121s
                  user    0m0.010s
                  sys     0m0.000s
                  Hat jemand eine Idee?

                  gruss
                  spars

                  Kommentar


                    #10
                    Ich bin gerade dran das Plugin zu überarbeiten und auch drüber gestolpert.

                    Fürs erste wäre das ein Fix:

                    Code:
                    ########################## BEGIN SourceHours #################################
                                     [[[SourceHours]]]
                                             type = num
                                             #sqlite = yes
                                             ebus_cmd = "-c ehp SourceHours [COLOR=#FF0000][B]\n[/B][/COLOR]"
                                             ebus_type = "read"
                                             comment = "SourceHours"
                    ########################## END SourceHours #################################
                    ########################## BEGIN Source2PumpHours #################################
                                     [[[Source2PumpHours]]]
                                             type = num
                                             #sqlite = yes
                                             ebus_cmd = "-c ehp Source2PumpHours[COLOR=#FF0000][B] \n[/B][/COLOR]"
                                             ebus_type = "read"
                                             comment = "Source2PumpHours"
                    ########################## END Source2PumpHours #################################
                    Wobei ich "-c * * \n" fest einbauen werde bzw. eingebaut habe. Es sind mir noch ein paar Fallstricke aufgefallen die derzeit ohne Logeinträge auf die Nase fallen. Ich denke in einer Woche bin ich soweit, hab leider noch andere Baustellen nebenbei.
                    Zuletzt geändert von JuMi2006; 13.10.2015, 08:32.
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar


                      #11
                      Hallo,

                      ich habe jetzt auch die Kombination mit dem \n gemacht ohne Erfolg, ich bekomme immer einen timeout.
                      Ich habe mal das Logging noch erweitert, damit ich sehe was er da schickt, wenn ich den gleichen Befehl in der cli vom ebusd eingebe, funktioniert dieser.

                      Code:
                      2015-10-13 14:55:26 WARNING  eBusd        error receiving answer: timeout
                      2015-10-13 14:55:26 WARNING  eBusd        read OutsideTemp temp
                      2015-10-13 14:55:29 WARNING  eBusd        error receiving answer: timeout
                      2015-10-13 14:55:29 WARNING  eBusd        read Source2PumpHours
                      Jemand noch eine Idee?

                      Kommentar


                        #12
                        Du brauchst kein Logging zu erweitern ... einfach sh.py im Debug Modus starten. Da sind genug Debug-Ausgaben drin.

                        Hier mein derzeitiger Stand des Plugins ... das läuft.

                        Code:
                        #!/usr/bin/env python3
                        # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
                        #
                        # Copyright 2012-2013 KNX-User-Forum e.V.       https://knx-user-forum.de/
                        #
                        #  This file is part of SmartHome.py.    http://mknx.github.io/smarthome/
                        #
                        #  SmartHome.py is free software: you can redistribute it and/or modify
                        #  it under the terms of the GNU General Public License as published by
                        #  the Free Software Foundation, either version 3 of the License, or
                        #  (at your option) any later version.
                        #
                        #  SmartHome.py is distributed in the hope that it will be useful,
                        #  but WITHOUT ANY WARRANTY; without even the implied warranty of
                        #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
                        #  GNU General Public License for more details.
                        #
                        #  You should have received a copy of the GNU General Public License
                        #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
                        #
                        
                        import logging
                        import socket
                        import threading
                        import time
                        
                        logger = logging.getLogger('eBus')
                        
                        
                        class eBus():
                            _items = []
                        
                            def __init__(self, smarthome, host, port, cycle=240):
                                self._sh = smarthome
                                self._cycle = int(cycle)
                                self._sock = False
                                self.connected = False
                                self.host = host
                                self.port = int(port)
                                self._connection_attempts = 0
                                self._connection_errorlog = 60
                                smarthome.connections.monitor(self)
                                self._lock = threading.Lock()
                                self.refresh_cycle = self._cycle
                        
                            def parse_item(self, item):
                                # Attribute und Parameter werden regelmäßig ausgelesen
                                if 'ebus_type' in item.conf and 'ebus_cmd' in item.conf:
                                    self._items.append(item)
                                    return self.update_item
                        
                            def run(self):
                                self.alive = True
                                self._sh.scheduler.add('eBusd', self.refresh, prio=5, cycle=self._cycle, offset=2)
                        
                            def refresh(self):
                                for item in self._items:
                                    time.sleep(1)
                                    ebus_type = item.conf['ebus_type']
                                    ebus_cmd = item.conf['ebus_cmd']
                                    if ebus_type == "broadcast":
                                        value = None
                                    else:
                                        request = "read" + " -c " + ebus_cmd + '\n' # build command
                                        value = self.request(request)
                                    #if reading fails (i.e. at broadcast-commands) the value will not be updated
                                    if 'ERR:' not in str(value) and value is not None:
                                        item(value, 'eBus', 'refresh')
                                    if not self.alive:
                                        break
                        
                            def request(self, request):
                                if not self.connected:
                                    logger.info("eBusd not connected")
                                    return
                                self._lock.acquire()
                                try:
                                    self._sock.send(request.encode())
                                    logger.debug("REQUEST: {0}".format(request))
                                except Exception as e:
                                    self._lock.release()
                                    self.close()
                                    logger.warning("error sending request: {0} => {1}".format(request, e))
                                    return
                                try:
                                    answer = self._sock.recv(256).decode()[:-2]
                                    logger.debug("ANSWER: {0}".format(answer))
                                except socket.timeout:
                                    self._lock.release()
                                    logger.warning("error receiving answer: timeout")
                                    return
                                except Exception as e:
                                    self._lock.release()
                                    self.close()
                                    logger.warning("error receiving answer: {0}".format(e))
                                    return
                                self._lock.release()
                                return answer
                        
                            def connect(self):
                                self._lock.acquire()
                                try:
                                    self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                                    self._sock.settimeout(2)
                                    self._sock.connect((self.host, self.port))
                                except Exception as e:
                                    self._connection_attempts -= 1
                                    if self._connection_attempts <= 0:
                                        logger.error('eBus:    could not connect to {0}:{1}: {2}'.format(self.host, self.port, e))
                                        self._connection_attempts = self._connection_errorlog
                                    self._lock.release()
                                    return
                                logger.info('Connected to {0}:{1}'.format(self.host, self.port))
                                self.connected = True
                                self._connection_attempts = 0
                                self._lock.release()
                        
                            def close(self):
                                self.connected = False
                                try:
                                    self._sock.shutdown(socket.SHUT_RDWR)
                                except:
                                    pass
                                try:
                                    self._sock.close()
                                    self._sock = False
                                    logger.info('Connection closed to {0}:{1}'.format(self.host, self.port))
                                except:
                                    pass
                        
                            def stop(self):
                                self.close()
                                self.alive = False
                        
                            def update_item(self, item, caller=None, source=None, dest=None):
                                if caller != 'eBus':
                                    value = str(int(item()))
                                    cmd = item.conf['ebus_cmd']
                                    request = "write -c " + cmd + " " + value + "\n"
                                    set_answer = self.request(request)
                                    #just check if set was no broadcast-message
                                    if 'done' not in set_answer and item.conf['ebus_type'] != "broadcast": ###FIXME YUST A WORKAROUND FOR BROADCAST
                                        request = "read -c " + cmd
                                        answer = self.request(request)
                                        #transfer value and answer to float for better comparsion
                                        if float(answer) != float(value) or answer is None:
                                            logger.warning("Failed to set parameter: value: {0} cmd: {1} answer {2}".format(value, request, answer))
                        Umgezogen? Ja! ... Fertig? Nein!
                        Baustelle 2.0 !

                        Kommentar


                          #13
                          Hallo,

                          mit deinem Skript läuft das jetzt, mein Fehler war, das \n, ich hatte es nicht in '' gesetzt.

                          Wäre Super, wenn du das feritge Skript, dann auch hier einstellen könntest.

                          Danke

                          gruß
                          Spars

                          Zuletzt geändert von sparsematrix; 19.10.2015, 11:26.

                          Kommentar


                            #14
                            Wenn es bei mir stabil läuft geht es ins offizielle smarthome.py Repo.
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #15
                              Hallo Mirko,

                              da ich gerade in die gleichen Probleme laufe (ebusd 2.x und smarthome 1.x - read/get).
                              Koenntest Du bitte nochmal Dein aktuelles ebusd-Plugin posten?
                              In die Repo hat's es wohl bisher nicht geschafft?

                              Vielen Dank, Oliver

                              Kommentar

                              Lädt...
                              X