Coder Social home page Coder Social logo

smarthomeng / plugins Goto Github PK

View Code? Open in Web Editor NEW
44.0 17.0 101.0 83.07 MB

Plugins for SmartHomeNG - The device integration platform for your smart home

Home Page: https://www.smarthomeNG.de

Python 62.64% HTML 8.99% JavaScript 27.32% CSS 0.87% Shell 0.02% Batchfile 0.16%
extend smarthomeng device gateway interface smarthome home assistant backend admin-interface

plugins's Introduction

SmartHomeNG Plugins

Github Tag Made with Python Join the chat at https://gitter.im/smarthomeNG/smarthome

Die Plugins für SmartHomeNG erweitern die Möglichkeiten des Gesamtsystems in dem sie Zugriff auf verschiedene Schnittstellen bereitstellen.

Es existiert eine Benutzerdokumentation in der Kern und Plugins dokumentiert sind.

Ein Wiki existiert zumeist in deutscher Sprache, wird aber sehr selten erweitert oder aktualisiert.

Aktueller Status der Entwicklung

Es gibt eine stetig aktualisierte Dokumentation für Entwickler.

Other languages

It is possible to read the documentation with Google's translation service in other languages as well.

plugins's People

Contributors

4d4mu avatar andrek01 avatar aschwith avatar bmxp avatar cannonrs avatar cstrassburg avatar dasax avatar greentux avatar gruberth avatar hasenradball avatar henfri avatar ivan73 avatar jentz1986 avatar jumi2006 avatar lgb-this avatar mknx avatar mode2k avatar morg42 avatar msinn avatar ohinckel avatar onkelandy avatar psilo909 avatar sisamiwe avatar spfuu avatar ssudholt avatar t3r avatar thengsty avatar thomascr avatar tom-bom-badil avatar wvhn 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

Watchers

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

plugins's Issues

rtr2: can't pass rtr2_settings or rtr2_controller_settings

Hi,

I cant pass the item settings for rtr2_settings and rtr2_controller_settings to the plugin.

And for me this looks really untested:

parent_item = item.return_parent()

  1. why from the parent_item?

if self.has_iattr(parent_item.conf, 'rtr2_settings'):

  1. rtr2_controller_settings is not even evaluated

if temp_settings is not None and isinstance(temp_settings, list):

3. the value from temp_settings is never used - only the defaults get assigned

Maybe I am to stupid to understand the code, but there is also no example documentation.

Thats my test yaml:

        rtr:
            name: Badezimmer Oben
            sv_widget: "{{ rtr2.rtr('item') }}"
            sv_item_type: heater
            struct: rtr2.rtr
            rtr2_id: bz_og
            rtr2_settings:
              - 24
            rtr2_controller_settings:
              - 4.0
              - 60.0
            visu_acl: rw

            soll_temp:
                visu_acl: ro

            ist_temp:
                type: num
                eval: sh.og.bz.temperature()
                eval_trigger: og.bz.temperature
                database: true

            stellwert:
                type: num
                knx_dpt: '5.001'
                knx_send: 4/1/220
                knx_init: 4/1/220
                knx_listen: 4/1/220
                enforce_updates: true
                database: true

            nacht:
                eval: True if sh.zentral.heizung.nachtabsenkung() else False
                eval_trigger: zentral.heizung.nachtabsenkung

            frost:
                eval: True if sh.og.bz.fenster.status_rtr() else False
                eval_trigger: og.bz.fenster.status_rtr

Plugin 'database' from section 'database' exception: could not convert string to float

The following database plugin configuration (as documented in https://www.smarthomeng.de/user/plugins/database/README.html)

database:
  class_name: Database
  class_path: plugins.database
  driver: sqlite3
  connect:
    - database: /home/smarthome/log.db
    - check_same_thread: 0

yields the following error at startup:

ERROR    lib.plugin          Plugin 'database' from section 'database' exception: could not convert string to float: 'database: /home/smarthome/log.db'
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/plugin.py", line 144, in __init__
    plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta)
  File "/usr/local/smarthome/lib/plugin.py", line 594, in __init__
    (plugin_params, params_ok, hide_params) = self.meta.check_parameters(args)
  File "/usr/local/smarthome/lib/metadata.py", line 929, in check_parameters
    value = self._expand_listvalues(param, value)
  File "/usr/local/smarthome/lib/metadata.py", line 516, in _expand_listvalues
    result = Utils.string_to_list(value)
  File "/usr/local/smarthome/lib/utils.py", line 465, in string_to_list
    er=float(er)
ValueError: could not convert string to float: 'database: /home/smarthome/log.db'

Affected version
Most recent develop branch at the time of writing this issue:
Main: Branch develop, last commit 537948d12cfa340796a8048042d5743a6daa5834
Plugins: Branch develop, last commit a1f4bbe
Python: v3.7.3 final

smartvisu plugin: error reading deprecated.yaml

Hi,
with smartVISU v3.3 the last deprecated widget was moved from the section "deprecated" to "removed" in the "deprecated.yaml" file, leaving the "deprecated" section empty. This causes the following error in the smartvisu autogeneration plugin of SmarthomeNG:

2022-12-19  21:40:46 ERROR    plugins.smartvisu   SmartVisuInstallWidgets v3.3.0: Exception: 'NoneType' object is not iterable
> Traceback (most recent call last):
>   File "/usr/local/smarthome/plugins/smartvisu/__init__.py", line 123, in run
>     sv_iwdg = SmartVisuInstallWidgets(self)
>   File "/usr/local/smarthome/plugins/smartvisu/svinstallwidgets.py", line 55, in __init__
>     self.install_widgets(self._sh)
>   File "/usr/local/smarthome/plugins/smartvisu/svinstallwidgets.py", line 99, in install_widgets
>     self.copy_widgets( plgdir.replace('.', '/') )
>   File "/usr/local/smarthome/plugins/smartvisu/svinstallwidgets.py", line 149, in copy_widgets
>     self.plugin_instance.test_widget_for_deprecated_widgets(os.path.join(srcdir, fn))
>   File "/usr/local/smarthome/plugins/smartvisu/__init__.py", line 284, in test_widget_for_deprecated_widgets
>     for widget_name in self.deprecated_widgets:
> TypeError: 'NoneType' object is not iterable
2022-12-19  21:40:46 ERROR    plugins.smartvisu   SmartVisuGenerator: Exception: 'NoneType' object is not iterable
> Traceback (most recent call last):
>   File "/usr/local/smarthome/plugins/smartvisu/__init__.py", line 135, in run
>     svgen = SmartVisuGenerator(self, self.visu_definition)
>   File "/usr/local/smarthome/plugins/smartvisu/svgenerator.py", line 70, in __init__
>     self.pages()
>   File "/usr/local/smarthome/plugins/smartvisu/svgenerator.py", line 228, in pages
>     self.plugin_instance.test_item_for_deprecated_widgets(item)
>   File "/usr/local/smarthome/plugins/smartvisu/__init__.py", line 313, in test_item_for_deprecated_widgets
>     for widget in self.deprecated_widgets:
> TypeError: 'NoneType' object is not iterable

A dummy entry as workaround is now in place but this should be fixed in the plugin.
Thanks to @gruberth for raising the issue!

Regards
Wolfram

database: Feature request: Only write to DB on minimal change

This issue is moved over from the core repo. The complete issue can be read over there: smarthomeNG/smarthome#285

To reduce superfluous data it would be nice if logging of values to the database could be prevented if not a minimal difference to the last logged value is reached.

Use cases:

Values sent by physical sensors (like temperature, brightness, distance or flow sensor) often wobble in short intervals between two values (e.g. 24.1°C and 24.2°C and back again).
Unfortunately not every sending device allows to prevent this.
Sometimes an exact value is needed for live operations but for logging less precission would be sufficient.

knx: Improvement for DPT 2 (num instead of list)

This issue is moved over from the core repo. The complete issue can be read over there: smarthomeNG/smarthome#291

To easily change DPT 2 knx entries via VISU it would be more comfortable to set priorities not only as lists but also as a number. The ETS converts simple numbers to lists as follows:
0 = [0,0]
1 = [0,1]
2 = [1,0]
3 = [1,1]

Such an internal conversion for DPT2 items would be very nice or are there any reasons this is a bad idea?

hue2 initial setup fails due to missing ip

Just started to migrate from old hue plugin to new one. At first I tried using the webif to activate Hue2 plugin. The plugin is added to etc/plugin.yaml but does not have any config. It seems it is missing initial values which I suppose should be added once configured in webif.

During startup I got this error:

2022-08-21  14:08:55 ERROR    plugins.hue2        discover_bridges: Exception in discover_bridges(): [Errno -2] Name or service not known
2022-08-21  14:08:55 ERROR    lib.plugin          Plugin 'hue2' from section 'huebridge' exception: 'ip'
> Traceback (most recent call last):
>   File "/usr/local/smarthome/lib/plugin.py", line 162, in __init__
>     plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._configfile)
>   File "/usr/local/smarthome/lib/plugin.py", line 629, in __init__
>     exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
>   File "<string>", line 1, in <module>
>   File "/usr/local/smarthome/plugins/hue2/__init__.py", line 135, in __init__
>     if self.bridge['ip'] != self.bridge_ip:
> KeyError: 'ip'

I manually looked up values for bridge_serial, user and ip and got things working. Wonder how discover bridges could be brought to life. I double-checked and requirements.txt are ok both for SHNG and plugin.

SmarthomeNG v1.9.2-master (cc57a0ad)
Plugins v1.9.2-master (e9f4b86)
Python 3.9.2
Debian Bullseye 11.4

vacations: Error raised due to temporary error at name resolution

2021-05-15  13:31:59 ERROR    plugins.vacations.plugins.vacations Method plugins.vacations.plugins.vacations exception: HTTPSConnectionPool(host='ferien-api.de', port=443): Max retries exceeded with url: /api/v1/holidays (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f51954fec18>: Failed to establish a new connection: [Errno -3] Temporärer Fehler bei der Namensauflösung'))
> Traceback (most recent call last):
>   File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
>     (self._dns_host, self.port), self.timeout, **extra_kw)
>   File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 57, in create_connection
>     for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
>   File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
>     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
> socket.gaierror: [Errno -3] Temporärer Fehler bei der Namensauflösung

maybe we can catch this error in a more beautiful way ...

All plugins: Update plugin documentation: readme.md --> user_doc.rst

It would be great to inspect the plugin documentation if there are old readme.md present.
In this case they should be converted from English readme.md which is deprecated to a German user_doc.rst.


Copied from the contribution of Morg42 (9. March 2023):

The following plugins need to be worked on as they have an existing README but no user_doc.rst:

  • alexa -> marked deprecated
  • apcups
  • appletv
  • artnet
  • asterisk
  • blockly
  • bsblan
  • buderus
  • co2meter
  • comfoair
  • dashbutton -> not marked deprecated, but dashbuttons are not sold by Amazon any more
  • datalog -> marked deprecated
  • deebot_ozmo -> not marked deprecated, but the underlying Python module is not maintained any more
  • easymeter -> marked deprecated
  • ebus
  • ecmd -> marked deprecated
  • elro -> marked deprecated
  • enigma2
  • eta_pu
  • harmony
  • helios
  • homeconnect
  • hue
  • iaqstick -> retired
  • indego
  • influxdata -> marked deprecated
  • influxdb
  • intercom_2n
  • join
  • jvcproj
  • kathrein
  • kostal
  • kostalmodbus
  • ksemmodbus
  • logo
  • luxtronic2
  • mailrcv
  • mailsend
  • memlog -> marked deprecated
  • miflora
  • milight
  • mlgw
  • mvg_live
  • nuki
  • nut
  • odlinfo
  • operationlog -> marked deprecated
  • plex
  • pushbullet
  • pushover
  • raumfeld -> marked deprecated
  • raumfeld_ng
  • rcswitch
  • robonect
  • roomba
  • roomba_980
  • rrd
  • rtr
  • russound
  • slack
  • sma
  • sma_em
  • smarttv
  • sml
  • snom -> retired
  • sqlite_visu2_8 -> marked deprecated
  • systemair
  • thz
  • traffic
  • trovis557x
  • unifi
  • volkszaehler
  • vr100 -> retired
  • wettercom
  • withings_health
  • xmpp
  • zwave -> not marked deprecated, but the underlying Python module is not maintained any more

husky2: Plugin 'automower' error importing Python package: No module named 'homeassistant'

I install smarthomeng new and enabled the plugin husky2. I found these 2 lines in the log:

2022-05-28 07:40:00 ERROR lib.plugin Plugin 'automower' error importing Python package: No module named 'homeassistant'
2022-05-28 07:40:00 ERROR lib.plugin Plugin 'automower' initialization failed, plugin not loaded

It seems, that the module 'homeassistant' is not in the file requirements.txt included.

avm: Every 5 Minutes Error 500

After update from 1.9.0 to 1.9.1 i became a 500 error every 5 Minutes.

2022-02-16 20:12:29 ERROR plugins.avm fritzbox_1@: POST request error: 500 Server Error: Internal Server Error for url: https://192.168.112.1:49443/upnp/control/hosts 2022-02-16 20:12:29 ERROR plugins.avm fritzbox_1@: POST request error: 500 Server Error: Internal Server Error for url: https://192.168.112.1:49443/upnp/control/hosts 2022-02-16 20:12:29 INFO plugins.avm fritzbox_1@: Debug apriori SID: 0000000000000000, Challenge: fc316580 2022-02-16 20:12:30 INFO plugins.avm fritzbox_1@: Debug posterior SID: 52440274dc644e7e, Challenge: 8dc37097

avm: wrong avm_wlan_index

After heaving a lot of trouble with turning on and off the wifi correctly on both frequencies, I figured out its because of a wrong wlan_index in the plugin code. Unlike the _update_wlan_config method the wlan_index on the set_wlanconfig call gets decremented by one. This unnecessary decrement causes the trouble between setting and updating the value and writing it to the avm device and item.

Therefore the following block

plugins/avm/__init__.py

Lines 1155 to 1166 in e32b0ef

if self.get_iattr_value(item.conf, 'avm_data_type') == 'wlanconfig':
wlan_index = None
parent_item = item.return_parent()
if self.has_iattr(item.conf, 'avm_wlan_index'):
wlan_index = int(self.get_iattr_value(item.conf, 'avm_wlan_index')) - 1
elif self.has_iattr(parent_item.conf, 'avm_wlan_index'):
wlan_index = int(self.get_iattr_value(parent_item.conf, 'avm_wlan_index')) - 1
if wlan_index >= 0:
self.set_wlanconfig(wlan_index, bool(item()))
else:
self.logger.error('Parameter <avm_wlan_index> for item not defined in item.conf')

should be replaced with

            if self.get_iattr_value(item.conf, 'avm_data_type') == 'wlanconfig':
                wlan_index = None
                parent_item = item.return_parent()
                if self.has_iattr(item.conf, 'avm_wlan_index'):
                    wlan_index = int(self.get_iattr_value(item.conf, 'avm_wlan_index'))
                elif self.has_iattr(parent_item.conf, 'avm_wlan_index'):
                    wlan_index = int(self.get_iattr_value(parent_item.conf, 'avm_wlan_index'))

                if wlan_index > 0:
                    self.set_wlanconfig(wlan_index, bool(item()))
                else:
                    self.logger.error('Parameter <avm_wlan_index> for item not defined in item.conf')

svNG plugin harmony: Harmony prefix not registered in plugin.yaml

Hi,

due to missing registration of "harmony_" Prefix, there are several warnings in var/log/smarthome-details.log when restarting svNG:

WARNING lib.metadata Item 'harmony.hub.current_activity', attribute 'harmony_item': Attribute is undefined and has value 'current_activity_id' (defined in harmony.yaml) WARNING lib.metadata Item 'harmony.hub.current_activity_name', attribute 'harmony_item': Attribute is undefined and has value 'current_activity_name' (defined in harmony.yaml) WARNING lib.metadata Item 'harmony.activity.PowerOff', attribute 'harmony_command_1': Attribute is undefined and has value '['activity:-1']' (defined in harmony.yaml) WARNING lib.metadata Item 'harmony.activity.TV_SAT', attribute 'harmony_command_1': Attribute is undefined and has value '['activity:27083101']' (defined in harmony.yaml)

To fix this, "harmony_" prefix has to be declared in plugins/harmony/plugin.yaml:

classname: Harmony # class containing the plugin attribute_prefix: harmony

and

item_attribute_prefixes: harmony_: type: foo description: de: 'Definiert das Item, das in einem konkreten Zustand evaluiert oder geändert werden soll' en: 'Definition of an item that should be evaluated or changed in a specific state'

Please add to repo. Thank you in advance !

Best regards,
Jörk

RRD plugin: override of RRD path is broken

Hi,

since change to smart plugin, the path override with parameter 'rrd_dir' is broken. This seems to be a typo in rrd/plugin.yaml:
Please rename parameter 'rrddir' to 'rrd_dir' to fix.

Thanks!

database: Enhancements collection of links and opinions

New attributes:

  • database_write: on_update to enable writing of a recurrent value without a change -> behaviour has been implemented in v1.7.2 through the standard attribute enforce_change
  • database_maxage: <days> maximum age of entries within a database for an item -> has alreedy been implemented

New feature wishes:

  • compacting data --> discuss several strategies
  • display orphaned items in database and offer to merge them into another item log
  • When changing item names there will be a new id which is often not really wanted.
    --> provide a fixed database id for items

Webinterface:

  • select a datetime range for csv export
  • optionally select local time or UTC for csv export
  • format datetime as such instead of time since epoch in milliseconds
    like 2021:11:07 12:15:12.180 instead of 1636243430180

database: database_maxage might remove all stored values from item

Consider the following item:

Solltemperatur:
    type: num
    cache: True

The database plugin should drop in here to remove cache: True attribute thus the item is changed to:

Solltemperatur:
    type: num
    database: init
    database_maxage: 7

In case there is not much of change - let's assume no change for the last 14 days, then the attribute database_maxage: 7 will ensure that all data for this item is removed after 7 days.
But when restarting SmartHomeNG after 7 days, this will lead to a missing init value for the item since all database entries are already deleted.

A fix should be provided that ensures that at least the last data entry to the database is kept to provide an init value for a later restart of SmartHomeNG

avm: still getting 404s from Wifi Repeaters

For the AHA stuff, the plugin also seems to request the AHA webpage on my repeaters. Unfortunately, Repeaters done have AHA web page.
Thats why a 404 is returned.

We need a possibility to somehow exclude these devices or to not log the 404.

2022-02-16 19:27:38 ERROR plugins.avm wlan_repeater_2400_garage@: AHA command error code: 404
2022-02-16 19:27:38 ERROR plugins.avm wlan_repeater_1750_galerie@: AHA command error code: 404
2022-02-16 19:27:39 ERROR plugins.avm wlan_repeater_1750_front@: AHA command error code: 404

viessmann: cant parse datetime reply from heater

Hi,

these days, after updating shNG incl. updating python3.8 to python3.9 I saw the following error in the log.

2022-11-12  10:51:43 ERROR    logics.viess_fixTime In der Logik ist ein Fehler aufgetreten:
   Logik 'viess_fixTime', Datei '/usr/lib/python3.9/_strptime.py', Zeile 349
   function _strptime(), Exception: time data '00' does not match format '%Y%m%d%W%H%M%S'

At first I thought it was my logic. @Morg42 pointed me to relevant code part: https://github.com/smarthomeNG/plugins/blob/develop/viessmann/__init__.py#L1228

#!/usr/bin/env python3
# viess_fixtime.py

from datetime import datetime

plug = sh.plugins.return_plugin('viessmann')

if plug is not None:

    sys_cur_time_dt = shtime.now()
    #sys_cur_time = sys_cur_time_dt.strftime('%Y%m%d%W%H%M%S')
    sys_cur_time = sys_cur_time_dt.strftime('%Y-%m-%d %H:%M:%S')
    logger.debug(f'sys_cur_time={sys_cur_time}')
    logger.debug(f'sys_cur_time_dt={sys_cur_time_dt}')

    viess_cur_time = plug.read_addr('088e')
    logger.debug(f"viess_cur_time={viess_cur_time}")

    viess_cur_time_dt = datetime.strptime(viess_cur_time, '%Y-%m-%dT%H:%M:%S')
    logger.debug(f"viess_cur_time_dt={viess_cur_time_dt}")

    timediff = shtime.time_diff(sys_cur_time_dt, viess_cur_time_dt, 'm')
#    if timediff <= -2 or timediff >= 2 or True:
    if timediff <= -2 or timediff >= 2:
        logger.warning(f'Update Viessmann Systemtime, Timediff: {timediff:.0f} Min.')
        logger.debug(f"sys_cur_time={sys_cur_time}")
        plug.write_addr('088e', sys_cur_time)
    else:
        logger.warning(f'Update Viessmann Systemtime not need, time in sync')
else:
    logger.error("can't get viessmann plugin")

But after I manually ran the values at the Python shell, I saw that the values were actually correct and also the call in _build_valuebytes_from_value for valuetype == 'datetime' to do the strftime is good.

(smarthome) smarthome@heizung:/opt/smarthome$ python3
Python 3.9.15 (main, Oct 12 2022, 19:14:24)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> from datetime import datetime
>>> import dateutil.parser
>>> sys_cur_time_dt = datetime.now()
>>> sys_cur_time = sys_cur_time_dt.strftime('%Y-%m-%d %H:%M:%S')
>>> print(sys_cur_time)
2022-11-12 10:33:24
>>> value=sys_cur_time
>>> print (dateutil.parser.isoparse(value))
2022-11-12 10:33:24
>>> print (dateutil.parser.isoparse(value).strftime('%Y%m%d%w%H%M%S'))
202211126103324

So I was wondering, where the heck this happends... After missing a good old Stacktrace I was digging around to find how to add it. Which led to the following simple solution.

thomas@heizung:/opt/smarthome$ git diff /opt/smarthome/lib/scheduler.py 
diff --git a/lib/scheduler.py b/lib/scheduler.py
index 6055779b..0eba9860 100644
--- a/lib/scheduler.py
+++ b/lib/scheduler.py
@@ -743,7 +743,7 @@ class Scheduler(threading.Thread):
                 logic_method = 'Hauptroutine der Logik'
             else:
                 logic_method = 'function ' + tb[2] + '()'
-            logger.error(f"In der Logik ist ein Fehler aufgetreten:\n   Logik '{logic.name}', Datei '{tb[0]}', Zeile {tb[1]}\n   {logic_method}, Exception: {e}")
+            logger.error(f"In der Logik ist ein Fehler aufgetreten:\n   Logik '{logic.name}', Datei '{tb[0]}', Zeile {tb[1]}\n   {logic_method}, Exception: {e}", exc_info=True)
             #logger.exception(f"In der Logik ist ein Fehler aufgetreten:\n   Logik '{logic.name}', Datei '{tb[0]}', Zeile {tb[1]}\n   {logic_method}, Exception: '{e}'\n ")
 
         return

Now my log entry looked like this:

2022-11-12  11:08:11 ERROR    logics.viess_fixTime In der Logik ist ein Fehler aufgetreten:
   Logik 'viess_fixTime', Datei '/usr/lib/python3.9/_strptime.py', Zeile 349
   function _strptime(), Exception: time data '00' does not match format '%Y%m%d%W%H%M%S'
Traceback (most recent call last):
  File "/opt/smarthome/lib/scheduler.py", line 724, in _execute_logic_task
    exec(logic._bytecode, logic_globals)
  File "/opt/smarthome/logics/viess_fixtime.py", line 26, in <module>
    plug.write_addr('088e', sys_cur_time)
  File "/opt/smarthome/plugins/viessmann/__init__.py", line 488, in write_addr
    return self._parse_response(response_packet, commandname)
  File "/opt/smarthome/plugins/viessmann/__init__.py", line 1446, in _parse_response
    value = datetime.strptime(rawdatabytes.hex(), '%Y%m%d%W%H%M%S').isoformat()
  File "/usr/lib/python3.9/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/lib/python3.9/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '00' does not match format '%Y%m%d%W%H%M%S'

So the error is at the processing of the reply. Maybe we need first to replace the leading 0 from the weekday?

Oh, and my unit is a V200KW2 which uses KW protocol.

svNG Plugin join: Missing "say" and "language" commands

Hello,
am just switching from fhem to svNG and have been using join's say function to do voice output from svNG to my android panels via tts. When I went live, I found that the join plugin didn't support "say" and specifying the local language "language".

It would be nice if someone with access to the repo could add the parameters "say" and "language" to the plugin in init.py in the method "send()" as follows:

def send(self, title=None, text=None, icon=None, find=None, smallicon=None, device_id=None, device_ids=None, device_names=None, url=None, image=None, sound=None, group=None, clipboard=None, file=None, callnumber=None, smsnumber=None, smstext=None, mmsfile=None, wallpaper=None, lockWallpaper=None, interruptionFilter=None, mediaVolume=None, ringVolume=None, alarmVolume=None, say=None, language=None):

and

if say: req_url += "&say=" + say if language: req_url += "&language=" + language

Thank you in advance,
Jörk

UZSU plugin: implement holidays and alarm features

holidays: additionally to week days an option for holidays (based on the core implementation) would be nice.
alarm feature: Sometimes it might be nice to trigger items at a specific time just once, like non-repeating alarm clock.

websocket module exceptions

Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:08 ERROR    modules.websocket update_item - Error in 'await websocket.send(data)': code = 1001 (going away), no reason
Traceback (most recent call last):
  File "/usr/local/smarthome/modules/websocket/__init__.py", line 920, in update_item
    await websocket.send(msg)
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 471, in send
    await self.ensure_open()
  File "/home/smarthome/.local/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 726, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: code = 1001 (going away), no reason
Mai 09 04:12:12 WARNING  modules.websocket Series cancelation: No series for path bewegung.aussen.terrasse_og.fuenf found in list
Mai 09 04:12:12 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series_cancel", "error": "No series for path bewegung.aussen.terrasse_og.fuenf found in list"}
Mai 09 04:12:12 WARNING  modules.websocket Series cancelation: No series for path bewegung.og.fuenf found in list
Mai 09 04:12:12 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series_cancel", "error": "No series for path bewegung.og.fuenf found in list"}
Mai 09 04:12:12 WARNING  modules.websocket Series cancelation: No series for path bewegung.og.kueche.fuenf found in list
Mai 09 04:12:12 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series_cancel", "error": "No series for path bewegung.og.kueche.fuenf found in list"}
Mai 09 04:12:12 WARNING  modules.websocket Series cancelation: No series for path bewegung.og.abgang.fuenf found in list
Mai 09 04:12:12 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series_cancel", "error": "No series for path bewegung.og.abgang.fuenf found in list"}
Mai 09 04:12:12 WARNING  modules.websocket Series cancelation: No series for path bewegung.og.wc.fuenf found in list
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series_cancel", "error": "No series for path bewegung.og.wc.fuenf found in list"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "item", "items": [["bewegung.eg.zeitstatus", 30], ["bewegung.eg.gang.zeitstatus", 30], ["bewegung.eg.bad.zeitstatus", 0], ["bett.belegung", 2], ["bett.andy", false], ["bett.andy.sperren", false], ["bett.riki", true], ["bett.riki.sperren", false], ["bwm.eg.bad.nachlaufzeit_aktiv", false], ["bwm.eg.bad.nachlaufzeit_aktiv.start.unix_timestamp", 0], ["bwm.eg.bad.nachlaufzeit.duration_format", "0h 5i 0s"], ["wetterstation.helligkeit.osten", 1.0], ["bwm.eg.bad.helligkeitstrigger", true], ["bwm.eg.bad.helligkeitsschwelle", 8000], ["bwm.eg.bad.nachlaufzeit", 5], ["bwm.eg.bad.sperren", false], ["bwm.eg.bad.visu_mastertrigger", false], ["bwm.eg.bad.visu_trigger", false], ["bwm.eg.bad.austrigger", false], ["bwm.eg.gang.nachlaufzeit_aktiv", false], ["bwm.eg.gang.nachlaufzeit_aktiv.start.unix_timestamp", 0], ["bwm.eg.gang.nachlaufzeit.duration_format", "0h 0i 0s"], ["bwm.eg.gang.helligkeitswert", 0.0], ["bwm.eg.gang.helligkeitstrigger", true], ["bwm.eg.gang.helligkeitsschwelle", 0.0], ["bwm.eg.gang.nachlaufzeit", 0], ["bwm.eg.gang.reichweite", 0], ["bwm.eg.gang.sperren", false], ["bwm.eg.gang.visu_mastertrigger", false], ["bwm.eg.gang.visu_trigger", false], ["bwm.eg.gang.immerdunkel", false], ["bwm.eg.bad.automatik.settings.nacht.helligkeitsschwelle", 8000], ["bwm.eg.bad.automatik.settings.standard.helligkeitsschwelle", 8900], ["bwm.eg.bad.automatik.settings.nacht.nachlaufzeit", 5], ["bwm.eg.bad.automatik.settings.standard.nachlaufzeit", 14]]}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620439933058, 0.0], [1620449671282, 1.0], [1620450116880, 0.0], [1620454444378, 1.0], [1620456015003, 0.0], [1620456130745, 1.0], [1620456853330, 0.0], [1620456983935, 1.0], [1620457420163, 0.0], [1620458409284, 1.0], [1620458718198, 0.0], [1620458879584, 1.0], [1620459755501, 0.0], [1620459769008, 1.0], [1620460376303, 0.0], [1620466487010, 1.0], [1620466859127, 0.0], [1620467550240, 1.0], [1620467978769, 0.0], [1620471740312, 1.0], [1620472109984, 0.0], [1620477198716, 1.0], [1620477670798, 0.0], [1620479275388, 1.0], [1620479596804, 0.0], [1620483100100, 1.0], [1620484003455, 0.0], [1620491116347, 1.0], [1620491583346, 0.0], [1620491921600, 1.0], [1620492230796, 0.0], [1620501201890, 1.0], [1620501529600, 0.0], [1620501579021, 1.0], [1620501906024, 0.0], [1620502552805, 1.0], [1620503000972, 0.0], [1620520522084, 1.0], [1620520939021, 0.0], [1620520939021, 0.0], [1620526333058, 0.0]], "sid": "bewegung.eg.bad.fuenf|raw|24h|now|500"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620439933190, 0.0], [1620446416919, 1.0], [1620446720612, 0.0], [1620448476570, 1.0], [1620448942183, 0.0], [1620449479227, 1.0], [1620450131410, 0.0], [1620450530216, 1.0], [1620450846399, 0.0], [1620452913628, 1.0], [1620453274260, 0.0], [1620454321146, 1.0], [1620454997087, 0.0], [1620455395505, 1.0], [1620457442185, 0.0], [1620457467085, 1.0], [1620457878361, 0.0], [1620458328348, 1.0], [1620460569763, 0.0], [1620464555459, 1.0], [1620464894145, 0.0], [1620466152520, 1.0], [1620466870048, 0.0], [1620467285642, 1.0], [1620467976715, 0.0], [1620471380059, 1.0], [1620472167614, 0.0], [1620472321784, 1.0], [1620472629868, 0.0], [1620476252277, 1.0], [1620476609856, 0.0], [1620477193369, 1.0], [1620477669298, 0.0], [1620477690675, 1.0], [1620478217298, 0.0], [1620478439018, 1.0], [1620478747380, 0.0], [1620479274982, 1.0], [1620479593779, 0.0], [1620483099348, 1.0], [1620483440913, 0.0], [1620483596799, 1.0], [1620483998918, 0.0], [1620484573454, 1.0], [1620484905238, 0.0], [1620485337551, 1.0], [1620485869076, 0.0], [1620487664216, 1.0], [1620487967625, 0.0], [1620488321128, 1.0], [1620488639830, 0.0], [1620491066316, 1.0], [1620491581318, 0.0], [1620491915046, 1.0], [1620492254338, 0.0], [1620492351104, 1.0], [1620492688020, 0.0], [1620499030601, 1.0], [1620499374663, 0.0], [1620501012284, 1.0], [1620501523059, 0.0], [1620501579224, 1.0], [1620501901502, 0.0], [1620502550825, 1.0], [1620502996433, 0.0], [1620520519873, 1.0], [1620520938494, 0.0], [1620525249642, 1.0], [1620525557644, 0.0], [1620525557644, 0.0], [1620526333190, 0.0]], "sid": "bewegung.eg.gang.fuenf|raw|24h|now|500"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620439933284, 1.0], [1620450866466, 0.0], [1620450938213, 1.0], [1620451769914, 0.0], [1620455426829, 1.0], [1620455531597, 0.0], [1620455845531, 1.0], [1620455870135, 0.0], [1620455881585, 1.0], [1620455962338, 0.0], [1620501656392, 1.0], [1620501704507, 0.0], [1620501722001, 1.0], [1620502545773, 0.0], [1620502709684, 1.0], [1620520511288, 0.0], [1620520654737, 1.0], [1620520673813, 0.0], [1620520682774, 1.0], [1620520694819, 0.0], [1620520702345, 1.0], [1620525241818, 0.0], [1620525241818, 0.0], [1620526333284, 0.0]], "sid": "bett.andy|raw|24h|now|500"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620439933379, 1.0], [1620446391842, 0.0], [1620446400375, 1.0], [1620446404638, 0.0], [1620446423208, 1.0], [1620448861380, 0.0], [1620448888003, 1.0], [1620448999306, 0.0], [1620449633475, 1.0], [1620449656495, 0.0], [1620455451923, 1.0], [1620455531096, 0.0], [1620455560221, 1.0], [1620455761764, 0.0], [1620455854072, 1.0], [1620455868624, 0.0], [1620455882083, 1.0], [1620455960833, 0.0], [1620459313273, 1.0], [1620459336365, 0.0], [1620472349602, 1.0], [1620481683619, 0.0], [1620481692652, 1.0], [1620482581636, 0.0], [1620482589659, 1.0], [1620497860621, 0.0], [1620498337063, 1.0], [1620499619353, 0.0], [1620501608708, 1.0], [1620501608708, 1.0], [1620526333380, 1.0]], "sid": "bett.riki|raw|24h|now|500"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620483133468, 1.0], [1620484219007, 0.0], [1620484316119, 1.0], [1620484910762, 0.0], [1620485322755, 1.0], [1620485869072, 0.0], [1620487663185, 1.0], [1620487995167, 0.0], [1620488303945, 1.0], [1620488642292, 0.0], [1620491059724, 1.0], [1620491583341, 0.0], [1620491915138, 1.0], [1620492254338, 0.0], [1620492351159, 1.0], [1620492688524, 0.0], [1620499023721, 1.0], [1620499382125, 0.0], [1620501009812, 1.0], [1620501529595, 0.0], [1620501579168, 1.0], [1620501906037, 0.0], [1620502550929, 1.0], [1620503000967, 0.0], [1620520519992, 1.0], [1620520939010, 0.0], [1620525249761, 1.0], [1620525557648, 0.0], [1620525557648, 0.0], [1620526333468, 0.0]], "sid": "bewegung.eg.fuenf|max|12h|now|5000"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620483133562, 1.0], [1620483440913, 0.0], [1620483596799, 1.0], [1620483998918, 0.0], [1620484573454, 1.0], [1620484905238, 0.0], [1620485337551, 1.0], [1620485869076, 0.0], [1620487664216, 1.0], [1620487967625, 0.0], [1620488321128, 1.0], [1620488639830, 0.0], [1620491066316, 1.0], [1620491581318, 0.0], [1620491915046, 1.0], [1620492254338, 0.0], [1620492351104, 1.0], [1620492688020, 0.0], [1620499030601, 1.0], [1620499374663, 0.0], [1620501012284, 1.0], [1620501523059, 0.0], [1620501579224, 1.0], [1620501901502, 0.0], [1620502550825, 1.0], [1620502996433, 0.0], [1620520519873, 1.0], [1620520938494, 0.0], [1620525249642, 1.0], [1620525557644, 0.0], [1620525557644, 0.0], [1620526333562, 0.0]], "sid": "bewegung.eg.gang.fuenf|max|12h|now|5000"}
Mai 09 04:12:13 WARNING  modules.websocket smartVISU_protocol_v4: Exception in 'await websocket.send(reply)': code = 1001 (going away), no reason - reply = {"cmd": "series", "series": [[1620483133648, 1.0], [1620484003455, 0.0], [1620491116347, 1.0], [1620491583346, 0.0], [1620491921600, 1.0], [1620492230796, 0.0], [1620501201890, 1.0], [1620501529600, 0.0], [1620501579021, 1.0], [1620501906024, 0.0], [1620502552805, 1.0], [1620503000972, 0.0], [1620520522084, 1.0], [1620520939021, 0.0], [1620520939021, 0.0], [1620526333648, 0.0]], "sid": "bewegung.eg.bad.fuenf|max|12h|now|5000"}

Came "out of the blue". The exceptions happened just once so far but I guess could be catched easily. The "no series for path.." happens quite often, still not sure why

database: Verwaiste Datenreihen neu zuordnen

Verwaiste Datenreihen entstehen schnell durch das Umbenennen von Items oder die Änderung in der Hierarchie der Items. Es wäre gut, wenn man über das Webinterface eine verwaiste Datenreihe einem neuen Item zuweisen könnte.

database: Handling of removal of large number of old records

database plugin creates a new thread to remove old entries in items marked with database_maxage attribute. This happens every 91 seconds currently. Unfortunately several threads are startet one after the other even the first thread did not finish.

This results in a huge number of threads if some more items are marked with the database_maxage attribute before a restart of SHNG

database: Provide pack mechanism to keep database small

This issue is moved over from the core repo. The complete issue can be read over there: smarthomeNG/smarthome#216

The sqlite plugin have a pack mechanism which keeps the database small (like RRD files does). The database plugin does not have this mechanism and keeps all the values in the database.

To be able to have small databases (e.g. for embedded systems and maybe completely replace sqlite plugin) the database plugin should also have such a mechanism.

Different ideas exist

Reduce by aggregation: aggregate and pack values for different timespans to different details
Reduce by dumping/exporting: automatic export/dump function which exports data (e.g. into CSV files) and removes them > from database after export completed
Reduce by moving to history tables: make use of history tables (e.g. move everything older than one year into a log_YYYY table)
Reduce by removing "duplicates": duplicated values, eg same value in multiple records can be aggregated to one record
Reduce by remvoing: Simply delete data older the given amount of time
Reduce by max. amount of records: Only given amountof records will be kept in database, other ones will be removed
Reduce by kepping database size: calculate usage of each item and remove given percentage frkm all of them
Reduce by replacing details with inaccurates: replace details by calculating an inaccurate value for a set of values (e.g. only store changes for temperature without changes in floating point)
... other ideas?
Can be configured:

Globally in plugin configuration
On a per item basis
... other ideas

(leftover from #165)

Onewire: missing sensors because "no payload error" on crowded bus

I have two OW interfaces connected to my Odroid-M, but only sensors on one bus are scanned.

Using the command line owdir /bus.1will need about 1 second, owdir /bus.0 takes 4.5s or so.
Doing this in plugins/onewire with python3 interactively:

import owbase
ow=owbase.OwBase('127.0.0.1', 4304')
ow.dir('/bus.1')

bus1 works fine, but bus0 will usually throw owbase.owex: no payload for /bus.0/ (sometimes succeeding). Interestingly, owdir('/') never fails, but will happily return all items.

Since the /bus.1 request fails after about 2 seconds, I increased the _sock.settimeout to 10 seconds, but that didn't help

Any suggestions?

knx problem: Threads can only be started once

Got this error today, KNX Plugin Version 1.8.0:

Mär 29 11:37:11 ERROR    KNX poll jalousien.eg.osten_buero.hoehe Method KNX poll jalousien.eg.osten_buero.hoehe exception: threads can only be started once
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 659, in _task
    obj(**value)
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 252, in _poll
    self.groupread(kwargs['ga'])
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 243, in groupread
    self._send(pkt)
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 191, in _send
    self._client.send(send)
  File "/usr/local/smarthome/lib/network.py", line 648, in send
    self.connect()
  File "/usr/local/smarthome/lib/network.py", line 618, in connect
    self.__connect_thread.start()
  File "/usr/lib/python3.9/threading.py", line 869, in start
    raise RuntimeError("threads can only be started once")
RuntimeError: threads can only be started once
Mär 29 11:37:11 ERROR    KNX poll jalousien.og.osten_stiegenhaus.hoehe Method KNX poll jalousien.og.osten_stiegenhaus.hoehe exception: threads can only be started once
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 659, in _task
    obj(**value)
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 252, in _poll
    self.groupread(kwargs['ga'])
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 243, in groupread
    self._send(pkt)
  File "/usr/local/smarthome/plugins/knx/__init__.py", line 191, in _send
    self._client.send(send)
  File "/usr/local/smarthome/lib/network.py", line 648, in send
    self.connect()
  File "/usr/local/smarthome/lib/network.py", line 618, in connect
    self.__connect_thread.start()
  File "/usr/lib/python3.9/threading.py", line 869, in start
    raise RuntimeError("threads can only be started once")
RuntimeError: threads can only be started once

Any ideas where this problem originates from?
Respective item has knx_poll: 2/1/18

KNX Busmonitor log:

Mär 29 11:34:53 --------------------   Init SmartHomeNG v1.9.1.1-ce26bff4.develop   --------------------;
Mär 29 11:34:53 Running in Python interpreter 'v3.9.2 final', from directory /usr/local/smarthome;
Mär 29 11:34:53  - on Linux-5.10.103-v7l+-armv7l-with-glibc2.31 (pid=1129);
Mär 29 11:35:03  - Nutze Feiertage für Land 'AT', Provinz 'V', benutzerdefinierte(r) Feiertag(e) nicht definiert;
Mär 29 11:37:13 ;1.1.34;3/3/97;180.96;
Mär 29 11:37:13 ;1.1.34;3/3/97;180.96;
Mär 29 11:37:13 ;1.1.44;4/5/24;False;
...

Mär 29 11:37:28 ;1.1.4;2/1/18;0.0;

KNX Log:
Mär 29 11:36:10 CEST INFO plugins.knx Main Item jalousien.eg.osten_buero.hoehe is polled on GA 2/1/18 every 60.0 seconds -- (init.py:parse_item:618)
and some more polling info, then nothing.

smartvisu: Feature request for plugin specific widgets (icon style)

Plugin specific smartVISU widgets are often delivered only with white svg icons. The docu says that icons will be copied from the plugins „sv_widgets“ directory to smartVISU „dropins/icons/ws“.
These icons can not be used with smartVISU designs requiring black icons (e.g „ice“).
In addition to the current behavior, the smartvisu Plugin should check whether an „icons“ folder exists inside „sv_widgets“ and then copy the contents from the subdirectories „ws“ and „sw“ into smartVISU „dropins/icons/ws“ and „ dropins/icons/sw“.

mqtt: subscription from logic never triggered

Trying to subscribe to a MQTT topic out of an own logic code I realized that callback never gets called. Test was done with 1.9.0 but seems to happen also with 1.8.2

Enabling some debug logging you can see that caller-type not being recognized as "Logic" but "Unknown"

Logging output at subscription

DEBUG modules.mqtt _get_caller_type: inspect.stack()[2][1] = '/usr/local/smarthome_1.9.0/logics/kiosk.py', split = ['', 'usr', 'local', 'smarthome_1.9.0', 'logics', 'kiosk.py']
INFO modules.mqtt _get_caller_type: inspect.stack()[2][1] = '/usr/local/smarthome_1.9.0/logics/kiosk.py', split = ['', 'usr', 'local', 'smarthome_1.9.0', 'logics', 'kiosk.py']
DEBUG modules.mqtt 'subscribe_topic()' - called from Unknown by '()'
INFO modules.mqtt subscribe_topic: Adding topic 'fully/event/screenOn'
INFO modules.mqtt _add_subscription_definition: Unknown 'kiosk_browser' is subscribing to topic 'fully/event/screenOn'
INFO modules.mqtt subscribe_topic: mqtt module is subscribing to topic 'fully/event/screenOn' with qos=1 at broker (result=0, mid=29)

Logging output when topic received

DEBUG modules.mqtt _on_mqtt_message: RECEIVED topic 'fully/event/screenOn', payload 'b'{"deviceId":"xxxxxxx","event":"screenOn"}', QoS '1', retain '0'
DEBUG modules.mqtt _on_mqtt_message: subscription 'kiosk_browser': {'subscriber_type': 'unknown', 'callback': 'kiosk_browser', 'payload_type': 'str', 'bool_values': None}
ERROR modules.mqtt _on_mqtt_message: received topic for unknown subscriber_type 'unknown'
ERROR modules.mqtt _on_mqtt_message: Received topic 'fully/event/screenOn', payload 'b'{"deviceId":"xxxxxxx","event":"screenOn"}'', QoS '1', retain '0' WITHOUT matching item/logic

I was able to fix the issue for my szenario by updating an array-index within modules/mqtt/init.py:728 function _get_caller_type
instead of elif split[-3] == 'logics' use elif split[-2] == 'logics'

zwave: Necessary package not maintained currently and fix not in sight

The package python-openzwave from https://pypi.org/project/python-openzwave/ is needed for ZWave Plugin to work.
Unfortunately this package won't install with Python 3.9 e.g. on Debian bullseye.
The Package is currently unmaintaned and does not get any fixes. It is unlikely that existing problems will be fixed in nearer future.

There are other projects like Eventghost or Homeassistant that seem to face the same problems. They seem to have a solution, see at blacklight/platypush#128 @kdschlosser seems to have developed a solution.

I don't know if https://pypi.org/project/homeassistant-pyozw/ can provide a solution. However I do not have hardware an can not test or develop another integration. So if we do not find a solution I vote for removing the plugin from the plugin repo so that Travis CI tests won't fail any more.

alexa or alexa4p3?: Warning Item ... , attribute 'alexa_actions' is undefined and has value 'turnOn turnOff'

Hi guys,

i stumpled upon a Warning which is triggered by lib/metadata.py:check_itemattribute:1142

Item 'og.licht.bad', attribute 'alexa_device': Attribute is undefined and has value 'og_light_bad' (defined in lampen_og.yaml) -- metadata.py:check_itemattribute:1142

Im on 85aabc80..321316e5 (smarthomeNG) and bb134dd..ed476dc (plugin)

Is there a definition missing in the alex plugin? What is happening here?

homematic: error 500 module website

Hi,
I get an error 500 when I open the Homematic module website. Possibly because I have partially named my items, "str(item)" does not work here:

self.hm_items.append( [str(item), item, hm_address, hm_channel, hm_function, hm_node, dev_type] )

If you replace this with str(item.property.path), it works again without problems:

self.hm_items.append( [str(item.property.path), item, hm_address, hm_channel, hm_function, hm_node, dev_type] )

It would be nice if you could change this in later updates.
Thank you in advance

husky: api connection error

Since a few days the connection to the husqvarna automover via the plugin seems not working anymore. The andriod app still works as always. Before this I had the plugin running for several weeks without any problems.

When I am looking into the log there is always the same 404 error and the plugin pauses.
Can anybody confirm this? Is it possible that husqvarna changed the url to connect to the api from the one used in the plugin now definitive to the new one (https://api.amc.husqvarna.dev/v1)?

Here is my shortened log from a startup of SmarthomeNG:

2022-03-31  12:13:50 NOTICE   lib.smarthome       --------------------   Init SmartHomeNG v1.9.1-master (8133e714)   --------------------
2022-03-31  12:13:50 NOTICE   lib.smarthome       Running in Python interpreter 'v3.8.10 final', from directory /usr/local/smarthome
2022-03-31  12:13:50 NOTICE   lib.smarthome        - on Linux-5.4.0-105-generic-x86_64-with-glibc2.29 (pid=7986)
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: mower connection state
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item mower connection state to wachlist husky_state=connection 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: activity name (CUTTING, MOVING, ...)
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item activity name (CUTTING, MOVING, ...) to wachlist husky_state=activity 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: System.Maehroboter.state.errormessage
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item System.Maehroboter.state.errormessage to wachlist husky_state=errormessage 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: System.Maehroboter.state.message
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item System.Maehroboter.state.message to wachlist husky_state=message 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: System.Maehroboter.state.color
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item System.Maehroboter.state.color to wachlist husky_state=color 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse STATE item: System.Maehroboter.state.batterypercent
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid state item System.Maehroboter.state.batterypercent to wachlist husky_state=batterypercent 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse CONTROL item: Start
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid command item Start to wachlist husky_control=START_3H 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse CONTROL item: Start normal
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid command item Start normal to wachlist husky_control=START 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse CONTROL item: Stop
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid command item Stop to wachlist husky_control=STOP 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse CONTROL item: Park
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid command item Park to wachlist husky_control=PARK 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse CONTROL item: Park until next Timer
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid command item Park until next Timer to wachlist husky_control=PARK_TIMER 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse OPDATA item: Mähzeit in Millisekunden
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid operation data item Mähzeit in Millisekunden to wachlist husky_operating=CUTTING 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse OPDATA item: Parkzeit in Millisekunden
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid operation data item Parkzeit in Millisekunden to wachlist husky_operating=PARKED 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse OPDATA item: Ladezeit in Millisekunden
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid operation data item Ladezeit in Millisekunden to wachlist husky_operating=CHARGING 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse OPDATA item: Bewegungszeit in Millisekunden
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid operation data item Bewegungszeit in Millisekunden to wachlist husky_operating=MOVING 
2022-03-31  12:13:58 DEBUG    plugins.husky       parse OPDATA item: Fehlerzeit in Millisekunden
2022-03-31  12:13:58 DEBUG    plugins.husky       adding valid operation data item Fehlerzeit in Millisekunden to wachlist husky_operating=ERROR 
2022-03-31  12:13:59 DEBUG    plugins.husky       Run method called
2022-03-31  12:13:59 INFO     plugins.husky       login with userid: ****.****@****.****
2022-03-31  12:13:59 NOTICE   lib.smarthome       --------------------   SmartHomeNG initialization finished   --------------------
2022-03-31  12:14:00 INFO     plugins.husky       Logged in successfully
2022-03-31  12:14:00 INFO     plugins.husky       login lifetime 863999
2022-03-31  12:14:00 INFO     plugins.husky       token updated
2022-03-31  12:14:00 ERROR    lib.plugin          Plugin 'husky' exception in run() method: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/plugin.py", line 676, in run
    self.plugin.run()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 175, in run
    self._select_mower()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 423, in _select_mower
    self.mowers = self.mowapi.list_robots()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 709, in list_robots
    response.raise_for_status()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers
...

The first occourence of a failure was this 500 error but after this it worked again:

2022-03-27  10:48:04 DEBUG    plugins.husky       status received - but same timestamp - no update needed (True)
2022-03-27  10:49:04 DEBUG    plugins.husky       status received - but same timestamp - no update needed (True)
2022-03-27  10:50:08 ERROR    plugins.husky.husky_poll_service Method plugins.husky.husky_poll_service exception: 500 Server Error: Internal Server Error for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 657, in _task
    obj()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 340, in poll_device
    mower_status_v0 = self.mowapi.status()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 731, in status
    response.raise_for_status()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
2022-03-27  10:51:05 DEBUG    plugins.husky       --- new status received:
2022-03-27  10:51:05 DEBUG    plugins.husky       **** [PARKED] - 100% (2022-03-27 10:50:15)
2022-03-27  10:51:05 DEBUG    plugins.husky       found 6 state items to update
...

and then the next day it startet to throw the 404 error countinuously:

2022-03-28  09:26:18 DEBUG    plugins.husky       status received - but same timestamp - no update needed (True)
2022-03-28  09:27:18 ERROR    plugins.husky.husky_poll_service Method plugins.husky.husky_poll_service exception: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 657, in _task
    obj()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 340, in poll_device
    mower_status_v0 = self.mowapi.status()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 731, in status
    response.raise_for_status()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
2022-03-28  09:28:18 ERROR    plugins.husky.husky_poll_service Method plugins.husky.husky_poll_service exception: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 657, in _task
    obj()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 340, in poll_device
    mower_status_v0 = self.mowapi.status()
  File "/usr/local/smarthome/plugins/husky/__init__.py", line 731, in status
    response.raise_for_status()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://amc-api.dss.husqvarnagroup.net/v1/mowers/*******-*******/status
....

onwire plugin - warning: Wrong address size

Hi, i am using aliases in my owfs.conf on my temperature devices in smarthomeNG:
So
ow_addr: kitchen
is used instead of
ow_addr: 28.XXXXXXXXXXXX

Its clear why I get this warning:
1-Wire: Wrong address size 'kitchen' for item temp.kitchen

the following change in the plugin code could fix this:

if addr[2] == '.' and len(addr) != 15:
self.logger.warning("1-Wire: Wrong address size '{}' for item {}".format(addr, item))

database: Increase duration of previous db entry when deleting

The database plugin provides the possibility to manually delete single entries in the DB via the plugin's web interface (dustbin button).
The value itself is delete correctly. However, the duration of the previous value should be increased by the same duration of the item that is deleted.

At the moment, using the manual delete button leads to a currpted database in which the durations are no longer consistent. This leads to wrong values when evaluating integral values from the db entries.

plugin Alexa4P3 :

Hello,

for this item

                type: list
                alexa_device: Lina_Lichterschlauch
                alexa_description: Lichterschlauch Lina Fenster
                alexa_color_value_type: RGB
                alexa_actions: SetColor
                alexa_retrievable: True
                alexa_color_value_type: RGB
                on_change:
                  - og.Lina.FensterFarb.R.Dimmwert = list[0]
                  - og.Lina.FensterFarb.G.Dimmwert = list[1]
                  - og.Lina.FensterFarb.B.Dimmwert = list[2]
                  - og.Lina.FensterFarb.sequencer = 0

I get this Error.

--
2019-11-25  20:15:08 ERROR    Alexa4P3     Plugin 'alexa4p3' exception in run() method: Alexa: invalid device Lina_Lichterschlauch
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/plugin.py", line 674, in run
    self.plugin.run()
--
    raise ValueError("Alexa: invalid device {}".format(device.id))
ValueError: Alexa: invalid device Lina_Lichterschlauch

And the plugin stops responding.

This is a configuration Error, but the Plugin should be resilient against it.

Regards,
Hendrik

Convert ancient Plugins to use lib.network instead of lib.connection

Currently the following plugins still use lib.connection but are deprecated and will be removed:

  • raumfeld (deprecated)
  • visu_websocket is deprecated and a module as replacement is in place @develop branch

The following plugins already have an implementation:

These plugins were converted by @Morg42 but are not pushed into develop:

The lib.connection should then be removed prior to SmartHomeNG 2.0

avm plugin -> hkr_device -> set_temperature

Hi,

Thanks a lot for this plugin, very helpful!

I am trying to integrate my Fritz!Dect 301 Thermostat, and am using the hkr_device-functionality. Reading state and temperature works fine, however, I would like to be able to set the set_temperature. It seems this is currently not supported?

Could this be added?

Best regards,
//giase

Database plugin exception when removing old entries

If the database is under stress the remove old entries method can't be executed successfully. That's what to expect but maybe the error could be catched somehow in a nicer way?

Feb 05 14:54:51 ERROR    lib.db            Can not execute query: DELETE FROM log WHERE (item_id = %(id)s                                      ) AND (time    = %(time)s          OR 1 = %(time_flag)s         ) AND (time    > %(time_start)s    OR 1 = %(time_start_flag)s   ) AND (time    < %(time_end)s      OR 1 = %(time_end_flag)s     ) AND (changed = %(changed)s       OR 1 = %(changed_flag)s      ) AND (changed > %(changed_start)s OR 1 = %(changed_start_flag)s) AND (changed < %(changed_end)s   OR 1 = %(changed_end_flag)s  );     (args OrderedDict([('id', 451), ('time', None), ('time_flag', 1), ('time_start', None), ('time_start_flag', 1), ('time_end', 1604584284758), ('time_end_flag', 0), ('changed', None), ('changed_flag', 1), ('changed_start', None), ('changed_start_flag', 1), ('changed_end', None), ('changed_end_flag', 1)])): (1205, 'Lock wait timeout exceeded; try restarting transaction')
Feb 05 14:54:51 ERROR    plugins.database  Database: Error for query DELETE FROM log WHERE (item_id = 451                                      ) AND (time    = None          OR 1 = 1         ) AND (time    > None    OR 1 = 1   ) AND (time    < 1604584284758      OR 1 = 0     ) AND (changed = None       OR 1 = 1      ) AND (changed > None OR 1 = 1) AND (changed < None   OR 1 = 1  );    : (1205, 'Lock wait timeout exceeded; try restarting transaction')
Feb 05 14:54:51 ERROR    plugins.database.Remove old Method plugins.database.Remove old exception: (1205, 'Lock wait timeout exceeded; try restarting transaction')
Traceback (most recent call last):
  File "/usr/local/smarthome/lib/scheduler.py", line 664, in _task
    obj()
  File "/usr/local/smarthome/plugins/database/__init__.py", line 1162, in remove_older_than_maxage
    self.deleteLog(item_id, time_end=timestamp_end, with_commit=False)
  File "/usr/local/smarthome/plugins/database/__init__.py", line 624, in deleteLog
    self._execute(self._prepare("DELETE FROM {log} WHERE " + condition), params, cur=cur)
  File "/usr/local/smarthome/plugins/database/__init__.py", line 1229, in _execute
    self._query(self._db.execute, query, params, cur)
  File "/usr/local/smarthome/plugins/database/__init__.py", line 1259, in _query
    raise e
  File "/usr/local/smarthome/plugins/database/__init__.py", line 1256, in _query
    tuples = func(self._prepare(query), params, cur=cur)
  File "/usr/local/smarthome/lib/db.py", line 324, in execute
    result = c.execute(stmt, args)
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/cursors.py", line 148, in execute
    result = self._query(query)
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/cursors.py", line 310, in _query
    conn.query(q)
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 548, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 775, in _read_query_result
    result.read()
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 1156, in read
    first_packet = self.connection._read_packet()
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/connections.py", line 725, in _read_packet
    packet.raise_for_error()
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/protocol.py", line 221, in raise_for_error
    err.raise_mysql_exception(self._data)
  File "/home/smarthome/.local/lib/python3.8/site-packages/pymysql/err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')

All plugins: Update your plugins to enable parameter check by admin interface

Dear plugin developers, maintainers and testers. I have reviewed the plugins available as of April 11th, 2020 and found a bunch of them to not use the latest developments and findings in plugin technology ;-)

It is not needed anymore to pass the plugin parameters to a smart plugins via parameter of init function. It is however good practice to use the self.get_parameter_value() function instead of passing arguments. This enables the admin interface to configure the plugins during runtime and provide error checking.

Furthermore it is advised to update all meta data. Please revise the section of tester, maintainer and especially the state of development. Is the plugin doing fine the it should be communicated in the plugin.yaml.
Check to see if there is a support thread in knx user forum and please fill in the keywords as well.
Did you also check for a logo to use in gui and webinterface?

Plugins (that are not deprecated) to overhaul:

  • plugins/comfoair/init.py # Stefan Kals
  • plugins/helios/init.py # Tom-Bom-badil
  • plugins/intercom_2n/init.py # @Pfischi
  • plugins/jvcproj/init.py # Nico P.
  • plugins/kostal/init.py # @ohinckel, Wenger Florian
  • plugins/luxtronic2/init.py
  • plugins/plex/init.py # @rthill
  • plugins/rcswitch/init.py # Daniel Frank
  • plugins/roomba_980/init.py
  • plugins/sma/init.py # @robert-budde
  • plugins/smarttv/init.py
  • plugins/sml/init.py # @ohinckel
  • plugins/systemair/init.py # @robert-budde

svNG plugin harmony: PowerOff handling not correct

Hello,
I am just switching from fhem to svNG and today I had analysed my problem that current_activity_id and current_activity_name are only updated with a time delay after approx. 3 minutes after switching off. With all other activities this happened immediately.

I found the problem in init.py and fixed it.

def _message(self, message): self._logger.debug("Harmony: message: {msg}".format(msg=message)) # we have to check two response due to some version changes in harmony device # ORIGINAL # match = re.match(r".*?startActivityFinished\">activityId=(\d+):errorCode=200.*", # NEU # match = re.match(r".*?startActivityFinished\">activityId=(-?\d+):errorCode=200.*", html.unescape(str(message))) if not match: # ORIGINAL # match = re.match(r".*?startActivityFinished\">errorCode=200:errorString=OK:activityId=(-?\d+)", # NEU # match = re.match(r".*?startActivityFinished\">errorCode=200:errorString=OK:activityId=(-?\d+)", html.unescape(str(message))) if match: self._set_current_activity(int(match.group(1)))

The RE wasn't correct. The "Minus sign" was missing before (PowerOff = activity -1). So, PowerOff was only recognized with following polling cycle (assumption).

Please check in to the repo. Thank you in advance.

Best regards,
Jörk

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.