mirror of
https://github.com/Manuel83/craftbeerpi3
synced 2026-08-10 02:55:27 +02:00
First Refactoring
- Major API Changes in Core Module - Will be changed further. Still work in progress
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
from modules.core.baseapi import Buzzer
|
||||
from modules.core.basetypes import Actor, KettleController, FermenterController
|
||||
from modules.core.core import cbpi
|
||||
|
||||
@cbpi.addon.actor.type("Dummy Actor")
|
||||
class Dummy(Actor):
|
||||
|
||||
|
||||
@cbpi.addon.actor.action("WOHOO")
|
||||
def myaction(self):
|
||||
print "HALLO!!!"
|
||||
|
||||
def on(self, power=100):
|
||||
'''
|
||||
Code to switch on the actor
|
||||
:param power: int value between 0 - 100
|
||||
:return:
|
||||
'''
|
||||
print "ON"
|
||||
|
||||
def off(self):
|
||||
print "OFF"
|
||||
|
||||
|
||||
|
||||
@cbpi.addon.kettle.controller()
|
||||
class MyController(KettleController):
|
||||
|
||||
|
||||
def run(self):
|
||||
while self.is_running():
|
||||
print "HALLO"
|
||||
self.sleep(1)
|
||||
|
||||
@cbpi.addon.fermenter.controller()
|
||||
class MyController2(FermenterController):
|
||||
|
||||
|
||||
def run(self):
|
||||
while self.is_running():
|
||||
print "HALLO"
|
||||
self.sleep(1)
|
||||
|
||||
@cbpi.addon.core.initializer(order=200)
|
||||
def init(cbpi):
|
||||
|
||||
class MyBuzzer(Buzzer):
|
||||
def beep(self):
|
||||
print "BEEEEEEP"
|
||||
|
||||
cbpi.buzzer = MyBuzzer()
|
||||
@@ -1,223 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import time
|
||||
|
||||
|
||||
from modules.core.props import Property, StepProperty
|
||||
from modules.core.step import StepBase
|
||||
from modules import cbpi
|
||||
|
||||
|
||||
|
||||
@cbpi.step
|
||||
class MashStep(StepBase):
|
||||
'''
|
||||
Just put the decorator @cbpi.step on top of a method
|
||||
'''
|
||||
# Properties
|
||||
temp = Property.Number("Temperature", configurable=True, description="Target Temperature of Mash Step")
|
||||
kettle = StepProperty.Kettle("Kettle", description="Kettle in which the mashing takes place")
|
||||
timer = Property.Number("Timer in Minutes", configurable=True, description="Timer is started when the target temperature is reached")
|
||||
|
||||
def init(self):
|
||||
'''
|
||||
Initialize Step. This method is called once at the beginning of the step
|
||||
:return:
|
||||
'''
|
||||
# set target tep
|
||||
self.set_target_temp(self.temp, self.kettle)
|
||||
|
||||
@cbpi.action("Start Timer Now")
|
||||
def start(self):
|
||||
'''
|
||||
Custom Action which can be execute form the brewing dashboard.
|
||||
All method with decorator @cbpi.action("YOUR CUSTOM NAME") will be available in the user interface
|
||||
:return:
|
||||
'''
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
def reset(self):
|
||||
self.stop_timer()
|
||||
self.set_target_temp(self.temp, self.kettle)
|
||||
|
||||
def finish(self):
|
||||
self.set_target_temp(0, self.kettle)
|
||||
|
||||
def execute(self):
|
||||
'''
|
||||
This method is execute in an interval
|
||||
:return:
|
||||
'''
|
||||
|
||||
# Check if Target Temp is reached
|
||||
if self.get_kettle_temp(self.kettle) >= float(self.temp):
|
||||
# Check if Timer is Running
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
# Check if timer finished and go to next step
|
||||
if self.is_timer_finished() == True:
|
||||
self.notify("Mash Step Completed!", "Starting the next step", timeout=None)
|
||||
self.next()
|
||||
|
||||
|
||||
@cbpi.step
|
||||
class MashInStep(StepBase):
|
||||
'''
|
||||
Just put the decorator @cbpi.step on top of a method
|
||||
'''
|
||||
# Properties
|
||||
temp = Property.Number("Temperature", configurable=True, description="Target Temperature of Mash Step")
|
||||
kettle = StepProperty.Kettle("Kettle", description="Kettle in which the mashing takes place")
|
||||
s = False
|
||||
|
||||
@cbpi.action("Change Power")
|
||||
def change_power(self):
|
||||
self.actor_power(1, 50)
|
||||
|
||||
def init(self):
|
||||
'''
|
||||
Initialize Step. This method is called once at the beginning of the step
|
||||
:return:
|
||||
'''
|
||||
# set target tep
|
||||
self.s = False
|
||||
self.set_target_temp(self.temp, self.kettle)
|
||||
|
||||
|
||||
|
||||
def execute(self):
|
||||
'''
|
||||
This method is execute in an interval
|
||||
:return:
|
||||
'''
|
||||
|
||||
# Check if Target Temp is reached
|
||||
if self.get_kettle_temp(self.kettle) >= float(self.temp) and self.s is False:
|
||||
self.s = True
|
||||
self.notify("Step Temp Reached!", "Please press the next button to continue", timeout=None)
|
||||
|
||||
|
||||
|
||||
@cbpi.step
|
||||
class ChilStep(StepBase):
|
||||
|
||||
timer = Property.Number("Timer in Minutes", configurable=True, default_value=0, description="Timer is started immediately")
|
||||
|
||||
@cbpi.action("Stat Timer")
|
||||
def start(self):
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
def reset(self):
|
||||
self.stop_timer()
|
||||
|
||||
|
||||
def finish(self):
|
||||
pass
|
||||
|
||||
def execute(self):
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
if self.is_timer_finished() == True:
|
||||
self.next()
|
||||
|
||||
@cbpi.step
|
||||
class PumpStep(StepBase):
|
||||
|
||||
pump = StepProperty.Actor("Pump", description="Pump actor gets toogled")
|
||||
timer = Property.Number("Timer in Minutes", configurable=True, default_value=0, description="Timer is started immediately")
|
||||
|
||||
@cbpi.action("Stat Timer")
|
||||
def start(self):
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
def reset(self):
|
||||
self.stop_timer()
|
||||
|
||||
|
||||
def finish(self):
|
||||
self.actor_off(int(self.pump))
|
||||
|
||||
def init(self):
|
||||
self.actor_on(int(self.pump))
|
||||
|
||||
def execute(self):
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
if self.is_timer_finished() == True:
|
||||
self.next()
|
||||
|
||||
@cbpi.step
|
||||
class BoilStep(StepBase):
|
||||
'''
|
||||
Just put the decorator @cbpi.step on top of a method
|
||||
'''
|
||||
# Properties
|
||||
temp = Property.Number("Temperature", configurable=True, default_value=100, description="Target temperature for boiling")
|
||||
kettle = StepProperty.Kettle("Kettle", description="Kettle in which the boiling step takes place")
|
||||
timer = Property.Number("Timer in Minutes", configurable=True, default_value=90, description="Timer is started when target temperature is reached")
|
||||
hop_1 = Property.Number("Hop 1 Addition", configurable=True, description="Fist Hop alert")
|
||||
hop_1_added = Property.Number("",default_value=None)
|
||||
hop_2 = Property.Number("Hop 2 Addition", configurable=True, description="Second Hop alert")
|
||||
hop_2_added = Property.Number("", default_value=None)
|
||||
hop_3 = Property.Number("Hop 3 Addition", configurable=True)
|
||||
hop_3_added = Property.Number("", default_value=None, description="Second Hop alert")
|
||||
|
||||
def init(self):
|
||||
'''
|
||||
Initialize Step. This method is called once at the beginning of the step
|
||||
:return:
|
||||
'''
|
||||
# set target tep
|
||||
self.set_target_temp(self.temp, self.kettle)
|
||||
|
||||
|
||||
|
||||
|
||||
@cbpi.action("Start Timer Now")
|
||||
def start(self):
|
||||
'''
|
||||
Custom Action which can be execute form the brewing dashboard.
|
||||
All method with decorator @cbpi.action("YOUR CUSTOM NAME") will be available in the user interface
|
||||
:return:
|
||||
'''
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
|
||||
def reset(self):
|
||||
self.stop_timer()
|
||||
self.set_target_temp(self.temp, self.kettle)
|
||||
|
||||
def finish(self):
|
||||
self.set_target_temp(0, self.kettle)
|
||||
|
||||
|
||||
def check_hop_timer(self, number, value):
|
||||
|
||||
if self.__getattribute__("hop_%s_added" % number) is not True and time.time() > (
|
||||
self.timer_end - (int(self.timer) * 60 - int(value) * 60)):
|
||||
self.__setattr__("hop_%s_added" % number, True)
|
||||
self.notify("Hop Alert", "Please add Hop %s" % number, timeout=None)
|
||||
|
||||
def execute(self):
|
||||
'''
|
||||
This method is execute in an interval
|
||||
:return:
|
||||
'''
|
||||
# Check if Target Temp is reached
|
||||
if self.get_kettle_temp(self.kettle) >= float(self.temp):
|
||||
# Check if Timer is Running
|
||||
if self.is_timer_finished() is None:
|
||||
self.start_timer(int(self.timer) * 60)
|
||||
else:
|
||||
self.check_hop_timer(1, self.hop_1)
|
||||
self.check_hop_timer(2, self.hop_2)
|
||||
self.check_hop_timer(3, self.hop_3)
|
||||
# Check if timer finished and go to next step
|
||||
if self.is_timer_finished() == True:
|
||||
self.notify("Boil Step Completed!", "Starting the next step", timeout=None)
|
||||
self.next()
|
||||
@@ -1,53 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
from modules import cbpi, socketio
|
||||
from modules.core.hardware import SensorActive
|
||||
from modules import cbpi
|
||||
from modules.core.props import Property
|
||||
|
||||
|
||||
@cbpi.sensor
|
||||
class DummyTempSensor(SensorActive):
|
||||
|
||||
temp = Property.Number("Temperature", configurable=True, default_value=5, description="Dummy Temperature as decimal value")
|
||||
|
||||
@cbpi.action("My Custom Action")
|
||||
def my_action(self):
|
||||
print "HELLO WORLD"
|
||||
pass
|
||||
|
||||
def get_unit(self):
|
||||
'''
|
||||
:return: Unit of the sensor as string. Should not be longer than 3 characters
|
||||
'''
|
||||
return "°C" if self.get_config_parameter("unit", "C") == "C" else "°F"
|
||||
|
||||
def stop(self):
|
||||
SensorActive.stop(self)
|
||||
|
||||
def execute(self):
|
||||
'''
|
||||
Active sensor has to handle his own loop
|
||||
:return:
|
||||
'''
|
||||
while self.is_running() is True:
|
||||
self.data_received(self.temp)
|
||||
self.sleep(5)
|
||||
|
||||
@classmethod
|
||||
def init_global(cls):
|
||||
'''
|
||||
Called one at the startup for all sensors
|
||||
:return:
|
||||
'''
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
from modules import cbpi
|
||||
from modules.core.controller import KettleController, FermenterController
|
||||
from modules.core.props import Property
|
||||
|
||||
|
||||
@cbpi.fermentation_controller
|
||||
class Hysteresis(FermenterController):
|
||||
|
||||
heater_offset_min = Property.Number("Heater Offset ON", True, 0, description="Offset as decimal number when the heater is switched on. Should be greater then 'Heater Offset OFF'. For example a value of 2 switches on the heater if the current temperature is 2 degrees below the target temperature")
|
||||
heater_offset_max = Property.Number("Heater Offset OFF", True, 0, description="Offset as decimal number when the heater is switched off. Should be smaller then 'Heater Offset ON'. For example a value of 1 switches off the heater if the current temperature is 1 degree below the target temperature")
|
||||
cooler_offset_min = Property.Number("Cooler Offset ON", True, 0, description="Offset as decimal number when the cooler is switched on. Should be greater then 'Cooler Offset OFF'. For example a value of 2 switches on the cooler if the current temperature is 2 degrees above the target temperature")
|
||||
cooler_offset_max = Property.Number("Cooler Offset OFF", True, 0, description="Offset as decimal number when the cooler is switched off. Should be less then 'Cooler Offset ON'. For example a value of 1 switches off the cooler if the current temperature is 1 degree above the target temperature")
|
||||
|
||||
def stop(self):
|
||||
super(FermenterController, self).stop()
|
||||
|
||||
self.heater_off()
|
||||
self.cooler_off()
|
||||
|
||||
def run(self):
|
||||
while self.is_running():
|
||||
|
||||
target_temp = self.get_target_temp()
|
||||
temp = self.get_temp()
|
||||
|
||||
if temp + float(self.heater_offset_min) <= target_temp:
|
||||
self.heater_on(100)
|
||||
|
||||
if temp + float(self.heater_offset_max) >= target_temp:
|
||||
self.heater_off()
|
||||
|
||||
if temp >= target_temp + float(self.cooler_offset_min):
|
||||
self.cooler_on(100)
|
||||
|
||||
if temp <= target_temp + float(self.cooler_offset_max):
|
||||
self.cooler_off()
|
||||
|
||||
self.sleep(1)
|
||||
@@ -1,107 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import time
|
||||
|
||||
from modules import cbpi
|
||||
from modules.core.hardware import ActorBase, SensorPassive, SensorActive
|
||||
from modules.core.props import Property
|
||||
|
||||
try:
|
||||
import RPi.GPIO as GPIO
|
||||
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
except Exception as e:
|
||||
print e
|
||||
pass
|
||||
|
||||
|
||||
|
||||
@cbpi.actor
|
||||
class GPIOSimple(ActorBase):
|
||||
|
||||
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):
|
||||
GPIO.setup(int(self.gpio), GPIO.OUT)
|
||||
GPIO.output(int(self.gpio), 0)
|
||||
|
||||
def on(self, power=0):
|
||||
print "GPIO ON %s" % str(self.gpio)
|
||||
GPIO.output(int(self.gpio), 1)
|
||||
|
||||
def off(self):
|
||||
print "GPIO OFF"
|
||||
GPIO.output(int(self.gpio), 0)
|
||||
|
||||
@cbpi.actor
|
||||
class GPIOPWM(ActorBase):
|
||||
|
||||
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")
|
||||
duty_cylce = Property.Number("Duty Cycle", configurable=True)
|
||||
|
||||
p = None
|
||||
power = 100
|
||||
|
||||
def init(self):
|
||||
GPIO.setup(int(self.gpio), GPIO.OUT)
|
||||
GPIO.output(int(self.gpio), 0)
|
||||
|
||||
|
||||
def on(self, power=None):
|
||||
if power is not None:
|
||||
self.power = int(power)
|
||||
|
||||
if self.duty_cylce is None:
|
||||
duty_cylce = 50
|
||||
|
||||
self.p = GPIO.PWM(int(self.gpio), int(self.duty_cylce))
|
||||
self.p.start(int(self.power))
|
||||
|
||||
def set_power(self, power):
|
||||
'''
|
||||
Optional: Set the power of your actor
|
||||
:param power: int value between 0 - 100
|
||||
:return:
|
||||
'''
|
||||
if power is not None:
|
||||
self.power = int(power)
|
||||
self.p.ChangeDutyCycle(self.power)
|
||||
|
||||
def off(self):
|
||||
print "GPIO OFF"
|
||||
self.p.stop()
|
||||
|
||||
|
||||
@cbpi.actor
|
||||
class RelayBoard(ActorBase):
|
||||
|
||||
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):
|
||||
GPIO.setup(int(self.gpio), GPIO.OUT)
|
||||
GPIO.output(int(self.gpio), 1)
|
||||
|
||||
def on(self, power=0):
|
||||
|
||||
GPIO.output(int(self.gpio), 0)
|
||||
|
||||
def off(self):
|
||||
|
||||
GPIO.output(int(self.gpio), 1)
|
||||
|
||||
@cbpi.actor
|
||||
class Dummy(ActorBase):
|
||||
|
||||
|
||||
def on(self, power=100):
|
||||
'''
|
||||
Code to switch on the actor
|
||||
:param power: int value between 0 - 100
|
||||
:return:
|
||||
'''
|
||||
print "ON"
|
||||
|
||||
def off(self):
|
||||
print "OFF"
|
||||
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
from modules import cbpi
|
||||
from modules.core.controller import KettleController
|
||||
from modules.core.props import Property
|
||||
|
||||
|
||||
@cbpi.controller
|
||||
class Hysteresis(KettleController):
|
||||
|
||||
# Custom Properties
|
||||
|
||||
on = Property.Number("Offset On", True, 0, description="Offset below target temp when heater should switched on. Should be bigger then Offset Off")
|
||||
off = Property.Number("Offset Off", True, 0, description="Offset below target temp when heater should switched off. Should be smaller then Offset Off")
|
||||
|
||||
def stop(self):
|
||||
'''
|
||||
Invoked when the automatic is stopped.
|
||||
Normally you switch off the actors and clean up everything
|
||||
:return: None
|
||||
'''
|
||||
super(KettleController, self).stop()
|
||||
self.heater_off()
|
||||
|
||||
|
||||
|
||||
|
||||
def run(self):
|
||||
'''
|
||||
Each controller is exectuted in its own thread. The run method is the entry point
|
||||
:return:
|
||||
'''
|
||||
while self.is_running():
|
||||
|
||||
if self.get_temp() < self.get_target_temp() - float(self.on):
|
||||
self.heater_on(100)
|
||||
elif self.get_temp() >= self.get_target_temp() - float(self.off):
|
||||
self.heater_off()
|
||||
else:
|
||||
self.heater_off()
|
||||
self.sleep(1)
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
from subprocess import Popen, PIPE, call
|
||||
|
||||
from modules import cbpi, app
|
||||
from modules.core.hardware import SensorPassive
|
||||
import json
|
||||
import os, re, threading, time
|
||||
from flask import Blueprint, render_template, request
|
||||
from modules.core.props import Property
|
||||
|
||||
blueprint = Blueprint('one_wire', __name__)
|
||||
|
||||
temp = 22
|
||||
|
||||
def getSensors():
|
||||
try:
|
||||
arr = []
|
||||
for dirname in os.listdir('/sys/bus/w1/devices'):
|
||||
if (dirname.startswith("28") or dirname.startswith("10")):
|
||||
cbpi.app.logger.info("Device %s Found (Family: 28/10, Thermometer on GPIO4 (w1))" % dirname)
|
||||
arr.append(dirname)
|
||||
return arr
|
||||
except:
|
||||
return []
|
||||
|
||||
|
||||
|
||||
|
||||
class myThread (threading.Thread):
|
||||
|
||||
value = 0
|
||||
|
||||
|
||||
def __init__(self, sensor_name):
|
||||
threading.Thread.__init__(self)
|
||||
self.value = 0
|
||||
self.sensor_name = sensor_name
|
||||
self.runnig = True
|
||||
|
||||
def shutdown(self):
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
self.runnig = False
|
||||
|
||||
def run(self):
|
||||
|
||||
while self.runnig:
|
||||
try:
|
||||
app.logger.info("READ TEMP")
|
||||
## Test Mode
|
||||
if self.sensor_name is None:
|
||||
return
|
||||
with open('/sys/bus/w1/devices/w1_bus_master1/%s/w1_slave' % self.sensor_name, 'r') as content_file:
|
||||
content = content_file.read()
|
||||
if (content.split('\n')[0].split(' ')[11] == "YES"):
|
||||
temp = float(content.split("=")[-1]) / 1000 # temp in Celcius
|
||||
self.value = temp
|
||||
except:
|
||||
pass
|
||||
|
||||
time.sleep(4)
|
||||
|
||||
|
||||
|
||||
@cbpi.sensor
|
||||
class ONE_WIRE_SENSOR(SensorPassive):
|
||||
|
||||
sensor_name = Property.Select("Sensor", getSensors(), description="The OneWire sensor address.")
|
||||
offset = Property.Number("Offset", True, 0, description="Offset which is added to the received sensor data. Positive and negative values are both allowed.")
|
||||
|
||||
def init(self):
|
||||
|
||||
self.t = myThread(self.sensor_name)
|
||||
|
||||
def shudown():
|
||||
shudown.cb.shutdown()
|
||||
shudown.cb = self.t
|
||||
|
||||
self.t.start()
|
||||
|
||||
def stop(self):
|
||||
try:
|
||||
self.t.stop()
|
||||
except:
|
||||
pass
|
||||
|
||||
def read(self):
|
||||
if self.get_config_parameter("unit", "C") == "C":
|
||||
self.data_received(round(self.t.value + self.offset_value(), 2))
|
||||
else:
|
||||
self.data_received(round(9.0 / 5.0 * self.t.value + 32 + self.offset_value(), 2))
|
||||
|
||||
@cbpi.try_catch(0)
|
||||
def offset_value(self):
|
||||
return float(self.offset)
|
||||
|
||||
@classmethod
|
||||
def init_global(self):
|
||||
try:
|
||||
call(["modprobe", "w1-gpio"])
|
||||
call(["modprobe", "w1-therm"])
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
|
||||
@blueprint.route('/<int:t>', methods=['GET'])
|
||||
def set_temp(t):
|
||||
global temp
|
||||
temp = t
|
||||
return ('', 204)
|
||||
|
||||
|
||||
@cbpi.initalizer()
|
||||
def init(cbpi):
|
||||
|
||||
cbpi.app.register_blueprint(blueprint, url_prefix='/api/one_wire')
|
||||
@@ -0,0 +1,36 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from modules.core.basetypes import Actor, Sensor
|
||||
from modules.core.core import cbpi
|
||||
from modules.core.proptypes import Property
|
||||
import random
|
||||
print "INit SENSOR"
|
||||
@cbpi.addon.sensor.type("Dummy Sensor")
|
||||
class Dummy(Sensor):
|
||||
|
||||
text = Property.Text(label="Text", required=True, description="This is a parameter", configurable=True)
|
||||
p = Property.Select(label="hallo",options=[1,2,3])
|
||||
|
||||
def init(self):
|
||||
|
||||
if self.api.get_config_parameter("unit","C") == "C":
|
||||
self.unit = "°C"
|
||||
else:
|
||||
self.unit = "°F"
|
||||
|
||||
@cbpi.addon.sensor.action("WOHOO")
|
||||
def myaction(self):
|
||||
print self.text
|
||||
print "SENSOR ACTION HALLO!!!"
|
||||
|
||||
def execute(self):
|
||||
while True:
|
||||
try:
|
||||
self.update_value(int(self.text))
|
||||
except:
|
||||
pass
|
||||
self.api.sleep(1)
|
||||
|
||||
@cbpi.addon.core.action(key="clear", label="Clear all Logs")
|
||||
def woohoo(cbpi):
|
||||
print "COOL"
|
||||
cbpi.notify(headline="HELLO WORLD",message="")
|
||||
@@ -0,0 +1,14 @@
|
||||
from modules.core.basetypes import Step
|
||||
from modules.core.core import cbpi
|
||||
from modules.core.proptypes import Property
|
||||
|
||||
|
||||
@cbpi.addon.step.type("Dummy Step")
|
||||
class Dummy(Step):
|
||||
|
||||
|
||||
text = Property.Text(label="Text", configurable=True, description="WOHOOO")
|
||||
|
||||
def execute(self):
|
||||
#print self.text
|
||||
pass
|
||||
Reference in New Issue
Block a user