Properties

Properties can be use in all extensions. During the startup the server scans all extension for variables of type Property. Theses properties are exposed to the user for configuration during run time. For example the user can set the GPIO number or the 1Wire Id.

Typical example how to use properties in an actor module.

Custom Actor

__init__.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
import logging
from unittest.mock import MagicMock, patch

from cbpi.api import *


logger = logging.getLogger(__name__)

try:
    import RPi.GPIO as GPIO
except Exception:
    logger.error("Failed to load RPi.GPIO. Using Mock")
    MockRPi = MagicMock()
    modules = {
        "RPi": MockRPi,
        "RPi.GPIO": MockRPi.GPIO
    }
    patcher = patch.dict("sys.modules", modules)
    patcher.start()
    import RPi.GPIO as GPIO

class CustomActor(CBPiActor):

    # Custom property which can be configured by the user

    def init(self):
        pass

    def on(self, power=0):
        logger.info("ACTOR %s ON" % self.id)
        self.state = True

    def off(self):
        logger.info("ACTOR %s OFF " % self.id)
        self.state = False




class GPIOActor(CBPiActor):

    # Custom property which can be configured by the user

    gpio = Property.Select("GPIO", options=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27], description="GPIO to which the actor is connected")

    def init(self):
        try:
            GPIO.setup(int(self.gpio), GPIO.OUT)
            GPIO.output(int(self.gpio), 0)
        except Exception as e:
            raise CBPiException("FAILD TO INIT ACTOR")

    def on(self, power=0):

        print("GPIO ON %s" % str(self.gpio))
        GPIO.output(int(self.gpio), 1)
        self.state = True

    def off(self):
        print("GPIO OFF %s" % str(self.gpio))
        GPIO.output(int(self.gpio), 0)
        self.state = False

class GPIORelayBoardActor(CBPiActor):

    # Custom property which can be configured by the user

    gpio = Property.Select("GPIO", options=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27], description="GPIO to which the actor is connected")

    def init(self):
        try:
            GPIO.setup(int(self.gpio), GPIO.OUT)
            GPIO.output(int(self.gpio), 1)
        except Exception as e:
            raise CBPiException("FAILD TO INIT ACTOR")

    def on(self, power=0):

        print("GPIO ON %s" % str(self.gpio))
        GPIO.output(int(self.gpio), 0)
        self.state = True

    def off(self):
        print("GPIO OFF %s" % str(self.gpio))
        GPIO.output(int(self.gpio), 1)
        self.state = False



def setup(cbpi):

    '''
    This method is called by the server during startup 
    Here you need to register your plugins at the server
    
    :param cbpi: the cbpi core 
    :return: 
    '''

    cbpi.plugin.register("CustomActor", CustomActor)
class cbpi.api.Property
class Actor(label, description='')

The user select an actor which is available in the system. The value of this variable will be the actor id

class Kettle(label, description='')

The user select a kettle which is available in the system. The value of this variable will be the kettle id

class Number(label, configurable=False, default_value=None, unit='', description='')

The user can set a number value

class Select(label, options, description='')

Select Property. The user can select value from list set as options parameter

class Sensor(label, description='')

The user select a sensor which is available in the system. The value of this variable will be the sensor id

class Text(label, configurable=False, default_value='', description='')

The user can set a text value