From e7a7e60622e7b83890541cc6f5c171f7bc06fc98 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Tue, 1 Dec 2020 12:36:39 +0100 Subject: [PATCH] added missing pro and png file --- yeelight/integrationpluginyeelight.py | 128 +++++++++++++++++++------- yeelight/requirements.txt | 19 +--- yeelight/yeelight.png | Bin 0 -> 11806 bytes yeelight/yeelight.pro | 4 + 4 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 yeelight/yeelight.png create mode 100644 yeelight/yeelight.pro diff --git a/yeelight/integrationpluginyeelight.py b/yeelight/integrationpluginyeelight.py index 70a9a000..6df1e05b 100644 --- a/yeelight/integrationpluginyeelight.py +++ b/yeelight/integrationpluginyeelight.py @@ -1,30 +1,68 @@ +# Copyright 2013 - 2020, nymea GmbH +# Contact: contact@nymea.io +# +# This file is part of nymea. +# This project including source code and documentation is protected by +# copyright law, and remains the property of nymea GmbH. All rights, including +# reproduction, publication, editing and translation, are reserved. The use of +# this project is subject to the terms of a license agreement to be concluded +# with nymea GmbH in accordance with the terms of use of nymea GmbH, available +# under https://nymea.io/license +# +# GNU Lesser General Public License Usage +# Alternatively, this project may be redistributed and/or modified under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; version 3. This project 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this project. If not, see . +# +# For any further details and any questions please contact us under +# contact@nymea.io or see our FAQ/Licensing Information on +# https://nymea.io/license/faq + import nymea from yeelight import discover_bulbs from yeelight import Bulb import threading -timers = {} +bulbs = {} def init(): logger.log("Yeelight init") def deinit(): - for timer in timers: - timers[timer].cancel() + logger.log("Yeelight deinit") + def discoverThings(info): - logger.log("discoverThings", info.thingClassId, "Yeelight discovery test") + logger.log("discoverThings", info.thingClassId, "Yeelight discovery") + discover_bulbs() + def setupThing(info): logger.log("setupThing", info.thing.name, "Setting up bulb") info.thing.nameChangedHandler = nameChanged if info.thingClassId == colorBulbThingClassId: - bulb = Bulb("192.168.0.19", effect="smooth", duration=1000) + address = info.thing.paramValue(colorBulbThingHostParamTypeId) + logger.log("Setting up color bulb with address", address) + bulb = Bulb(address, effect="smooth", duration=1000) + thread = threading.Thread(target=bulb.listen, args=(bulbCallback,)) + thread.start() + bulbs[info.thing.id] = bulb + info.finish(nymea.ThingErrorNoError) + else if info.thingClassId == colorBulbThingClassId: + address = info.thing.paramValue(dimmableBulbThingHostParamTypeId) + logger.log("Setting up dimmable bulb with address", address) + info.finish(nymea.ThingErrorNoError) + else: + logger.log("Setup thing: Thing class id not found", info.thingClassId) + info.finish(nymea.ThingErrorThingClassNotFound) - timers[info.thing] = threading.Timer(10, runTestForever, [info.thing]) - timers[info.thing].start() - info.finish(nymea.ThingErrorNoError) def postSetupThing(thing): logger.log("postSetupThing", thing) @@ -36,35 +74,61 @@ def nameChanged(thing): def thingRemoved(thing): logger.log("thingRemoved:", thing.name) - timers[thing].cancel() - del timers[thing] + + if thing.thingClassId == colorBulbThingClassId || info.thingClassId == dimmableBulbThingClassId: + bulb = bulbs.get(thing.id) + bulbs.remove(thing.id) + bulb.stop_listening() def executeAction(info): logger.log("executeAction") - if info.actionTypeId == colorBulbPowerActionTypeId: - info.finish(nymea.ThingErrorNoError) - runTest(info.thing, duration=info.paramValue(speedtestRunTestActionDurationParamTypeId)) - bulb.turn_on() - bulb.turn_off() + thing = info.thing + action = info.action + + if thing.thingClassId == colorBulbThingClassId: + bulb = bulbs.get(thing.id) + if action.actionTypeId == colorBulbPowerActionTypeId: + state = action.param(colorBulbPowerActionPowerParamTypeId).value + if state: + bulb.turn_on() + else: + bulb.turn_off() + else if action.actionTypeId == colorBulbColorTemperatureActionTypeId: + temperature = action.param(colorBulbColorTemperatureActionColorTemperatureParamTypeId).value + bulb.set_color_temp(temperature) + else if action.actionTypeId == colorBulbColorActionTypeId: + color = action.param(colorBulbColorActionColorParamTypeId).value + bulb.set_rgb(hex_color_to_rgb(color)) + else if action.actionTypeId == colorBulbBrightnessActionTypeId: + bulb.set_brightness(10) + else if action.actionTypeId == colorBulbEffectActionTypeId: + bulb.turn_on(effect="sudden") + else if action.actionTypeId == colorBulbColorModeActionTypeId: + bulb.set_color_mode() + else: + logger.log("Action type Id not found", action.actionTypeId) + else if thing.thingClassId == dimmableBulbThingClassId: + bulb = bulbs.get(thing.id) + if action.actionTypeId == dimmableBulbPowerActionTypeId: + else if action.actionTypeId == colorBulbBrightnessActionTypeId: + + else: + logger.log("Action type Id not found", action.actionTypeId) + else: + logger.log("Execute action, thingClass not found", thing.thingClassId) + info.finish(nymea.ThingErrorThingClassNotAvailable) -def runTest(thing, duration=10): - logger.log("Running speed test for:", thing.name, "with maximum duration", duration) - thing.setStateValue(speedtestTestRunningStateTypeId, True) - result = fast_com(maxtime=duration, verbose=True) - thing.setStateValue(speedtestLastResultStateTypeId, result) - logger.log("Speed test result:", result) - thing.setStateValue(speedtestTestRunningStateTypeId, False) - param = nymea.Param(speedtestTestCompletedEventResultParamTypeId, result) - params = [param] - thing.emitEvent(speedtestTestCompletedEventTypeId, params) - logger.log("all done") +def hex_color_to_rgb(color): + color = color.strip("#") + try: + red, green, blue = tuple(int(color[i : i + 2], 16) for i in (0, 2, 4)) + except (TypeError, ValueError): + logger.log("Unrecognized color, changing to red...", file=sys.stderr) + red, green, blue = (255, 0, 0) + return red, green, blue -def runTestForever(thing): - del timers[thing] - runTest(thing) - logger.log("Running next test in %i minutes." % thing.settings[0].value) - timers[thing] = threading.Timer(thing.settings[0].value * 60, runTestForever, [thing]) - timers[thing].start() +def bulbCallback: + logger.log("bulb callback) diff --git a/yeelight/requirements.txt b/yeelight/requirements.txt index 8cea8274..3623ba39 100644 --- a/yeelight/requirements.txt +++ b/yeelight/requirements.txt @@ -1,15 +1,4 @@ - -fastdotcom==0.0.3 \ - --hash=sha256:84647d665119cfbef01bf785607b85d7a29353208605ca53a4155c331e407cd6 \ - --hash=sha256:c77689b5595e0ef89d60d5d3a2f669ef2f158d2868fda65e1201d91b53e013b3 -requests==2.24.0 \ - --hash=sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b \ - --hash=sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898 -certifi==2017.4.17 \ - --hash=sha256:f4318671072f030a33c7ca6acaef720ddd50ff124d1388e50c1bda4cbd6d7010 -idna==2.10 \ - --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 -chardet==3.0.4 \ - --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 -urllib3==1.25.10 \ - --hash=sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461 +yeelight==0.5.4 \ + --hash=sha256:1e4c045ef636f5996ab4545e2a54a37f66acd5c97b9305b42cde1a3a4f596d46 \ + --hash=sha256:21817e052a5ccc6ef06d9785b04451f0dfe92736cdcd7267cb8928144e97041c \ + --hash=sha256:7fba48280886c2e818334d7410c2a91c9e204cff35d21ba2d80c12d9ad73a412 diff --git a/yeelight/yeelight.png b/yeelight/yeelight.png new file mode 100644 index 0000000000000000000000000000000000000000..53323a67c4e385fcd413802d36cfa361b815ad7f GIT binary patch literal 11806 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 baCsYl@B&Q(aAo@Q2Dh4$_LCBY7s3AvPR6WI literal 0 HcmV?d00001 diff --git a/yeelight/yeelight.pro b/yeelight/yeelight.pro new file mode 100644 index 00000000..ecd12541 --- /dev/null +++ b/yeelight/yeelight.pro @@ -0,0 +1,4 @@ +TEMPLATE = aux + +OTHER_FILES = integrationpluginyeelight.py \ + integrationpluginyeelight.json