Giter Club home page Giter Club logo

ad-automoli's Introduction

automoli

Fully automatic light management based on motion as AppDaemon app.

πŸ•“ multiple daytimes to define different scenes for morning, noon, ...
πŸ’‘ supports Hue (for Hue Rooms/Groups) & Home Assistant scenes
πŸ”Œ switches lights and plugs (with lights)
β˜€οΈ supports illumination sensors to switch the light just if needed
πŸ’¦ supports humidity sensors as blocker (the "shower case")
πŸ” automatic discovery of lights and sensors
⛰️ stable and tested by many people with different homes

Getting Started

Docker Image (amd64, arm and arm64)

You can try AutoMoLi via Docker without installing anything! The Image is the default AppDaemon one with AutoMoLi and a simple default configuration added. See the AppDaemon Docker Tutorial on how to use it in general.

AutoMoLi expects motion sensors and lights including a room name. The exact patterns are listed in Auto-Discovery of Lights and Sensors You can set a room with the AUTOMOLI_ROOM variable in the Docker run command.

docker run --rm --interactive --tty --name AutoMoLi \
--env HA_URL="<HA URL>" \
--env TOKEN="<HA Token>" \
--env AUTOMOLI_ROOM="bathroom" \
--ports 5050:5050 \
benleb/automoli:latest

Port 5050 is opened to give access to the AppDaemon Admin-UI at http://127.0.0.1:5050

Example

To test AutoMoLi in your Esszimmer (german for dining room), use ... --env AUTOMOLI_ROOM="esszimmer" ... in the Docker run command.

  • AppDaemon will show you its config file on startup: cfg

  • If everything works, AutoMoLi will show you the configuration it has parsed, including the discovered sensors: cfg-loaded

  • This is how it looks when AutoMoLi manages your lights: running

Installation

Use HACS or download the automoli directory from inside the apps directory here to your local apps directory, then add the configuration to enable the automoli module.

Example App Configuration

Add your configuration to appdaemon/apps/apps.yaml, an example with two rooms is below.

livingroom:
  module: automoli
  class: AutoMoLi
  room: livingroom
  disable_switch_entities:
    - input_boolean.automoli
    - input_boolean.disable_my_house
  delay: 600
  daytimes:
      # This rule "morning" uses a scene, the scene.livingroom_morning Home Assistant scene will be used
    - { starttime: "sunrise", name: morning, light: "scene.livingroom_morning" }

    - { starttime: "07:30", name: day, light: "scene.livingroom_working" }

      # This rule"evening" uses a percentage brightness value, and the lights specified in lights: below will be set to 90%
    - { starttime: "sunset-01:00", name: evening, light: 90 }

    - { starttime: "22:30", name: night, light: 20 }

      # This rule has the lights set to 0, so they will no turn on during this time period
    - { starttime: "23:30", name: more_night, light: 0 }

  # If you are using an illuminance sensor you can set the lowest value here that blocks the lights turning on if its already light enough
  illuminance: sensor.illuminance_livingroom
  illuminance_threshold: 100

  # You can specify a light group or list of lights here
  lights:
    - light.livingroom

  # You can specify a list of motion sensors here
  motion:
    - binary_sensor.motion_sensor_153d000224f421
    - binary_sensor.motion_sensor_128d4101b95fb7

  # See below for info on humidity
  humidity:
    - sensor.humidity_128d4101b95fb7


bathroom:
  module: automoli
  class: AutoMoLi
  room: bathroom
  delay: 180
  motion_state_on: "on"
  motion_state_off: "off"
  daytimes:
    - { starttime: "05:30", name: morning, light: 45 }
    - { starttime: "07:30", name: day, light: "scene.bathroom_day" }
    - { starttime: "20:30", name: evening, light: 100 }
    - { starttime: "sunset+01:00", name: night, light: 0 }

  # As this is a bathroom there could be the case that when taking a bath or shower, motion is not detected and the lights turn off, which isnt helpful, so the following settings allow you to use a humidity sensor and humidity threshold to prevent this by detecting the humidity from the shower and blocking the lights turning off.
  humidity:
    - sensor.humidity_128d4101b95fb7
  humidity_threshold: 75

  lights:
    - light.bathroom
    - switch.plug_68fe8b4c9fa1
  motion:
    - binary_sensor.motion_sensor_158d033224e141

Auto-Discovery of Lights and Sensors

AutoMoLi is built around rooms. Every room or area in your home is represented as a seperate app in AppDaemon with separat light setting. In your configuration you will have one config block for every room, see example configuration.
For the auto-discovery of your lights and sensors to work, AutoMoLi expects motion sensors and lights including a room name (can also be something else than a real room) like below:

  • sensor.illumination_room
  • binary_sensor.motion_sensor_room
  • binary_sensor.motion_sensor_room_something
  • light.room

AutoMoLi will detect them automatically. Manually configured entities will take precedence, but need to follow the naming scheme above.

Configuration Options

key optional type default description
module False string automoli The module name of the app.
class False string AutoMoLi The name of the Class.
room False string The "room" used to find matching sensors/light
disable_switch_entities True list/string One or more Home Assistant Entities as switch for AutoMoLi. If the state of any entity is off, AutoMoLi is deactivated. (Use an input_boolean for example)
only_own_events True bool Track if automoli switched this light on. If not, an existing timer will be deleted and the state will not change
disable_switch_states True list/string ["off"] Custom states for disable_switch_entities. If the state of any entity is in this list, AutoMoLi is deactivated. Can be used to disable with media_players in playing state for example.
disable_hue_groups False boolean Disable the use of Hue Groups/Scenes
delay True integer 150 Seconds without motion until lights will switched off. Can be disabled (lights stay always on) with 0
motion_event True string replaced by motion_state_on/off
daytimes True list see code Different daytimes with light settings (see below)
transition_on_daytime_switch True bool False directly activate a daytime on its start time (instead to just set it as active daytime used if lights are switched from off to on)
lights True list/string auto detect Light entities
motion True list/string auto detect Motion sensor entities
illuminance True list/string Illuminance sensor entities
illuminance_threshold True integer If illuminance is above this value, lights will not switched on
humidity True list/string Humidity sensor entities
humidity_threshold True integer If humidity is above this value, lights will not switched off
motion_state_on True integer If using motion sensors which don't send events if already activated, like Xiaomi do, add this to your config with "on". This will listen to state changes instead
motion_state_off True integer If using motion sensors which don't send events if already activated, like Xiaomi do, add this to your config with "off". This will listen to the state changes instead.
debug_log True bool false Activate debug logging (for this room)

daytimes

key optional type default description
starttime False string Time this daytime starts or sunrise
name False string A name for this daytime
delay True integer 150 Seconds without motion until lights will switched off. Can be disabled (lights stay always on) with 0. Setting this will overwrite the global delay setting for this daytime.
light False integer/string Light setting (percent integer value (0-100) in or scene entity

Meta

Ben Lebherz: automation lover βš™οΈ developer & maintainer - @benleb | @ben_leb

This project is licensed under the MIT License - see the LICENSE file for details

ad-automoli's People

Contributors

allthebester avatar benleb avatar chbndrhnns avatar deepsourcebot avatar evildad avatar legovaer avatar paviro avatar samnewman86 avatar thundergreen avatar xaviml avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ad-automoli's Issues

TypeError: 'async_generator' object is not iterable

When using v.0.8.0, v.0.8.1 and master, I get the following error:

2020-08-06 14:42:02.055791 INFO AppDaemon: Loading App Module: /config/appdaemon/apps/ad-automoli/automoli.py
2020-08-06 14:42:02.105642 INFO AppDaemon: Initializing app sala using class AutoMoLi from module automoli
2020-08-06 14:42:02.228217 WARNING sala: ------------------------------------------------------------
2020-08-06 14:42:02.231024 WARNING sala: Unexpected error in worker for App sala:
2020-08-06 14:42:02.233421 WARNING sala: Worker Ags: {}
2020-08-06 14:42:02.236121 WARNING sala: ------------------------------------------------------------
2020-08-06 14:42:02.240342 WARNING sala: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 143, in initialize_app
await init()
File "/config/appdaemon/apps/ad-automoli/automoli.py", line 176, in initialize
await self.build_daytimes(self.args.get("daytimes", DEFAULT_DAYTIMES))
File "/config/appdaemon/apps/ad-automoli/automoli.py", line 420, in build_daytimes
and any((await self.get_state(entity_id=entity, attribute="is_hue_group") for entity in self.lights))
TypeError: 'async_generator' object is not iterable
2020-08-06 14:42:02.241793 WARNING sala: ------------------------------------------------------------

v0.7.3 works fine.

My config:

sala:
module: automoli
class: AutoMoLi
room: Sala
disable_switch_entities:
- input_boolean.luz_sala_movimiento
delay: 180
daytimes:
- { starttime: "06:00", name: day, light: turn on }
- { starttime: "18:30", name: evening, light: turn on }
lights:
- light.sala
motion:
- binary_sensor.movimiento_sala
- binary_sensor.sensor_puerta_principal
- binary_sensor.puerta_principal
motion_state_on: "on"
motion_state_off: "off"

Notes:
Even though my lights are Hue, they are connected in Zigbee2Mqtt without a Hue bridge, and the group is configured as a LightGroup in Home Assistant.

Daytimes are configured this way because I don't want Automoli to handle brightness, as it is handled by Circadian Lighting custom component https://github.com/claytonjn/hass-circadian_lighting

Feature request: night_mode

Instead of using daytimes a night_mode would be great! I have an input boolean called night_mode when its on I would like the lights to turn on with a brightness set for night mode if its off use the default.

An configuration idea / example:

xyz:
  module: automoli
  class: AutoMoLi
  room: xyz
  delay: 180
  night_mode_entity: 'input_boolean.night_mode'
  night_mode_brightness: 100
  night_mode_scene: scene.bla
  brightness: 255
  motion:
    - binary_sensor.xyz
  lights:
    - light.xyz

Even cooler would be if lights would also dimm up if night mode is disabled while the light is already on.

There also is this https://github.com/apop880/Night-Mode maybe it could be used if when not configuring any daytimes it would not use defaults and instead just toggle the light with the current brightness. apop880`s night mode can already be kind of used by setting all daytimes to 100% brightness but the lights will flash up before being dimmed down then.

Unavailable entity throws error

I get this error when a deconz entity is not available:

2020-10-11 18:56:16.015232 WARNING bathroom_automoli: Unexpected error in worker for App bathroom_automoli:
2020-10-11 18:56:16.015795 WARNING bathroom_automoli: Worker Ags: {'id': '6551b500931b4fc880e303b095baa2ff', 'name': 'bathroom_automoli', 'objectid': '5d1fdd11ed98484083239056d93e2200', 'type': 'scheduler', 'function': <bound method AutoMoLi.lights_off of <automoli.AutoMoLi object at 0x7f870f37f340>>, 'pin_app': True, 'pin_thread': 3, 'kwargs': {'__thread_id': 'thread-3'}}
2020-10-11 18:56:16.016717 WARNING bathroom_automoli: ------------------------------------------------------------
2020-10-11 18:56:16.017463 WARNING bathroom_automoli: Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 887, in worker
    funcref(self.AD.sched.sanitize_timer_kwargs(app, args["kwargs"]))
  File "/config/appdaemon/apps/ad-automoli/automoli.py", line 330, in lights_off
    blocker = [
  File "/config/appdaemon/apps/ad-automoli/automoli.py", line 333, in <listcomp>
    if float(self.get_state(sensor)) >= self.thresholds["humidity"]
ValueError: could not convert string to float: 'unavailable'

[Enhancement] Door sensor to turn on / off lights

Like humidity sensor for "shower time" could you add door sensor to keep light on when door sensor state is close and turn off when door is open ?

My case is for toilets :
I go in the toilet, motion detector turn light on
if door_sensor is close within 10 seconds => disable motion sensor until I open door and then when door is opened , turn off light because i leave toilets. And finally, activate again motion sensor.

So two cases :

  • Go to the toilet (don't close the door), i'm going to pee, work as usual with motion detector
  • Go to the toilet (turn on light by motion sensor) , close the door, stay here for some time πŸ’© and turn off light when I leave toilets by opening the door

To achieve it, add two fields :

  • timeout -> time to disable motion sensor, after motion sensor is reactivated
  • door : entity to disable motion sensor and maintain light on

Exemple config :

auto_lights_wc:
module: automoli
class: AutoMoLi
room: wc
delay: 180
timeout: 500
daytimes:
- { starttime: "00:01", name: night, light: 10 }
- { starttime: "05:30", name: morning, light: 45 }
- { starttime: "07:30", name: day, light: 255 }
- { starttime: "22:30", name: evening, light: 150 }
- { starttime: "23:30", name: night, light: 80 }
lights:
- light.wc
motion:
- binary_sensor.motion_sensor_wc
door:
- binary_sensor.door_wc

how is scene suppoesd to work

could you please add an ex ample and explain how scenes are supposed to work. I don't nderstand. I thought i can create scenes in hoeassistant and it will fire this scenes? can't find an example.

Thanks in advance :) I am porting all my automations to automili :)

For me scenes are to set brightness color etc but i don't get this ruunning somehow :/

KeyError: 'light_setting'

Sorry for so much all at once... just don't want to forget to post these!
Not sure what's causing it... I am using switches and not lights. I have a mixture of switches and lights in the "lights" list... maybe that's the issue?
or maybe we need a "switches" property.
I'll can try to help fix if you want.

2020-01-13 19:07:28.408780 WARNING ellys_bedroom: Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/appdaemon/threading.py", line 793, in worker
    funcref(args["event"], data, args["kwargs"])
  File "/conf/apps/automoli/automoli.py", line 233, in motion_event
    self.lights_on()
  File "/conf/apps/automoli/automoli.py", line 258, in lights_on
    if isinstance(self.active["light_setting"], str):
KeyError: 'light_setting'

Lights turn off even when disable switch is turned off

Below is my app config. Even when I turn the disable switch on (off) my light still shuts off after the 60 second delay. I'm not sure if I'm doing something wrong or its a bug. My disable switch is an input boolean and it does halfway work. When deactivated the lights will not turn on by motion, but if I manually turn them on and motion is detected the count down still starts.
I use SmartThings motion detectors, if knowing that makes a difference.
`################################################################################

Kitchen Light Motion App

kitchen:
module: automoli
class: AutoMoLi
room: kitchen
disable_switch_entity: input_boolean.motion_kitchen
delay: 60
daytimes:
- { starttime: "00:00", name: overnight, light: 10 }
- { starttime: "05:30", name: early_morning, light: 25 }
- { starttime: "07:00", name: morning, light: 45 }
- { starttime: "08:55", name: day, light: 0 }
- { starttime: "16:45", name: evening, light: 65 }
- { starttime: "20:30", name: night, light: 50 }
- { starttime: "22:00", name: more_night, light: 35 }

illuminance_threshold: 10

lights:
- light.kitchen_sink_light
motion:
- binary_sensor.kitchen_motion
motion_state_on: "on"
motion_state_off: "off"
`

light turn on by motion off state_change?

I could nnow get the app running but apparently it listens really to each state chage but not only "on" state change to turn on the light.

if motion is detected light turns on.. after timer off and on again and then off again after the timer :/

Allow relative humidity value

In my bathroom, I can never quite tell how much humidity is in there but whenever I start showering, it will go up.
So, I am missing a baseline value to enable the humidity option.

Would it be possible to allow for a relative value to be set in the config that is compared to the value when the light was initially turned on?

Gledopto lights.

hi, got one issue with it.
i got 4 spots and 1 led strips, all are from the brand gledopto.
the can connect to hue bridge and are working with the hue app and in hassio.

but i got to use like this:
- { starttime: "06:30", name: morning, light: turn on }
- { starttime: "09:30", name: day, light: turn on }
- { starttime: "18:00", name: evening, light: turn on }
- { starttime: "22:30", name: night, light: turn on }
- { starttime: "23:30", name: more_night, light: 10 }

instead of the % brightness. if i put the % brightness, the lights turn on and switch off
is there a way to turn on and set the brightness?
and is there way to setup rgb color? for different starttimes?

log error:

I added illuminance and get this in logs:

2019-10-07 22:59:24.338275 INFO bathroom: No illuminance sensors given or found ('sensor.luminance_') οΏ½οΏ½οΏ½ disabling humidity threshold blocker.

Why disabling huidity blocker if luminance is not available?

README says daytimes is optional, but if you leave it off...

 File "/usr/local/lib/python3.7/site-packages/appdaemon/app_management.py", line 145, in initialize_app
    await utils.run_in_executor(self, init)
  File "/usr/local/lib/python3.7/site-packages/appdaemon/utils.py", line 277, in run_in_executor
    response = future.result()
  File "/usr/local/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/conf/apps/automoli/automoli.py", line 115, in initialize
    for idx, daytime in enumerate(daytimes):
TypeError: 'NoneType' object is not iterable

Please forgive me if I'm missing something!

Light does not go off with 0.8.2

I cannot get my bathroom light to automatically power off after the configured period. Switching on works fine. It works for me with the 0.7 release, though. In the logs, I cannot see an indication that something is wrong.

Interestingly, the kitchen config also works fine for switching off.

Config kitchen
kitchen_automoli:
  module: automoli
  class: AutoMoLi
  room: KΓΌche
  delay: 100
  daytimes:
    - { starttime: "06:00", name: day, light: 100 }
    - { starttime: "20:30", name: evening, light: 90 }
    - { starttime: "23:30", name: night, light: 40 }
  illuminance: 
    - sensor.lightlevel_43
  illuminance_threshold: 40
  motion_state_on: "on"
  motion_state_off: "off"
  lights:
    - light.strip_kitchen
  motion:
    - binary_sensor.motionkitchen
Config bathroom
bathroom_automoli:
  module: automoli
  class: AutoMoLi
  room: Bad
  delay: 100
  daytimes:
    - { starttime: "05:30", name: day, light: 100 }
    - { starttime: "20:30", name: evening, light: 90 }
    - { starttime: "23:30", name: night, light: 40 }
  illuminance: 
    - sensor.motion_bathroom
  illuminance_threshold: 40
  motion_state_on: "on"
  motion_state_off: "off"
  lights:
    - light.bulb_bathroom
  motion:
    - binary_sensor.motion_bathroom
  humidity:
    - sensor.climate_bathroom_2
  humidity_threshold: 65
Logs
2020-08-12 20:10:49.161074 INFO bathroom_automoli: πŸ’‘ Bad turned on β†’ brightness: 100% | delay: 100sec
2020-08-12 20:10:54.640593 INFO kitchen_automoli: self.handles = {'a22cce78009346389c4424abdbad7848'}
2020-08-12 20:10:54.644697 INFO kitchen_automoli: handles = {'a22cce78009346389c4424abdbad7848'}
2020-08-12 20:10:54.654273 INFO kitchen_automoli: data = {'entity_id': 'binary_sensor.motionkitchen', 'new': 'on', 'old': 'off'}
2020-08-12 20:12:40.065584 INFO kitchen_automoli: πŸŒ‘ no motion in KΓΌche since 100sec β†’ turned off

AttributeError: 'list' object has no attribute 'split'

I see this error since a couple of weeks now in the AD logs. Out of your mind, has some config option changed in automoli? I am using version 0.7.2

2020-06-28 23:55:51.013582 WARNING bathroom_automoli: Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 766, in worker
    funcref(self.AD.sched.sanitize_timer_kwargs(app, args["kwargs"]))
  File "/config/appdaemon/apps/ad-automoli/automoli.py", line 324, in lights_off
    f"πŸ› no motion in {hl(self.room.capitalize())} since "
  File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 191, in inner_sync_wrapper
    f = run_coroutine_threadsafe(self, coro(self, *args, **kwargs))
  File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 285, in run_coroutine_threadsafe
    result = future.result(self.AD.internal_function_timeout)
  File "/usr/lib/python3.8/concurrent/futures/_base.py", line 439, in result
    return self.__get_result()
  File "/usr/lib/python3.8/concurrent/futures/_base.py", line 388, in __get_result
    raise self._exception
  File "/usr/lib/python3.8/site-packages/appdaemon/adapi.py", line 1310, in get_state
    return await self.AD.state.get_state(
  File "/usr/lib/python3.8/site-packages/appdaemon/state.py", line 351, in get_state
    domain = entity_id.split(".", 1)[0]
AttributeError: 'list' object has no attribute 'split'

Allow sunset/sunrise + offset for daytimes

If I would like my light to switch on only in darkness, it would be nice to have a setting that takes the current sunrise/sunset time plus an additional offset as input for daytime.

Deconz even exposes a dark attribute on their sensors which can be configured using the Deconz API. Maybe this would useful, as well.

ValueError: could not convert string to float: 'unavailable'

I noticed this error today in my logs:

2020-07-15 07:20:51.007807 WARNING bathroom_automoli: Unexpected error in worker for App bathroom_automoli:
2020-07-15 07:20:51.008158 WARNING bathroom_automoli: Worker Ags: {'id': '1b2479fe6dfa42e28635d165700c95b5', 'name': 'bathroom_automoli', 'objectid': 'bd68eb2316b6415983f3abca2f090419', 'type': 'scheduler', 'function': <bound method AutoMoLi.lights_off of <automoli.AutoMoLi object at 0x7f4463612bb0>>, 'pin_app': True, 'pin_thread': 4, 'kwargs': {'__thread_id': 'thread-4'}}
2020-07-15 07:20:51.008458 WARNING bathroom_automoli: ------------------------------------------------------------
2020-07-15 07:20:51.009063 WARNING bathroom_automoli: Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 766, in worker
    funcref(self.AD.sched.sanitize_timer_kwargs(app, args["kwargs"]))
  File "/config/appdaemon/apps/ad-automoli/automoli.py", line 330, in lights_off
    blocker = [
  File "/config/appdaemon/apps/ad-automoli/automoli.py", line 333, in <listcomp>
    if float(self.get_state(sensor)) >= self.thresholds["humidity"]
ValueError: could not convert string to float: 'unavailable'

It seems to be related to some unavailable sensor. Could we maybe ignore the configured sensor threshold and switch off the light instead?

Feature Request

Forgive me if this can be established with the current state of the application.

Situation.
I manually 'turn on' a light (say the hallway light)
The lights brightness is set to '100'
I then move and Automoli adjusts the brightness to '35' (which is what I have set up in the app)
But I want it to stay at '100' for this momentary use case.

I know I can disable the motion app with the input_boolean but I still want the light to turn off after 60 seconds of no motion.

Hopefully I made sense.

Thank you for the great app.

ModuleNotFoundError from ad-ench applies here, too

I am seeing the ModuleNotFoundError here, too:

2020-01-20 15:32:48.768224 WARNING livingroom: Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 820, in check_app_updates
    await self.init_object(app)
  File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 271, in init_object
    modname = await utils.run_in_executor(self, __import__, app_args["module"])
  File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 276, in run_in_executor
    response = future.result()
  File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/appdaemon/apps/automoli/automoli.py", line 32, in <module>
    from adutils import ADutils, hl
ModuleNotFoundError: No module named 'adutils'

Lifx not lighting up sometimes

I've got a few tradfri and lifx bulbs set up and while the tradfri bulbs work great the lifx bulbs are giving me some trouble.

Sometimes when automoli turns the lifx bulbs on they won't light up while the log shows no error and just shows the message that the bulb has been turned on.
The HomeAssistant interface also shows the bulb as turned on.
If I then manually turn the lifx bulb off and on in HomeAssistant it lights up just fine, with the brightness level that automoli had set.
Strangely this seems to happen more with the brightness set low, I already tried increasing the brightness by a few % but it didn't seem to help.

Any ideas what might be causing this or how I can debug this further?

illuminance_threshold cause error

Hi, I'm having a problem with the illluminance value.
Here is my configuration:
---- the script for appdaemon----BEGIN
flurstern:
module: automoli
class: AutoMoLi
room: Flurstern
delay: 60
daytimes:
- { starttime: "05:30", name: morning, light: "light.flurstern" }
- { starttime: "07:30", name: day, light: "light.flurstern" }
illuminance: sensor.000d5a49919777_average_illumination
illuminance_threshold: 40
lights:
- light.flurstern
motion:
- binary_sensor.aqara_motion2
- binary_sensor.presence_15
motion_state_on: "on"
motion_state_off: "off"
---- the script for appdaemon----END

the sensor is from Homematic
image

If I delete the line "illuminance_threshold: 40" the script works as expected, and the light goes on and off if the motion sensor detects something.

If the threshold value is active I get this error as soon as motion is detected:
2020-07-31 18:27:32.180735 WARNING Flurstern: ------------------------------------------------------------
2020-07-31 18:27:32.182503 WARNING Flurstern: Unexpected error in worker for App Flurstern:
2020-07-31 18:27:32.182983 WARNING Flurstern: Worker Ags: {'id': 'c49e967de284412491621db173477f56', 'name': 'Flurstern', 'objectid': 'f5516d89776f4f9592711ae121561347', 'type': 'state', 'function': <bound method AutoMoLi.motion_detected of <automoli.AutoMoLi object at 0x7f10ef18a100>>, 'attribute': 'state', 'entity': 'binary_sensor.aqara_motion2', 'new_state': 'on', 'old_state': 'off', 'pin_app': True, 'pin_thread': 0, 'kwargs': {'new': 'on', '__thread_id': 'thread-0'}}
2020-07-31 18:27:32.183497 WARNING Flurstern: ------------------------------------------------------------
2020-07-31 18:27:32.183993 WARNING Flurstern: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 777, in worker
funcref(entity, attr, old_state, new_state,
File "/config/appdaemon/apps/ad-automoli/automoli.py", line 210, in motion_detected
self.motion_event("state_changed_detection", data, kwargs)
File "/config/appdaemon/apps/ad-automoli/automoli.py", line 227, in motion_event
self.lights_on()
File "/config/appdaemon/apps/ad-automoli/automoli.py", line 257, in lights_on
if float(self.get_state(sensor)) >= self.thresholds["illuminance"]:
TypeError: float() argument must be a string or a number, not 'dict'
2020-07-31 18:27:32.185391 WARNING Flurstern: ------------------------------------------------------------

Did I miss something?
regards

Daytime is using UTC

Edit: Never mind my Appdaemon was misconfigured

I think something changed in the way HA uses /stores DateTime and now AppDaemon's call to now_is_between is using the current UTC time not the current local time

event_listener not working for NON-Xiaomi Motion Sensors

HI! Thanks again for this woonderfull App but I think there's an issue with the motion event listener. it only listens to xiaomi events if i read the code well. I have z-wave fibaro sensors which won't trigger

This might be the part of the xiaomi motion event listener but no other motion event listeners are in the code :


EVENT_MOTION = "xiaomi_aqara.motion"

Xiaomi presence detectors cannot be used for illuminance calculation

The xiaomi presence sensor exposes illumaniance, as well. But in its current implementation, automoli cannot understand it:

2020-02-03 13:45:15.909403 WARNING stairs: Worker Ags: {'id': '23d7f4c23b8a462ba79fb75c728f0060', 'name': 'stairs', 'objectid': 'cb34a19c208c4a54bff6f9cd6028ef99', 'type': 'state', 'function': <bound method AutoMoLi.motion_detected_state of <automoli.AutoMoLi object at 0x7fc34196a520>>, 'attribute': 'state', 'entity': 'binary_sensor.motion_bathroom', 'new_state': 'on', 'old_state': 'off', 'pin_app': True, 'pin_thread': 2, 'kwargs': {'new': 'on', '__thread_id': 'thread-2'}}
2020-02-03 13:45:15.910372 WARNING stairs: ------------------------------------------------------------
2020-02-03 13:45:15.911616 WARNING stairs: Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/appdaemon/threading.py", line 777, in worker
    funcref(entity, attr, old_state, new_state,
  File "/config/appdaemon/apps/automoli/automoli.py", line 302, in motion_detected_state
    self.motion_event("state_changed_detection", data, kwargs)
  File "/config/appdaemon/apps/automoli/automoli.py", line 325, in motion_event
    self.lights_on()
  File "/config/appdaemon/apps/automoli/automoli.py", line 344, in lights_on
    blocker = [
  File "/config/appdaemon/apps/automoli/automoli.py", line 347, in <listcomp>
    if float(self.get_state(sensor)) >= self.illuminance_threshold
ValueError: could not convert string to float: 'on'

Would it be possible to have a configurable entity attribute where the iilluminance value is taken from?

[Enhancement] Auto Turn Off lights that have been manually turned on, for energy saving purposes

In our house we have motion sensors in every room that form part of the alarm system. These are available to HA.
It would be useful if automoli could be used to switch off the lights in rooms that are unoccupied, or even just set the status of a room to unoccupied, which would allow the lights to be switched off and he heating reduced etc, without needed for them to be switched on automatically.

Dynamic start of night mode

I am looking for a way to enable a night mode (like reduced hue) based on an input Boolean that I activate with a switch, for example.

The use case is like this: when going to bed, I switch on night mode and I expect AutoMoLi to activate a specific scene.

Is this already possible?

Dynamic daytimes

I'd love to have the daytime adjustments be dynamic based on sunset time (e.g. sunset-1hr, sunset-30mins etc etc)

Make disable_switch_entities and disable_switch_states more flexible

First of all thank you for your add-on! Its great and makes my motion sensor work perfectly!

I have a feature suggestion (maybe its already possible and I am just to stupid).

I would like to have a switch "Motions Sensors Room X", when the switch is on automoli should do its job. This is already possible of course but I also have a TV in the same room, where the disable_switch_states would be the opposite. So automoli should stop doing its job either when the TV is on or when the motion sensor input boolean is off.

Maybe a configuration like this would be possible?

room_motionsensor:
  module: automoli
  class: AutoMoLi
  room: room1
  #### Interesting bit start ####
  disable_switch_entities:
    - switch.fernseher:
      disable_switch_states: "on"
    - input_boolean.motionsensor:
      disable_switch_states: "off"
   #### Interesting bit end ####
  delay: 300
  daytimes:
    - { starttime: "05:30", name: morning, light: 50 }
    - { starttime: "08:30", name: day, light: 100 }
    - { starttime: "00:00", name: night, light: 35 }
  motion_state_on: "on"
  motion_state_off: "off"
  motion:
    - binary_sensor.room_motion
  lights:
    - light.room_decke_1
    - light.room_decke_2
    - light.room_decke_3

[FR] add device tracker as switch

Hi! To make things easier and maybe more logical it would be great having directly something like device tracker instead of setting up an autoomation to control the input boolean.

Just an idea.. I will use input boolean now but would be great if we couls also use something like group.phones as switch or does this already work with a group entity?

Testing scenarios

Would you be able to suggest an approach for unit-testing the configured scenarios? I am wondering how this could be achieved.

Log

Hello,

I'm starting with HA and AppDeamon, nothing seems to work on my installation :)

To undertsand why, how/where can I check log for this app ?

My config :
auto_lights_hall:
module: automoli
class: AutoMoLi
room: hall
delay: 180
daytimes:
- { starttime: "00:01", name: night, light: 10 }
- { starttime: "05:30", name: morning, light: 45 }
- { starttime: "07:30", name: day, light: 30 }
- { starttime: "22:30", name: evening, light: 150 }
- { starttime: "23:30", name: night, light: 80 }
lights:
- light.hall
motion:
- binary_sensor.motion_sensor_hall_entree
- binary_sensor.motion_sensor_hall

In /config/appdaemon/logs/appdaemon.log I ve only log for appdeamon not apps.

I'm sorry for my neewbie question :)

Daytimes mixing scenes and light percentages

πŸ™„ Is your feature request related to a problem? Please describe.
I am currently using a mixture of scenes and light brightness for my daytimes. If a light is enabled after 10pm for example the scene badezimmer_entspannend is triggered after 0am the same scene is continued being used just dimmer. If the light isn't triggered between 10pm and 0am however the scene before badezimmer_abend will be used.

😍 Describe the solution you'd like
Add an option to use the last specified scene (with adjusted brightness) when using only light brightness or the possibility to specify both scene and brightness.

πŸ–ΌοΈ Example/See here!

badezimmer_bewegungsmelder:
  module: automoli
  class: AutoMoLi
  room: Badezimmer
  delay: 180
  daytimes:
    - { starttime: "05:00", name: morning, light: 30 }
    - { starttime: "09:30", name: morning, light: "scene.badezimmer_normal" }
    - { starttime: "18:30", name: morning, light: "scene.badezimmer_abend" }
    - { starttime: "22:00", name: night, light: "scene.badezimmer_entspannend" }
    - { starttime: "00:00", name: night, light: 50 }
  
  motion_state_on: "on"
  motion_state_off: "off"
  motion:
    - binary_sensor.badezimmer_bewegung
    - binary_sensor.flur_og_bewegung
    
  dim:
    method: transition
    seconds_before: 15

Unable to find module - Example configuration

First of all this is out of my usual experience level and im new to home assistant. I do though have a generel understanding of this.

I am experiencing an error with the example configuration.

This is my apps.yaml config:

Livingroom:
module: automoli
class: AutoMoLi
room: Livingroom
delay: 600
daytimes:
- { starttime: "05:30", name: morning, light: "Morning" }
- { starttime: "07:30", name: day, light: "Working" }
- { starttime: "20:30", name: evening, light: 90 }
- { starttime: "22:30", name: night, light: 20 }
- { starttime: "23:30", name: more_night, light: 0 }
lights:
- light.loft_2
- light.loft_1
motion:
- binary_sensor.pir_1
humidity:
- sensor.aeon_labs_zw100_multisensor_6_relative_humidity

I am getting the following error:

2020-03-18 22:08:26.210700 INFO AppDaemon: Initializing app Livingroom using class AutoMoLi from module automoli
2020-03-18 22:08:26.211242 WARNING Livingroom: ------------------------------------------------------------
2020-03-18 22:08:26.211473 WARNING Livingroom: Unexpected error initializing app: Livingroom:
2020-03-18 22:08:26.211671 WARNING Livingroom: ------------------------------------------------------------
2020-03-18 22:08:26.212437 WARNING Livingroom: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 820, in check_app_updates
await self.init_object(app)
File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 279, in init_object
"object": app_class(
File "/usr/lib/python3.8/site-packages/appdaemon/plugins/hass/hassapi.py", line 46, in init
adbase.ADBase.init(self, ad, name, logging, args, config, app_config, global_vars)
File "/usr/lib/python3.8/site-packages/appdaemon/adbase.py", line 75, in init
self.dashboard_dir = self.AD.http.dashboard_dir
AttributeError: 'NoneType' object has no attribute 'dashboard_dir'
2020-03-18 22:08:26.212830 WARNING Livingroom: ------------------------------------------------------------
2020-03-18 22:08:26.213128 WARNING AppDaemon: Unable to find module Livingroom - initialize() skipped
2020-03-18 22:08:26.213512 INFO AppDaemon: App initialization complete

Can someone tell me if its a Automoli issue or if i have configured AppDaemon incorrect?

Thanks in advance, i would really appreciate some help.

AutoMoli not working anymore .. nothing in logs

Hello I used AutoMoli and was fan until today :P Well my setup stopped working. I changed the config to latest information in the release notes but still nothing work no error thrown.

Here is my config maybe you can have a quick look:

entrance:
  module: automoli
  class: AutoMoLi
  room: Entrance
  disable_switch_entities: 
    - input_boolean.automoli_general
  delay: 10
  daytimes:
    - { starttime: "05:30", name: morning, light: 0 }
    - { starttime: "07:20", name: day, light: 1 }
    - { starttime: "20:30", name: evening, light: 1 }
    - { starttime: "22:30", name: night, light: 0 }
    - { starttime: "23:30", name: more_night, light: 0 }
  illuminance_threshold: 29
  illuminance: 
    - sensor.average_luminance_in_the_house
  lights:
    - light.entrance
  motion:
    - binary_sensor.multisenor_entrance_motion
  motion_state_on: "on"
  motion_state_off: "off"

all entities are there and work correctly Any hint here?

Bath mode

Hi,

Today i have a simple solution that overrides the "off" automation if i activate the "bath time" mode. Then the automation starts over next time it detects motion (by deactivating the bath time-mode)

Would something like this be possible to add?

Support Python 3.7

Python 3.7.3 is the current latest version available on Raspbian, on which many people have Home Assistant and AppDaemon installed.

Python 3.8 is not available unless one builds it from source.

Would it be possible to keep supporting Python 3.7 until 3.8 is available in raspbian repos? I found at least one breaking change in the last release

App not loading

The app isn't loading properly. Can't find module adutils. See appdaemon log below.

`[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 00-banner.sh: executing...


Hass.io Add-on: AppDaemon 4
Python Apps and Dashboard using AppDaemon 4.x for Home Assistant

Add-on version: 0.1.2
You are running the latest version of this add-on.
System: Ubuntu 18.04.3 LTS (amd64 / qemux86-64)
Home Assistant version: 0.105.3
Supervisor version: 200

Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.

[cont-init.d] 00-banner.sh: exited 0.
[cont-init.d] 01-log-level.sh: executing...
[cont-init.d] 01-log-level.sh: exited 0.
[cont-init.d] appdaemon.sh: executing...
[cont-init.d] appdaemon.sh: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
[10:35:39] INFO: Starting AppDaemon...
2020-02-14 11:35:39.729553 INFO AppDaemon: AppDaemon Version 4.0.1 starting
2020-02-14 11:35:39.729724 INFO AppDaemon: Python version is 3.8.1
2020-02-14 11:35:39.729847 INFO AppDaemon: Configuration read from: /config/appdaemon/appdaemon.yaml
2020-02-14 11:35:39.729958 INFO AppDaemon: Added log: AppDaemon
2020-02-14 11:35:39.730076 INFO AppDaemon: Added log: Error
2020-02-14 11:35:39.730186 INFO AppDaemon: Added log: Access
2020-02-14 11:35:39.730294 INFO AppDaemon: Added log: Diag
2020-02-14 11:35:39.740978 INFO AppDaemon: Loading Plugin HASS using class HassPlugin from module hassplugin
2020-02-14 11:35:39.758290 INFO HASS: HASS Plugin Initializing
2020-02-14 11:35:39.758473 INFO HASS: HASS Plugin initialization complete
2020-02-14 11:35:39.758783 INFO AppDaemon: Initializing HTTP
2020-02-14 11:35:39.759032 INFO AppDaemon: Using 'ws' for event stream
2020-02-14 11:35:39.766941 INFO AppDaemon: Starting API
2020-02-14 11:35:39.769862 INFO AppDaemon: Starting Admin Interface
2020-02-14 11:35:39.770135 INFO AppDaemon: Starting Dashboards
2020-02-14 11:35:39.779156 INFO HASS: Connected to Home Assistant 0.105.3
2020-02-14 11:35:39.816273 INFO AppDaemon: App 'bathroom_lights' added
2020-02-14 11:35:39.816999 INFO AppDaemon: Found 1 total apps
2020-02-14 11:35:39.817390 INFO AppDaemon: Starting Apps with 1 workers and 1 pins
2020-02-14 11:35:39.818118 INFO AppDaemon: Running on port 5050
2020-02-14 11:35:39.841651 INFO HASS: Evaluating startup conditions
2020-02-14 11:35:39.862972 INFO AppDaemon: Got initial state from namespace default
2020-02-14 11:35:40.658732 INFO AppDaemon: New client Admin Browser connected
2020-02-14 11:35:41.821969 INFO AppDaemon: Scheduler running in realtime
2020-02-14 11:35:41.827014 INFO AppDaemon: Adding /config/appdaemon/apps to module import path
2020-02-14 11:35:41.827565 INFO AppDaemon: Adding /config/appdaemon/apps/automoli to module import path
2020-02-14 11:35:41.831721 WARNING AppDaemon: No app description found for: /config/appdaemon/apps/automoli/init.py - ignoring
2020-02-14 11:35:41.832929 WARNING AppDaemon: No app description found for: /config/appdaemon/apps/automoli/pkg_helper.py - ignoring
2020-02-14 11:35:41.834360 INFO AppDaemon: Loading App Module: /config/appdaemon/apps/automoli/automoli.py
installing required packages: {'adutils~=0.4.9'}
{'adutils~=0.4.9'} successfully installed!
2020-02-14 11:35:42.814745 WARNING Error: ------------------------------------------------------------
2020-02-14 11:35:42.815546 WARNING Error: Unexpected error loading module: /config/appdaemon/apps/automoli/automoli.py:
2020-02-14 11:35:42.815755 WARNING Error: ------------------------------------------------------------
2020-02-14 11:35:42.817342 WARNING Error: Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 788, in check_app_updates
await utils.run_in_executor(self, self.read_app, mod["name"], mod["reload"])
File "/usr/lib/python3.8/site-packages/appdaemon/utils.py", line 276, in run_in_executor
response = future.result()
File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/lib/python3.8/site-packages/appdaemon/app_management.py", line 580, in read_app
self.modules[module_name] = importlib.import_module(module_name)
File "/usr/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "/config/appdaemon/apps/automoli/automoli.py", line 69, in
from adutils import ADutils, hl
ModuleNotFoundError: No module named 'adutils'

2020-02-14 11:35:42.817594 WARNING Error: ------------------------------------------------------------
2020-02-14 11:35:42.817796 WARNING AppDaemon: Removing associated apps:
2020-02-14 11:35:42.817995 WARNING AppDaemon: bathroom_lights
2020-02-14 11:35:42.818665 INFO AppDaemon: App initialization complete`

Light not turned on although automoli tells it did that

A state change is registered when motion is detected and your script tells me that it switched on the light but in fact, the light stays powered off. I validated that I can use the service light.on on the same entity and it works there.

Would you have another idea for troubleshooting?

2020-01-20 15:46:17.325303 INFO stairs:  
2020-01-20 15:46:17.328075 INFO stairs: πŸ’‘ AutoMoLi - Stairs
2020-01-20 15:46:17.330402 INFO stairs:  
2020-01-20 15:46:17.332743 INFO stairs:    room: stairs
2020-01-20 15:46:17.335040 INFO stairs:    delay: 1:40min β‰ˆ 100sec
2020-01-20 15:46:17.337573 INFO stairs:    motion_state_on: on
2020-01-20 15:46:17.339919 INFO stairs:    motion_state_off: off
2020-01-20 15:46:17.342307 INFO stairs:    lights:
2020-01-20 15:46:17.344554 INFO stairs:      - light.treppe
2020-01-20 15:46:17.346542 INFO stairs:    active_daytime: daytime_1
2020-01-20 15:46:17.349054 INFO stairs:    daytimes:
2020-01-20 15:46:17.351106 INFO stairs:      {'light': 25, 'starttime': '05:30'}
2020-01-20 15:46:17.353145 INFO stairs:      {'light': 100, 'starttime': '07:30'}
2020-01-20 15:46:17.355350 INFO stairs:      {'light': 90, 'starttime': '20:30'}
2020-01-20 15:46:17.357737 INFO stairs:      {'light': 0, 'starttime': '22:30'}
2020-01-20 15:46:17.359636 INFO stairs:    event listeners:
2020-01-20 15:46:17.361451 INFO stairs:      - binary_sensor.motion_bathroom
2020-01-20 15:46:17.363159 INFO stairs:  
2020-01-20 15:46:33.251901 INFO stairs: πŸ’‘ Stairs turned on β†’ brightness: 100%
2020-01-20 15:48:14.959651 INFO stairs: πŸ’‘ Stairs turned on β†’ brightness: 100%
2020-01-20 15:49:13.507052 INFO stairs: πŸ’‘ Stairs turned on β†’ brightness: 100%

Automobile shouldn’t turn lights of when disable_switch_entity is on

πŸ™„ Is your feature request related to a problem? Please describe.
I have the following use case: I set disable_switch_entity to a media player and have an automation that dims the lights when playing something back. When playback is paused the lights get dimmed back up. Problem is automoli still disabled the dimmed down lights when there is no motion even when it’s disabled by the media player state.

😍 Describe the solution you'd like

disable_switch_entity should not only not turn lights on but also not off.

When the switch is disabled automoli should take over again when no motion is detected however.

Edit:
This also happens when manually enabling lights (see picture).
sdfsdfjkfsd

Edit 2:
This can be solved by using the new only_own_events: true.

`disable_switch_entity` only if automoli switched a light on

My use case:

  • i have a light strip in the kitchen which is switched on based on illuminance and motion
  • if it's on and I additionally switch on other lights, I would like to disable automoli

In my understanding, disable_switch_entity switches automoli off completely. Is my use case covered by an existing functionality already?

[HELP] Where should i put config ?

I tried to put config like this in configuration.yaml but it seems to be not the right place ?
Where i should to write this ? Which folder / file ?

sdb_lights: module: automoli class: AutoMoLi room: sdb delay: 300 daytimes: - { starttime: "05:30", name: morning, light: 45 } - { starttime: "07:30", name: day, light: "Travail" } - { starttime: "20:30", name: evening, light: 90 } - { starttime: "22:30", name: night, light: 0 } humidity_threshold: 75 lights: - light.sdb motion: - binary_sensor.motion_sensor_sdb humidity: - sensor.humidity_sdb

Thanks , i am starting with home assistant

add condition

I completely love the idea. Unfortunatley wif you are not alone at home there are more conditons than being alone. But also watchig tv for example should avoid turning on the light automation.

Do you think adding conditions would be doable?

Would be then 100% great :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.