GithubHelp home page GithubHelp logo

pyduofern-hacs's People

Contributors

gluap avatar hypfer avatar irenox avatar rakaandro avatar rstephan avatar t-animal 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

pyduofern-hacs's Issues

RolloTron-Basis-DuoFern-1200 open/close not possible

Hello,

I was able to pair my RolloTron-Basis-DuoFern-1200. The state is reported correctly (position and state), but open_cover and close_cover is not working. I don't see any error in the logs.

How I can troubleshoot that?

Enable device pairing using homeassistant builtins

This was brought up as gluap/pyduofern#28

Currently pyduofern uses an old workaround: to allow pairing, a "service" has to be called. By now Homeassistant would allow for a nice user-friendly gui workflow. Another relic that is likely related is that we still write duofern.json in the background which shouldn't be necessary any more.

This bug is about
-> move pairing to the GUI framework that other integrations use
-> in the process: maybe get rid of duofern.json

Hopefully one outcome would be a list of services and entities as is provided for other integrations:
image

v0.5.1 dependency (needs HA Core 2023.3.2)

For which reason is HA Core 2023.3.2 set as minimum version for v0.5.1?

Any dependency/feature only available starting with exactly that version of HA?

Or just a release typo for HACS?

image

Provide pre-releases in HACS

Could you please list the pre-releases as beta versions in HACS?

There should be a flag for beta releases.

Couldn't find 0.3.3 / 0.3.4 I would like to test.

image

Integration of thermostats

First of all, I would like to express my appreciation for this integration.
I am already using it successfully and it works flawlessly.

Now to my request:
I would be delighted if I could also integrate my Duofern thermostat into Home Assistant.

Cover does not accept commands from HA (only one-way communication)

Since running 0.4.1 (0.4.3 currently) of duoFERN, one of my covers started to have issues. Immediately after updating duoFERN, it was not closed automatically (using an automation firing cover.close_cover to a group of all covers).

The last days it worked, I'd say, unremarkable reliable.

Now I can not control it anymore (at all) from HA, entity state stays in "moving", potentially waiting for the device to perform/respond. Steps:

  1. Not a single command (open, close, set position) from HA is performed by the cover.
  2. If I control it locally, the status is updated in HA a few seconds later. So cover --> duoFERN --> HA is fine, not the other way.
  3. I ran service: duofern.sync_devices and surprisingly got two new entites where I have absolutely no idea to which devices they might belong. I suspected maybe the not working cover would be one of them, but that's not the case. Any idea? I think I'll just disable those two as they seem to be not related to this issue at all. Side-story, but wondering anyway.
    grafik
  4. I ran service: duofern.dump_device_state which gave (only relevant device XXXXXX):
Logger: custom_components.duofern
Source: custom_components/duofern/__init__.py:99
Integration: Duofern control (documentation, issues)
First occurred: 14:52:12 (1 occurrences)
Last logged: 14:52:12

{'by_code': {'XXXXXX': {'name': 'XXXXXX', 'channels': {None}, 'version': '15', 'ventilatingPosition': 30, 'ventilatingMode': 'off', 'sunPosition': 65, 'sunMode': 'off', 'timeAutomatic': 'off', 'sunAutomatic': 'off', 'dawnAutomatic': 'off', 'duskAutomatic': 'off', 'manualMode': 'on', 'position': 5, 'state': 5, 'moving': 'up'}, 
  1. I enabled debug logging for duoFERN, only for few minutes. Within all that mess/masses of messages I could not spot anything surprising. Filtered for XXXXXX only:

(had to split this log - see next comment(s) - as GitHub was complaining...)
grafik

Note I sent few moving commands (open, close, set_position) to the cover during that time. I guess/hope usually there's not that much communication going on in the back.


Any idea what happened here? Really strange, to sum up:

  • (states) device --> duoFERN --> HA ✔
  • (commands) HA --> duoFERN --> device ❌

No 'version' key in the manifest file

The log shows:
WARNING (MainThread) [homeassistant.loader] No 'version' key in the manifest file for custom integration 'duofern'. This will not be allowed in a future version of Home Assistant. Please report this to the maintainer of 'duofern'

Write queue filling up

I recently upgraded from v0.4.3 to v0.5.6 and noticed that the write queue is filling up over time, after one day of running my logs already look like this:

2023-06-29 09:10:31.927 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.928 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.929 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.930 INFO (SyncWorker_6) [custom_components.duofern.cover] updating state
2023-06-29 09:10:31.930 INFO (SyncWorker_6) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:31.931 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.931 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.932 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.934 INFO (SyncWorker_16) [custom_components.duofern.cover] updating state
2023-06-29 09:10:31.934 INFO (SyncWorker_16) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:31.935 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.936 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.937 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.938 INFO (SyncWorker_0) [custom_components.duofern.cover] updating state
2023-06-29 09:10:31.939 INFO (SyncWorker_0) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:31.940 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.940 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.940 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.941 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:31.943 INFO (SyncWorker_22) [custom_components.duofern.cover] updating state
2023-06-29 09:10:31.943 INFO (SyncWorker_22) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:31.995 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5635 msgs left in queue
2023-06-29 09:10:32.073 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5634 msgs left in queue
2023-06-29 09:10:32.102 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.103 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.104 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.104 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.105 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.105 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.105 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.105 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.106 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.106 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.106 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.107 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.107 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.109 INFO (SyncWorker_1) [custom_components.duofern.cover] updating state
2023-06-29 09:10:32.110 INFO (SyncWorker_1) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:32.162 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5634 msgs left in queue
2023-06-29 09:10:32.233 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5633 msgs left in queue
2023-06-29 09:10:32.313 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5632 msgs left in queue
2023-06-29 09:10:32.390 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.391 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.391 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.392 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.393 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.393 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.393 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.393 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.393 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.394 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.395 INFO (SyncWorker_19) [custom_components.duofern.cover] updating state
2023-06-29 09:10:32.396 INFO (SyncWorker_19) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:32.396 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.396 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.396 INFO (Thread-4) [custom_components.duofern] scheduling update for 40bb37
2023-06-29 09:10:32.399 INFO (SyncWorker_13) [custom_components.duofern.cover] updating state
2023-06-29 09:10:32.399 INFO (SyncWorker_13) [custom_components.duofern.cover] 40bb37 state is now 0
2023-06-29 09:10:32.450 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5633 msgs left in queue
2023-06-29 09:10:32.520 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5632 msgs left in queue
2023-06-29 09:10:32.600 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5631 msgs left in queue
2023-06-29 09:10:32.680 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5630 msgs left in queue
2023-06-29 09:10:32.760 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5629 msgs left in queue
2023-06-29 09:10:32.840 INFO (Thread-4) [/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000040bb3701 from write queue, 5628 msgs left in queue

I assume that is not normal?

Also, as a side note I think most of these should be logged as debug or verbose instead of info. Duofern is really noisy by default compared to other components.

AttributeError: module 'custom_components.duofern' has no attribute 'async_setup_entry'

FYI: get error below in the HA log. Guess it has something to do with a new attribute which the duofern addon does not supply yet.
addon is still fully functional, so no problems there.

Logger: homeassistant.config_entries
Source: config_entries.py:239
First occurred: 3:51:05 PM (1 occurrences)
Last logged: 3:51:05 PM

Error setting up entry duofern for duofern
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 239, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
AttributeError: module 'custom_components.duofern' has no attribute 'async_setup_entry'

I'm currently also using the following Rademacher Sun sensor 3200 00 69 :
https://cdn-reichelt.de/bilder/web/xxl_ws/R800/DF_SONNENSENSOR.png
any chance these will be included in the duofern addon ? In the FHEM addon these sun events were visible.

thanks in advance,

Bert

Some covers not closing reliably (commands likely not received)

Every day a "close all covers" automation runs a script which actually closes all covers (basically by in the end using service: cover.close_cover on entity_id: cover.rollladen_alle which is a group containing all cover entities).

That worked just perfect all the time - I mean, for YEARS. Today I experienced this:

3 covers did not close. Actually, they did not even start to do something.

(1) automation trace:
grafik

(2) script trace:
grafik

(3) result in GUI:
grafik

Nothing in home-assistant.log (next to the usual er.5 is not a valid duofern device in #31 because of running service: duofern.ask_for_update at the end of the script - after the close all covers section) and of course debugging was not enabled during that time.


Even ignoring latest "first time issue" #32, I start to see a pattern with running duoFERN 0.4.3 for a week now, summing up in everything is much less reliable. I spent so much time for newly introduced issues... which is fine as those are beta versions which obviously need input from users testing them in their productive environment. Current main issues not being present with 0.4.0:

  • service not working for multiple/all covers #31
  • covers not updating their state for minutes or even hours (regardless of the 5 minutes auto update thing introduces with 0.4.1) #31 (comment)
  • now covers not reacting at all (this issue)

Really, the only thing changed is duoFERN version being updated from 0.4.0 to 0.4.3 (with a short step at 0.4.1).


My wild theory for this issue:
During the command "close cover" sent from the stick to all covers, the affected 3 of them were already sending their device state to the stick according to the mysterios "5 minute auto update feature" (see #26) which proven creates some constant noise when looking at the integration debug log. Therefore they did not receive the close command and did - nothing.

  • Is the protocol bidirectional?
  • Or is Alice blocking incoming transmission from Bob during the time Alice is sending messages to Bob?

Workaround: running the script a second time manually made the 3 affected covers being closed.

Please
a) make the duofern.ask_for_update service able to work with multiple/all covers again #31
b) urgently rethink #26 🙏 and allow to disable it / set a custom interval (including zero)

Occasional issue with actual cover state (open/closed)

Hi.
Occasionally it is happening although my cover closes or opens, for that matter it actually does not change state in Home Assistant or it flips the state, such as when physical cover is closed in HA it show that it is stated as opened. I press to close it in HA and it starts physical opening the cover, so it works vice-versa. I have two Duofern cover motor belts and this is happening on either one.

Actual state is written once again when using cover.close_cover

Using v0.4.0 I discovered something new, very confusing:

Closing all covers with an automation sending "cover.close_cover" to a group with all covers.

Based on todays observation, the only one closing fine (open -> automation -> closed) is a 1800:

image

All others (1200 if that makes a pattern) behave different which creates confusion on several places (open -> closing -> open -> closed), few examples:

image

image

image

image

Unknown msg: xxxxxxxxxxxxxxxxx in HA log since 0.4.1.

don't know if it is related to the new 0.4.1 version or not.
But since I updated from 0.4.0 to 0.4.1, I sometimes get Unknown msg in my logs:

Logger: /usr/local/lib/python3.10/site-packages/pyduofern/duofern.py
Source: /usr/local/lib/python3.10/site-packages/pyduofern/duofern.py:709
First occurred: 07:58:13 (7 occurrences)
Last logged: 09:26:41

Unknown msg: 0000407f0e6f12340181000000000000000000000000
Unknown msg: 6f123401810000000000000000000000000000000000
Unknown msg: 004100120000407f0e6f123401810000000000000000
Unknown msg: 00407f0e6f1234018100000000000000000000000000
Unknown msg: 0000640000004100120000407f0e6f12340181000000

I only have 1 Rademacher RolloTron Standard DuoFern 1400 (HA entity: cover.407f0e) and 1 Rademacher Sonnensensor 9478. (not recognized by pyduofern)
Maybe the solar sensor internal battery is recharged again with rescent sunny days and the threshold is reached for sun on/off. Although the Unknown message also occurs on non sunny days or at night.

Is there a decryption tool somewhere to decode the duofern's msg's ?

Is above a bug, it looks like the message contains the same codes, but is shifted left or right.

Below a full debug log of duofern :
2023-02-23 11:21:12.405 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.406 INFO (SyncWorker_6) [custom_components.duofern.cover] updating state
2023-02-23 11:21:12.407 INFO (SyncWorker_6) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:12.417 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.418 INFO (SyncWorker_4) [custom_components.duofern.cover] updating state
2023-02-23 11:21:12.418 INFO (SyncWorker_4) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:12.419 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.420 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.420 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.420 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.421 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 4 msgs left in queue
2023-02-23 11:21:12.423 INFO (SyncWorker_1) [custom_components.duofern.cover] updating state
2023-02-23 11:21:12.424 INFO (SyncWorker_1) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:12.447 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 4 msgs left in queue
2023-02-23 11:21:12.498 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 3 msgs left in queue
2023-02-23 11:21:12.526 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 2 msgs left in queue
2023-02-23 11:21:12.577 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 1 msgs left in queue
2023-02-23 11:21:12.606 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 0 msgs left in queue
2023-02-23 11:21:12.686 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] detected unknown device, ID=7f0e6f
2023-02-23 11:21:12.687 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: ff0f210000640000004100120000407f0e6f12340181
2023-02-23 11:21:12.958 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.959 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.960 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.960 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.960 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.961 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.965 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.965 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.967 INFO (SyncWorker_5) [custom_components.duofern.cover] updating state
2023-02-23 11:21:12.967 INFO (SyncWorker_5) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:12.969 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.969 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.969 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.970 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.970 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:12.971 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 0 msgs left in queue
2023-02-23 11:21:12.977 INFO (SyncWorker_2) [custom_components.duofern.cover] updating state
2023-02-23 11:21:12.977 INFO (SyncWorker_2) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:12.990 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 0 msgs left in queue
2023-02-23 11:21:13.198 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.200 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.201 INFO (SyncWorker_0) [custom_components.duofern.cover] updating state
2023-02-23 11:21:13.201 INFO (SyncWorker_0) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:13.203 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.205 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.205 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.205 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.206 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.206 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.206 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.206 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.207 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.207 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.207 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.208 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 0 msgs left in queue
2023-02-23 11:21:13.208 INFO (SyncWorker_3) [custom_components.duofern.cover] updating state
2023-02-23 11:21:13.209 INFO (SyncWorker_3) [custom_components.duofern.cover] 407f0e state is now 100
2023-02-23 11:21:13.230 INFO (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F400000000000000000000000000000407f0e01 from write queue, 0 msgs left in queue
2023-02-23 11:21:13.422 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.423 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.424 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.424 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e
2023-02-23 11:21:13.425 INFO (Thread-3) [custom_components.duofern] scheduling update for 407f0e

If I only filter on the unkown message:
Search "Unknown msg" (60 hits in 1 file of 1 searched)
new 63 (60 hits)
Line 22217: Line 23990: 2023-02-23 11:21:12.687 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: ff0f210000640000004100120000407f0e6f12340181
Line 25803: Line 27588: 2023-02-23 11:24:42.552 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00640000004100120000407f0e6f1234018100000000
Line 205536: Line 208587: 2023-02-23 13:53:45.676 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 4100120000407f0e6f12340181000000000000000000
Line 212012: Line 215098: 2023-02-23 13:59:30.420 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000004100120000407f0e6f12340181000000000000
Line 250777: Line 254056: 2023-02-23 14:30:20.864 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 004100120000407f0e6f123401810000000000000000
Line 288354: Line 291763: 2023-02-23 14:55:57.766 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 7f0e6f12340181000000000000000000000000000000
Line 312402: Line 315905: 2023-02-23 15:15:56.542 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 7f0e6f12340181000000000000000000000000000000
Line 380013: Line 383753: 2023-02-23 16:08:29.812 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 004100120000407f0e6f123401810000000000000000
Line 396353: Line 400168: 2023-02-23 16:20:12.255 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 6f123401810000000000000000000000000000000000
Line 400290: Line 404132: 2023-02-23 16:23:28.351 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 004100120000407f0e6f123401810000000000000000
Line 472959: Line 477140: 2023-02-23 17:17:12.224 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00407f0e6f1234018100000000000000000000000000
Line 539697: Line 544155: 2023-02-23 18:07:41.150 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 407f0e6f123401810000000000000000000000000000
Line 544789: Line 549285: 2023-02-23 18:11:01.053 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 3401810000000000000000000000000000000000407f
Line 551546: Line 556064: 2023-02-23 18:16:42.647 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 572894: Line 577526: 2023-02-23 18:35:31.217 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00120000407f0e6f1234018100000000000000000000
Line 597698: Line 602481: 2023-02-23 18:56:32.299 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 120000407f0e6f123401810000000000000000000000
Line 617949: Line 622847: 2023-02-23 19:11:03.618 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 01810000000000000000000000000000000000407f0e
Line 668547: Line 673702: 2023-02-23 19:47:59.965 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: ff0f210000640000004164120000407f0e6f12340181
Line 741537: Line 747058: 2023-02-23 20:42:50.570 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00407f0e6f1234018100000000000000000000000000
Line 754345: Line 759929: 2023-02-23 20:53:16.585 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 3401810000000000000000000000000000000000407f
Line 765536: Line 771173: 2023-02-23 21:01:46.208 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 01810000000000000000000000000000000000407f0e
Line 774254: Line 779960: 2023-02-23 21:08:06.520 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00407f0e6f1234018100000000000000000000000000
Line 777714: Line 783436: 2023-02-23 21:10:28.162 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00640000004164120000407f0e6f1234018100000000
Line 822699: Line 828660: 2023-02-23 21:48:39.402 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00004164120000407f0e6f1234018100000000000000
Line 823214: Line 829179: 2023-02-23 21:49:05.262 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 868784: Line 875007: 2023-02-23 22:28:43.961 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 906585: Line 912958: 2023-02-23 22:58:44.815 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 971526: Line 978214: 2023-02-23 23:56:05.042 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0e6f1234018100000000000000000000000000000000
Line 971527: Line 978215: 2023-02-23 23:56:05.202 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 6f123401810000000000000000000000000000000000
Line 1071688: Line 1078728: 2023-02-24 01:10:38.450 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 6f123401810000000000000000000000000000000000
Line 1093935: Line 1101043: 2023-02-24 01:25:34.478 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 6f123401810000000000000000000000000000000000
Line 1229081: Line 1236694: 2023-02-24 03:17:18.047 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000640000004164120000407f0e6f12340181000000
Line 1229636: Line 1237250: 2023-02-24 03:17:34.535 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 1257736: Line 1265435: 2023-02-24 03:38:47.995 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 7f0e6f12340181000000000000000000000000000000
Line 1258424: Line 1266127: 2023-02-24 03:39:20.172 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 12340181000000000000000000000000000000000040
Line 1311063: Line 1318942: 2023-02-24 04:21:33.308 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0e6f1234018100000000000000000000000000000000
Line 1320379: Line 1328293: 2023-02-24 04:30:09.024 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000640000004164120000407f0e6f12340181000000
Line 1321147: Line 1329062: 2023-02-24 04:30:21.994 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0f210000640000004164120000407f0e6f1234018100
Line 1324399: Line 1332329: 2023-02-24 04:34:05.005 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0e6f1234018100000000000000000000000000000000
Line 1330739: Line 1338686: 2023-02-24 04:38:22.704 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000407f0e6f12340181000000000000000000000000
Line 1334851: Line 1342813: 2023-02-24 04:41:26.231 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00004164120000407f0e6f1234018100000000000000
Line 1360026: Line 1368107: 2023-02-24 05:01:06.650 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 12340181000000000000000000000000000000000040
Line 1431662: Line 1440047: 2023-02-24 06:02:06.565 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 3401810000000000000000000000000000000000407f
Line 1433195: Line 1441587: 2023-02-24 06:03:04.361 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 12340181000000000000000000000000000000000040
Line 1444401: Line 1452848: 2023-02-24 06:11:36.097 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: ff0f210000640000004164120000407f0e6f12340181
Line 1493500: Line 1502279: 2023-02-24 06:57:06.730 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 3401810000000000000000000000000000000000407f
Line 1518625: Line 1527533: 2023-02-24 07:17:22.107 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 6f123401810000000000000000000000000000000000
Line 1536908: Line 1545936: 2023-02-24 07:33:07.038 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 004100120000407f0e6f123401810000000000000000
Line 1628187: Line 1637540: 2023-02-24 08:41:41.514 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0e6f1234018100000000000000000000000000000000
Line 1629171: Line 1638530: 2023-02-24 08:43:05.569 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 12340181000000000000000000000000000000000040
Line 1639431: Line 1648836: 2023-02-24 08:53:51.686 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 01810000000000000000000000000000000000407f0e
Line 1670228: Line 1679725: 2023-02-24 09:19:10.415 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 12340181000000000000000000000000000000000040
Line 1703343: Line 1712941: 2023-02-24 09:48:37.663 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 01810000000000000000000000000000000000407f0e
Line 1722573: Line 1732307: 2023-02-24 10:05:05.916 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 004100120000407f0e6f123401810000000000000000
Line 1729434: Line 1739185: 2023-02-24 10:10:35.899 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 01810000000000000000000000000000000000407f0e
Line 1741038: Line 1750824: 2023-02-24 10:19:09.586 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000004100120000407f0e6f12340181000000000000
Line 1749330: Line 1759158: 2023-02-24 10:25:08.319 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 0000004100120000407f0e6f12340181000000000000
Line 1798782: Line 1808783: 2023-02-24 11:04:53.109 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 210000640000004100120000407f0e6f123401810000
Line 1803597: Line 1813608: 2023-02-24 11:08:35.800 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 00004100120000407f0e6f1234018100000000000000
Line 1805403: Line 1815424: 2023-02-24 11:10:25.811 WARNING (Thread-3) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py] Unknown msg: 407f0e6f123401810000000000000000000000000000

Originally posted by @8OND007 in #26 (comment)

Pairing apparently successful, Duofern 1400 cannot be controlled

I seem to have successfully added a Duofern 1400, at least the blind confirmed the process with a short movement. I also get this blind displayed as an entity, but I cannot control it. Have I made a mistake in understanding or am I doing something wrong? I had previously used the stick under FHEM and had no problems so far.

Not working anymore

Hi @gluap,

since updating from core-2021.12.3 to 2021.12.5 I can't interact with my shutters anymore.
Even the updates to .6 and.7 didn't fix it.

Could you help me to find out why?

Edit: I had the title "Shutters not working anymore since updating core" but that wasn't saved.

Set running time

First of all, thank you very much. The integration works like a charm. With some actors like Rademacher DuoFern 9471-1 you can't set the maximum and minimum positions manually. That value must be set via the interface as running time in seconds. Such an actor isn't working properly without that value. Therefore I've copied one of your services locally and made some adjustments:

def set_running_time(call: ServiceCall) -> None:
    device_id = None
    hass_device_id = call.data.get('device_id', None)
    time = call.data.get('time', None)

    def get_device_id(hass_entity_id):
        for ent in hass.data[DOMAIN]['devices'].values():
            if ent.entity_id == hass_entity_id:
                return ent._duofernId
        return None

    device_ids = [get_device_id(i) for i in hass_device_id]
    _LOGGER.info(f"Updating these devices {' '.join(device_ids)}")
    if not device_ids:
        _LOGGER.warning("Found no valid device ids???")
    for device_id in device_ids:
        if device_id is not None:
            if device_id not in hass.data[DOMAIN]['stick'].duofern_parser.modules['by_code']:
                _LOGGER.warning(
                    f"{device_id} is not a valid duofern device, I only know {hass.data[DOMAIN]['stick'].duofern_parser.modules['by_code'].keys()}. Gonna handle the other devices in {device_ids} though.")
                continue
            _LOGGER.info(f"update runningTime on {device_id} with time {time}")
            getDuofernStick(hass).command(device_id,"runningTime",time)

The result can be controlled by the services dump_device_state. I liked the idea to do it as a service. You may want to add a service like that to a future release.

Best regards.

duofern component cannot be loaded

The duofern component cannot be loaded since HA update to 2023.6.3

Log:
Dieser Fehler wurde von einer benutzerdefinierten Integration verursacht

Logger: homeassistant.setup
Source: custom_components/duofern/init.py:47
Integration: Duofern control (documentation, issues)
First occurred: 10:49:23 (1 occurrences)
Last logged: 10:49:23

Error during setup of component duofern
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/setup.py", line 286, in _async_setup_component
result = await task
^^^^^^^^^^
File "/usr/local/lib/python3.11/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/duofern/init.py", line 47, in setup
from pyduofern.duofern_stick import DuofernStickThreaded
ImportError: cannot import name 'DuofernStickThreaded' from 'pyduofern.duofern_stick' (/usr/local/lib/python3.11/site-packages/pyduofern/duofern_stick.py)

Pairing does not work using a different zwave usb stick

I followed all steps to install HACS and duofern for hacs. I was able to set the network code and select my z-wave stick (Z-Wave USB Stick (ZMEEUZB1); usb vendor id: 0658:0200).
No error message was shown, but I am unable to pair hass.io to the "RolloTron Comfort DuoFern 1800-UW".

I followed these steps:

  • Radmacher
    • Menu -> 9 -> 9 -> 1 -> On (blinking)
  • Home Assistant
    • Development tools -> services -> duofern.start_paring (payload: timeout:60)
      In the logfile I see:
      2021-02-06 03:11:16 WARNING (SyncWorker_5) [custom_components.duofern] start pairing
      but I do not see any devices and the device count on the 1800-uw does not increase.

Tons of log entries

Not sure if this is since the last update but I get tons of log entries by the duofern component in HA. It is an endless stream of log messages. Is this correct behavior? Seems like the Duofern Stick sends messages all the time?

2023-06-03 13:18:30.554 INFO (Thread-6) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000042d8ac01 from write queue, 0 msgs left in queue
2023-06-03 13:18:30.986 INFO (Thread-6) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000042d8ac01 from write queue, 0 msgs left in queue
2023-06-03 13:18:31.273 INFO (Thread-6) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000042d8ac01 from write queue, 1 msgs left in queue
2023-06-03 13:18:31.351 INFO (Thread-6) [/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py] sending 0DFF0F40000000000000000000000000000042d8ac01 from write queue, 0 msgs left in queue

It logs ~250 MByte in 10min !

Plenty of physically non-existing "ghost devices"

Following up on #34.

  • duofern.json contains plenty of non-existing devices (which never existed). The file contains almost 400 lines...

  • Using services to clean the config or sync devices don't get rid of them. Every usage of service duofern.ask_for_update with parameter all: true lists all of them, of course there's no answer.

Additonally (the only reason I spotted the "ghost devices" at all) as since 0.5.0 devices are created in Home Assistant (which is a pretty nice innovation by the way, quite helpful for some situations) there are currently two ghost devices created in the device registry:
grafik

I have no idea when they started to appear or what might have triggered them. Likely during one of the few updates done in the last weeks they appeared. I could in theory check back a few weeks of existing HA backups and check the duofern.json content and if the first appearance matches the date of a performed duoFERN integration update. There were no changes on the hardware side.

Especially as I'm right before integrating four more shutters I want to clean that mess before, so:
I'm looking for a way to get rid of them. How to? Where do they originate from?

My current very limited understanding:

duoFERN stick --> duofern.json --> HA with duoFERN integration --> HA entity registry, HA device registry

Removing devices from HA registry fails

Tried the delete feature of https://github.com/gluap/pyduofern-hacs/releases/tag/v0.5.11 with my two ghost devices (following up on #36):

grafik

After deletion, nothing happens. Device stays in HA registry.

Getting two issues in HA log (please note: tried deleting one / the same device twice):

Logger: homeassistant.components.websocket_api.http.connection
Source: custom_components/duofern/__init__.py:58
Integration: Home Assistant WebSocket API (documentation, issues)
First occurred: 16:53:04 (2 occurrences)
Last logged: 16:55:11

[545929788096] Error handling message: Unknown error (unknown_error) %username% from xxx.xxx.xxx.xxx (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0)
[545932705072] Error handling message: Unknown error (unknown_error) %username% from xxx.xxx.xxx.xxx (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0)
Traceback (most recent call last):
  File "/config/custom_components/duofern/__init__.py", line 54, in async_remove_config_entry_device
    del (stick.duofern_parser.modules["by_code"][device_entry.name])
KeyError: '416415'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/decorators.py", line 26, in _handle_async_response
    await func(hass, connection, msg)
  File "/usr/src/homeassistant/homeassistant/components/config/device_registry.py", line 131, in websocket_remove_config_entry_from_device
    if not await component.async_remove_config_entry_device(
  File "/config/custom_components/duofern/__init__.py", line 58, in async_remove_config_entry_device
    logging.warning(device_entry.__dict__)
AttributeError: 'DeviceEntry' object has no attribute '__dict__'

and

Dieser Fehler wurde von einer benutzerdefinierten Integration verursacht

Logger: root
Source: custom_components/duofern/__init__.py:57
Integration: Duofern control (documentation, issues)
First occurred: 16:53:04 (2 occurrences)
Last logged: 16:55:11

DeviceEntry(area_id=None, config_entries={'6fbbda39ef703642a9c032480f269e08'}, configuration_url=None, connections=set(), disabled_by=<DeviceEntryDisabler.USER: 'user'>, entry_type=None, hw_version=None, id='61907f529c228e7a1ac2ac1a8683c48b', identifiers={('duofern', '416415')}, manufacturer='Rademacher', model=None, name_by_user='zzzOLD_Non-Existing-NeverExisted-DeleteMe', name='416415', suggested_area=None, sw_version=None, via_device_id=None, is_new=False)

Update:

  • same for the other ghost device
  • also tried to enable devices prior to deleting them, same result

"er.a is not a valid duofern device" since v0.4.3

Probably when using duofern.ask_for_update service (but that message has only been logged once, even I used the service without an device_id few more times):

Dieser Fehler wurde von einer benutzerdefinierten Integration verursacht

Logger: custom_components.duofern
Source: custom_components/duofern/__init__.py:113
Integration: Duofern control (documentation, issues)
First occurred: 01:45:00 (1 occurrences)
Last logged: 01:45:00

er.a is not a valid duofern device, I only know dict_keys(['xxxxxx', 'yyyyyy', 'zzzzzz', 'aaaaaa', 'bbbbbb', 'cccccc', 'dddddd', 'eeeeee', '000000', 'ffffff'])

Related to https://github.com/gluap/pyduofern-hacs/releases/tag/v0.4.1:

  • The device_id parameter of duofern.ask_for_update is mandatory now, isn't it?
  • So applying this to all devices or (important to me) using a cover group (entity cover.all_covers) is not possible anymore?
    That would make that service pretty useless, e. g. when HA starts and I want to sync the device states (without needing to wait for 5 minutes)... 😞 It was working perfectly for all my devices. Now we don't have an option to IMMEDIATELY sync device states, or am I missing something?

grafik

Wrong device status after reloading integration

Tried the reload feature of https://github.com/gluap/pyduofern-hacs/releases/tag/v0.5.12:

✅ Worked without any errors in HA log

Unfortunately the default state of the cover entities is read/initialized wrong. State of all covers when reloading the integration: closed.
After reloading it was open for all covers, shortly after that switching to closed. That triggers other things unfortunately. The other two entities are nearly irrelevant (to me).

cover entities:
grafik

manual mode entities:
grafik

toggle entities:
grafik

duofern Platform does not load anymore after update of HA to 2022.2.6

Hi there and thanks for your continues development!

Today I've updated my HA to the latest 2022.2.6 and the duofern component just could not be loaded any more.

Here's the log:

 Logger: homeassistant.setup
Source: setup.py:289
First occurred: 12. Februar 2022, 14:20:25 (2 occurrences)
Last logged: 12. Februar 2022, 14:20:25

    Unable to prepare setup for platform duofern.cover: Platform not found (cannot import name 'CoverDevice' from 'homeassistant.components.cover' (/usr/src/homeassistant/homeassistant/components/cover/__init__.py)).
    Unable to prepare setup for platform duofern.light: Platform not found (cannot import name 'Light' from 'homeassistant.components.light' (/usr/src/homeassistant/homeassistant/components/light/__init__.py)).

I'm not sure why it tries to load the component from the default components path instead of the custom_components?
Maybe a breaking change inside HASSIO or the latest HA?

Follow up warnings are then e.g.:


Logger: homeassistant.helpers.service
Source: helpers/service.py:130
First occurred: 12. Februar 2022, 20:30:00 (3 occurrences)
Last logged: 08:10:00

Unable to find referenced entities cover.404eb1
Unable to find referenced entities cover.404ea8

Is anyone else facing this problem?

Best regards
Bastian

[Feature Request] Make five minutes auto update feature configurable (allow enable/disable by user)

I'd love to see the new https://github.com/gluap/pyduofern-hacs/releases/tag/v0.4.1 Add a low-key auto update by letting the devices schedule an update themselves every five minutes when duofern asks for their state feature a configurable one.

Maybe by using two services to enable/disable it:

  • duofern.enable_constant_state_check
  • duofern.disable_constant_state_check
  1. This (or any other) way users can benefit from other changes in the newer versions and specifically decide on their own if they prefer to use this feature or not (and e. g. use the duofern.ask_for_update service along with certain entities in case states are not reported reliably).
  2. I fear constant RF noise as I'm using duoFern with plenty of devices. Being able to enable and disable the above mentioned feature would also allow me to check if it really solves the randomly missing states issue.

(Initial thoughts: #24 (comment))

Service "clean_config" not documented

I am wondering what the service clean_config actually does. It calls stick.clean_config but no idea what that function actually does.

Let's just put it in https://github.com/gluap/pyduofern-hacs#usage as the other services are too.

  • What does it do?
  • Is it safe to use? (or will something important permanently get deleted)
  • ...?

I started to see some "ghost covers/devices" after using service: duofern.sync_devices at 2023-03-24 (and corresponding new entities and devices as updated to 0.5.3 today) and was wondering if that service could remove them.

'NoneType' object has no attribute 'add_job'

This is something I seem to start seeing now that I updatet do HA 2022.12(.6) during start of HA:

Logger: /usr/local/lib/python3.9/site-packages/pyduofern/duofern_stick.py
Source: helpers/entity.py:677
First occurred: 23:35:01 (2 occurrences)
Last logged: 23:35:02

'NoneType' object has no attribute 'add_job'
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/pyduofern/duofern_stick.py", line 594, in run
    self.process_message(in_data)
  File "/usr/local/lib/python3.9/site-packages/pyduofern/duofern_stick.py", line 226, in process_message
    self.duofern_parser.parse(message)
  File "/usr/local/lib/python3.9/site-packages/pyduofern/duofern.py", line 202, in parse
    self.update_state(code, "version", ver, "0", channel=channel)
  File "/usr/local/lib/python3.9/site-packages/pyduofern/duofern.py", line 127, in update_state
    self.changes_callback(code, key, value)
  File "/config/custom_components/duofern/__init__.py", line 107, in update_callback
    device.schedule_update_ha_state(True) # Trigger update on the updated entity
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 677, in schedule_update_ha_state
    self.hass.add_job(self.async_update_ha_state(force_refresh))  # type: ignore
AttributeError: 'NoneType' object has no attribute 'add_job'

Unknown error / "local variable 'sets' referenced before assignment" when running "duofern.update_device_state"

I accidentally discovered my script running duofern.update_device_state daily failed always when executing that service (used since v0.4.0)

grafik

Running the action inside the script or the service directly from dev tools gives:

grafik

grafik

When running

service: duofern.update_device_state
data: {}

this is in HA log:

Dieser Fehler wurde von einer benutzerdefinierten Integration verursacht

Logger: homeassistant.helpers.script.websocket_api_script
Source: custom_components/duofern/__init__.py:99
Integration: Duofern control (documentation, issues)
First occurred: 17:08:34 (6 occurrences)
Last logged: 17:18:03

websocket_api script: Error executing script. Unexpected error for call_service at pos 1: local variable 'sets' referenced before assignment
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 99, in update_device_state
    hass.data[DOMAIN]['stick'].command(module_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 571, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment

Same for executing by automation/script:

Logger: homeassistant.components.automation.cover_up_alle_rollladen_offnen
Source: custom_components/duofern/__init__.py:99
Integration: Automatisierung (documentation, issues)
First occurred: 14. Januar 2023 um 08:37:05 (9 occurrences)
Last logged: 08:54:18

Cover UP_Alle Rollläden öffnen: Choose at step 1: choice 2: Error executing script. Unexpected error for call_service at pos 4: local variable 'sets' referenced before assignment
Cover UP_Alle Rollläden öffnen: Error executing script. Unexpected error for choose at pos 1: local variable 'sets' referenced before assignment
While executing automation automation.cover_up_alle_rollladen_offnen
Cover UP_Alle Rollläden öffnen: Choose at step 1: choice 1: Error executing script. Unexpected error for call_service at pos 4: local variable 'sets' referenced before assignment
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 99, in update_device_state
    hass.data[DOMAIN]['stick'].command(module_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 571, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment

Enabled debug logging and ran the service again, here's the part from the debug log:

2023-01-15 17:23:18.101 ERROR (MainThread) [homeassistant.helpers.script.websocket_api_script] websocket_api script: Error executing script. Unexpected error for call_service at pos 1: local variable 'sets' referenced before assignment
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 99, in update_device_state
    hass.data[DOMAIN]['stick'].command(module_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 571, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment
2023-01-15 17:23:18.108 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [546571336144] Error handling message: Unknown error (unknown_error) from 192.168.0.54 (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0)
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/decorators.py", line 27, in _handle_async_response
    await func(hass, connection, msg)
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 646, in handle_execute_script
    await script_obj.async_run(msg.get("variables"), context=context)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 99, in update_device_state
    hass.data[DOMAIN]['stick'].command(module_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 571, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment

DUOFERN receives unknown message during setup

Hi,
I have installed the DIUFERN Stick in my current HA . The Rollo-Tube is connected in fhem with the stick. When I switch to HA and try to start from scatch, an error message occurs and the UI does not have anything to start configuration. If i open the services manually (Duofern control: start_pairing) nothing happens.

Log Message:
Logger: /usr/local/lib/python3.10/site-packages/pyduofern/duofern.py
Source: /usr/local/lib/python3.10/site-packages/pyduofern/duofern.py:551
First occurred: 13:39:53 (1 occurrences)
Last logged: 13:39:53

DUOFERN unknown msg: 0fff0f2c63005a1a110000000000ff49d5f2ffffff01

hass.io does not show tip in browser for duofern.start_paring

When I open "Development Tools" -> "Services" on my mobile phone and select "duofern.start_paring" I get a preview and sample data like shown in the screenshots. When I visit the same page with a desktop browser no preview and no sample data is shown.
Just the text "no description available" is shown.

Feature Request: Add Sun Sensor 9478

Hi, I have extended the binary_sensor.py to discover the sun sensor 9478 and add it as a light sensor. Working fine with mine. Feel free to include in build.

Add class Light:

from homeassistant.components.binary_sensor import (
DEVICE_CLASS_SMOKE,
DEVICE_CLASS_LIGHT,
PLATFORM_SCHEMA,
BinarySensorEntity
)

In the device detection loop the device ID is "a5":

def setup_platform(hass, config, add_entities, discovery_info=None):
"""Setup the Duofern binary sensors pltaform"""

# Get the Duofern stick instance
stick = hass.data["duofern"]['stick']

# Add devices
for device in stick.config['devices']:
    # _LOGGER.warning(device['id'])
    if device['id'].startswith('ab'): # Check if this device is a smoke detector
        if device['id'] in hass.data[DOMAIN]['devices'].keys(): # Check if Home Assistant already has this device
            continue
        add_entities([DuofernSmokeDetector(device['id'], device['name'], stick, hass)]) # Add new binary sensor for smoke detectors
    if device['id'].startswith('a5'): # Check if this device is a sun sensor
        if device['id'] in hass.data[DOMAIN]['devices'].keys(): # Check if Home Assistant already has this device
            continue
        add_entities([DuofernSunSensor(device['id'], device['name'], stick, hass)]) # Add new binary sensor for sun sensors

and the Class is defined as:
class DuofernSunSensor(BinarySensorEntity):
"""Duofern sun sensor entity"""

def __init__(self, code, desc, stick, hass, channel=None):
    """Initialize the sun sensor"""

    self._code = code
    self._id = code
    self._name = desc

    if channel:
      chanNo = "{:02x}".format(channel)
      self._id += chanNo
      self._name += chanNo

    self._state = None # Holds the state (off = clear, on = smoke detected)
    self._stick = stick # Hold an instance of the Duofern stick
    self._channel = channel
    hass.data[DOMAIN]['devices'][self._id] = self # Add device to our domain

@property
def name(self):
    """Returns the name of the sun sensor"""
    return self._name

@property
def is_on(self):
    """Returns the current state of the sun sensor"""
    return self._state == "on"

@property
def device_state_attributes(self):
    """Return the attributes of the sun sensor"""
    attributes = {
    }

    return attributes
@property
def icon(self):
    """Return the icon of the sun sensor"""
    return "mdi:sun-wireless-outline"

@property
def device_class(self):
    """Return the device class sun sensor"""
    return DEVICE_CLASS_LIGHT

@property
def should_poll(self):
    """Whether this entity should be polled or uses subscriptions"""
    return True # TODO: Add config option for subscriptions over polling

@property
def unique_id(self):
    """Return the unique id of the Duofern device"""
    return self._id

def update(self):
    """Called right before is_on() to update the current state from the stick"""
    try:
        self._state = self._stick.duofern_parser.get_state(self._code, 'state', channel=self._channel)
    except KeyError:
        self._state = None

Update callback called on unknown device id

I get this warning since some time :

Logger: custom_components.duofern
Source: custom_components/duofern/init.py:111
Integration: Duofern control (documentation, issues)
First occurred: 12:54:26 PM (13 occurrences)
Last logged: 12:54:26 PM
Update callback called on unknown device id

Where can I find some sort of debug log for pyduofern ? Or how do I active a debug log file for DuoFern communications ?

Since this warning is not always there, I suspect it's related to my Duofern SunSensor (RDUO 32000069) which send out "Sun Active" or "Sun Inactive" triggers over Duofern to my usb stick.
Maybe this is a good chance to add this SunSensor to your pyduofern if I can send you the traces.

If I can send you the logs with ID's maybe the sunsensor is "identified" for good :-)

State change of many devices at the same time

First of all thank for providing us that solution.
I ran into a problem changing the state of many devices at the same time. Some devices are getting ignored hereby. After splitting in two or three separate automations which run with offset it works. On the other hand, if the automations run in parallel, it doesn't work again. Any ideas?

Using parameter "all" for service "ask_for_update" gives error in v0.5.4

Running v0.5.4 using

service: duofern.ask_for_update
data:
  all: true

gives this in the UI: Error calling service duofern.ask_for_update. Unknown error
and this in the HA log:

2023-04-02 18:38:51.208 ERROR (MainThread) [homeassistant.helpers.script.websocket_api_script] websocket_api script: Error executing script. Unexpected error for call_service at pos 1: local variable 'sets' referenced before assignment
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 152, in ask_for_update
    getDuofernStick(hass).command(device_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 576, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment
2023-04-02 18:38:51.215 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [547173666864] Error handling message: Unknown error (unknown_error) from xxx.xxx.xxx.xxx (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0)
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/decorators.py", line 27, in _handle_async_response
    await func(hass, connection, msg)
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 646, in handle_execute_script
    await script_obj.async_run(msg.get("variables"), context=context)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1524, in async_run
    await asyncio.shield(run.async_run())
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 409, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 453, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 451, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 684, in _async_call_service_step
    await service_task
  File "/usr/src/homeassistant/homeassistant/core.py", line 1745, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1788, in _execute_service
    await self._hass.async_add_executor_job(
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/duofern/__init__.py", line 152, in ask_for_update
    getDuofernStick(hass).command(device_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 576, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment

Interesting part:

  File "/config/custom_components/duofern/__init__.py", line 152, in ask_for_update
    getDuofernStick(hass).command(device_id, 'getStatus')
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern_stick.py", line 576, in command
    self.duofern_parser.set(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/pyduofern/duofern.py", line 770, in set
    logger.debug(sets.keys())  # join(" ", sort keys sets)
UnboundLocalError: local variable 'sets' referenced before assignment

Create device

I've just installed this integration and added 3 blinds. For this I also got the entities and I'm able to control the blinds from Home Assistant.

As a next step I wanted to create some automations with the blinds. But I can't select them in the UI, because the entities don't belong to a device. It would be great if a device is created and the entity is assigned to it.

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.