Ankündigung

Einklappen
Keine Ankündigung bisher.

KS300 per 1-Wire auf smarthome

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

    KS300 per 1-Wire auf smarthome

    Hallo,

    ich hatte für das Wiregate die Plugin-Lösung (https://knx-user-forum.de/forum/supp...wiregate/10298) zur Nutzung einer einfachen KS300-Wetterstation per CUNO-Schnittstelle realisiert. Könnte man das auf Smarthome/Smartvisu übertragen?

    Gruß
    Karsten

    #2
    Hallo Karsten,

    ja, das könnte man. Hau rein.

    Bis bald

    Marcus

    Kommentar


      #3
      Ich frage die WS300 über den WDE1 bzw WDE2 von ELV ab. Habe das Plugin selbst erstellt. Programmieren möchte ich das nicht wirklich nennen, da ich mir das aus andern Plugins zusammengesucht habe bis es funktioniert hat. Wenn gewünscht kann ich es hier veröffentlichten, steckt sicherlich noch viel Optimierungsbedarf drin.

      Kommentar


        #4
        Hallo grisu,

        ich habe noch nie Plugins erstellt, weder für Wiregate, noch für SH/SV. Daher ist mir dein Vorgehen durchaus bekannt, sich was "zusammenzufrickeln". Es wäre nett, wenn du dein WDE-Plugin veröffentlichen könntest. Dann könnte ich mich ja mal an CUNO wagen.

        Gruß
        Karsten

        Kommentar


          #5
          So anbei mein zusammengesuchter Code für das WDE1-2. Ich denke dalässt sich noch viel optimieren. Also für die Profies sicherlich kein Problem.
          Angesprochen werden die Einzelnen Sensoren über die definierten Bezeichnungen ab "TempSensor1" bis "Rain".

          /plugins/kombis/__init__.py
          Code:
          import logging
          import time
          import re
          import serial
          import threading
          import struct
          
          logger = logging.getLogger('')
          
          
          class KombiS():
              _serial = None
              _sock = None
              _lock = None
              _target = None
              _connection_attempts = 0
              _dataoffset = 0
              _items = {}
              connected = False
          
              def __init__(self, smarthome, host=None, port=0, serialport=None, cycle=120):
                  self._sh = smarthome
                  self.host = host
                  self.port = port
                  self.serialport = serialport
                  self.cycle = cycle
                  self._lock = threading.Lock()
                  smarthome.connections.monitor(self)
          
              def run(self):
                  self.alive = True
                  self._sh.scheduler.add('wde1', self._refresh, cycle=self.cycle)
          
              def stop(self):
                  self.alive = False
                  self.disconnect()
          
              def parse_item(self, item):
                  if 'wde1' in item.conf:
                      wde = item.conf['wde1']
                      if wde not in self._items:
                          self._items[wde] = []
                      self._items[wde].append(item)
                      logger.debug('Item: {}'.format(self._items))
                      return self.update_item
                  return None
          
              def parse_logic(self, logic):
                  pass
          
              def update_item(self, item, caller=None, source=None, dest=None):
                  if caller != 'KombiS':
                      pass
          
              def connect(self):
                  self._lock.acquire()
                  target = None
                  try:
                      if self.serialport is not None:
                          self._target = 'serial://{}'.format(self.serialport)
                          self._serial = serial.Serial(
                              self.serialport, 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout=2)
                          self._serial.flushInput()
                  except Exception as e:
                      self._connection_attempts -= 1
                      if self._connection_attempts <= 0:
                          self.log_err('wde1: Could not connect to {}: {}'.format(self._target, e))
                          self._connection_attempts = self._connection_errorlog
                      self._lock.release()
                      return
                  else:
                      logger.info('wde1: Connected to {}'.format(self._target))
                      self.connected = True
                      self._connection_attempts = 0
                      self._lock.release()
          
              def disconnect(self):
                  if self.connected:
                      try:
                          if self._serial is not None:
                              self._serial.close()
                              self._serial = None
                          elif self._sock is not None:
                              self._sock.shutdown(socket.SHUT_RDWR)
                              self._sock = None
                      except:
                          pass
                      logger.info('wde1: Disconnected!')
                      self.connected = False
                      self._target = None
                      self._connection_attempts = 0
          
              def _readline(self):
                  if self._serial is not None:
                      return self._serial.readline()
                  elif self._sock is not None:
                      return self._sock.recv()
                  
              def _refresh(self):
                  if self.connected:
                      start = time.time()
                      #self._serial.flushInput()
                      try:
                          self._dataoffset = 0
                          data = self._readline()
                      except Exception as e:
                          logger.error(
                              'could not retrieve data from {0}: {1}'.format(self._target, e))
                          return
                      logger.debug('Data: {}'.format(data))
          
                      data = data.decode('utf-8')
                      sdata = data.split(";")
                      if len(sdata) == 25:
                          del sdata[0]
                          del sdata[23]
                          #logger.info('Temp: {}'.format(sdata[18]))
                          #TempKombi = sdata[18].replace(",",".")
                          values = {
                              'TempSensor1'   : sdata[1].replace(",","."),
                              'TempSensor2'   : sdata[2].replace(",","."),
                              'TempSensor3'   : sdata[3].replace(",","."),
                              'TempSensor4'   : sdata[4].replace(",","."),
                              'TempSensor5'   : sdata[5].replace(",","."),
                              'TempSensor6'   : sdata[6].replace(",","."),
                              'TempSensor7'   : sdata[7].replace(",","."),
                              'TempSensor8'   : sdata[8].replace(",","."),
                              'HumSensor1'    : sdata[9].replace(",","."),
                              'HumSensor2'    : sdata[10].replace(",","."),
                              'HumSensor3'    : sdata[11].replace(",","."),
                              'HumSensor4'    : sdata[12].replace(",","."),
                              'HumSensor5'    : sdata[13].replace(",","."),
                              'HumSensor6'    : sdata[14].replace(",","."),
                              'HumSensor7'    : sdata[16].replace(",","."),
                              'HumSensor8'    : sdata[17].replace(",","."),
                              'TempKombi'     : sdata[18].replace(",","."),
                              'HumKombi'      : sdata[19].replace(",","."),
                              'WindSpeed'     : sdata[20].replace(",","."),
                              'RainVol'       : sdata[21],
                              'Rain'          : sdata[22]
                          }
                          for wde in values:
                              #logger.info('wde & values: {}'.format(wde))
                              #logger.info('values: {}'.format(values))
                              if wde in self._items:
                                  #logger.info('self_item: {}'.format(self._items))
                                  for item in self._items[wde]:
                                      item(values[wde])
                                      #logger.info('Item: {}'.format(item))
                      elif len(sdata) != 25:
                          logger.info('no Data from wde1')
                      #logger.debug('Data after split: {}'.format(sdata))
                      #laenge = len(sdata)
          
                      #logger.debug('length of list: {}'.format(laenge))
                      cycletime = time.time() - start
                      logger.debug("wde1 cycle takes %d seconds", cycletime)
          Die conf-Datei sieht bei mir bespielhaft so aus:

          Code:
          [WS300]
              [[Tempaussen]]
                  name = Außentemp
                  wde1 = TempKombi
                  type = num
                  visu = yes
                  enforce_updates = yes
                  sqlite = true
              [[LuftFeuchte]]
                  name = Luftfeuchte
                  wde1 = HumKombi
                  type = num
                  visu = yes
                  enforce_updates = yes
                  sqlite = true
          usw.

          Gruß grisu911

          Kommentar

          Lädt...
          X