diff --git a/avm/requirements.txt b/avm/requirements.txt index 3437857be..8e234f8b5 100755 --- a/avm/requirements.txt +++ b/avm/requirements.txt @@ -1,2 +1 @@ -requests -lxml>=4.9.2 +lxml>=4.9.2,<=4.9.4 diff --git a/blockly/assets/blocky_webif.png b/blockly/assets/blockly_webif.png similarity index 100% rename from blockly/assets/blocky_webif.png rename to blockly/assets/blockly_webif.png diff --git a/kodi/user_doc.rst b/kodi/user_doc.rst index b3ca5b052..08e747f2a 100755 --- a/kodi/user_doc.rst +++ b/kodi/user_doc.rst @@ -39,7 +39,7 @@ Damit ist die alte Item-Struktur 1:1 übernommen und nutzt die neuen Funktionen. Wenn die Items einzeln erstellt und konfiguriert wurden, muss die alte Item-Konfiguration manuell umgestellt werden, indem die entsprechenden Item-Attribute des kodi-Plugins ersetzt werden. -.. code-block:: yaml +.. code-block:: yaml kodi: volume: @@ -92,8 +92,7 @@ Konfiguration Hinweise zu Verbindungen ======================== -Über die plugin-Parameter `connect_retries` (Anzahl) und `connect_cycle (Wartezeit) kann eingestellt werden, wie oft das Plugin versucht, eine Verbindung zu Kodi aufzubauen. +Über die plugin-Parameter `connect_retries` (Anzahl) und `connect_cycle` (Wartezeit) kann eingestellt werden, wie oft das Plugin versucht, eine Verbindung zu Kodi aufzubauen. -Das weitere Verhalten wird über die Parameter `retry_cycle` (Wartezeit) und `retry_suspend` (Anzahl Zyklen) eingestellt. Nach Ablauf dieser Versuche wartet das Plugin 30 Sekunden (bzw. die in `retry_cycle` eingestellte Zeit), bevor das Ganze wiederholt wird. Wenn `retry_suspend` gesetzt ist, wechselt das Plugin nach dieser Anzahl von `retry_cycles` in den Suspend-Modus und beendet die Verbindungsversuche. +Das weitere Verhalten wird über die Parameter `retry_cycle` (Wartezeit) und `retry_suspend` (Anzahl Zyklen) eingestellt. Nach Ablauf dieser Versuche wartet das Plugin 30 Sekunden (bzw. die in `retry_cycle` eingestellte Zeit), bevor das Ganze wiederholt wird. Wenn `retry_suspend` gesetzt ist, wechselt das Plugin nach dieser Anzahl von `retry_cycles` in den Suspend-Modus und beendet die Verbindungsversuche. Um den Suspend-Modus zu beenden, kann mit dem Plugin-Attribut `suspend_item` ein Item konfiguriert werden, mit dem der Suspend-Modus ein- und ausgeschaltet werden kann. Alternativ stehen die Plugin-Funktionen `suspend()` und `resume()` zur Verfügung. - diff --git a/mailsend/user_doc.rst b/mailsend/user_doc.rst index 4a0b5a217..dc8436e0d 100644 --- a/mailsend/user_doc.rst +++ b/mailsend/user_doc.rst @@ -1,11 +1,9 @@ -.. index:: Plugins; sample -.. index:: sample +.. index:: Plugins; mailsend +.. index:: mailsend -====== -sample -====== - -Hier sollte eine allgemeine Beschreibung stehen, wozu das Plugin gut ist (was es tut). +======== +mailsend +======== .. image:: webif/static/img/plugin_logo.png :alt: plugin logo @@ -15,84 +13,14 @@ Hier sollte eine allgemeine Beschreibung stehen, wozu das Plugin gut ist (was es :align: left -Anforderungen -============= - -Anforderungen des Plugins auflisten. Werden spezielle Soft- oder Hardwarekomponenten benötigt? - - -Notwendige Software -------------------- - -* die -* benötigte -* Software -* auflisten - -Dies beinhaltet Python- und SmartHomeNG-Module - -Unterstützte Geräte -------------------- - -* die -* unterstütze -* Hardware -* auflisten - -| - Konfiguration ============= Die Plugin Parameter und die Informationen zur Item-spezifischen Konfiguration des Plugins sind -unter :doc:`/plugins_doc/config/sample` beschrieben. - -plugin.yaml ------------ - -Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde. - - -items.yaml ----------- - -Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde. +unter :doc:`/plugins_doc/config/mailsend` beschrieben. -logic.yaml ----------- - -Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde. - - -Funktionen ----------- - -Bitte die Dokumentation lesen, die aus den Metadaten der plugin.yaml erzeugt wurde. - -| - -Beispiele -========= - -Hier können ausführlichere Beispiele und Anwendungsfälle beschrieben werden. (Sonst ist der Abschnitt zu löschen) - -| - Web Interface ============= -Die Datei ``dev/sample_plugin/webif/templates/index.html`` sollte als Grundlage für Webinterfaces genutzt werden. Um Tabelleninhalte nach Spalten filtern und sortieren zu können, muss der entsprechende Code Block mit Referenz auf die relevante Table ID eingefügt werden (siehe Doku). - -SmartHomeNG liefert eine Reihe Komponenten von Drittherstellern mit, die für die Gestaltung des Webinterfaces genutzt werden können. Erweiterungen dieser Komponenten usw. finden sich im Ordner ``/modules/http/webif/gstatic``. - -Wenn das Plugin darüber hinaus noch Komponenten benötigt, werden diese im Ordner ``webif/static`` des Plugins abgelegt. - -| - -Version History -=============== - -In diesem Abschnitt kann die Versionshistorie dokumentiert werden, falls der Plugin Autor dieses möchte. Diese Abschnitt -ist optional. - +Das Plugin verfügt über kein Web Interface. diff --git a/nuki/__init__.py b/nuki/__init__.py index 2ddbf6850..1c0c5db00 100755 --- a/nuki/__init__.py +++ b/nuki/__init__.py @@ -43,7 +43,7 @@ class Nuki(SmartPlugin): - PLUGIN_VERSION = "1.6.1" + PLUGIN_VERSION = "1.6.3" def __init__(self, sh, *args, **kwargs): @@ -103,14 +103,13 @@ def run(self): self._clear_callbacks() self.scheduler_add(__name__, self._scheduler_job, prio=3, cron=None, cycle=300, value=None, offset=None, next=None) - + self._register_callback() self.alive = True def _scheduler_job(self): # will also be executed at start self._get_paired_nukis() - self._register_callback() - self._get_nuki_status() + self._get_nuki_status_via_list() def stop(self): self.alive = False @@ -161,11 +160,39 @@ def update_item(self, item, caller=None, source=None, dest=None): if response is not None: if response['success']: # self._get_nuki_status() - self.logger.info( + self.logger.debug( "Plugin '{0}': update item: {1}".format(self.get_shortname(), item.property.path)) + # immediatly update lock state via list, to e.g. the status information that lock is locking + self._get_nuki_status_via_list() else: self.logger.error("Plugin '{}': no response.".format(self.get_shortname())) + @staticmethod + def update_lock_state_via_list(nuki_id, nuki_data): + nuki_battery = None + nuki_state = None + nuki_doorstate = None + + lock_state=nuki_data['lastKnownState'] + + if 'state' in lock_state: + nuki_state = lock_state['state'] + if 'doorsensorState' in lock_state: + nuki_doorstate = lock_state['doorsensorState'] + if 'batteryCritical' in lock_state: + nuki_battery = 0 if not lock_state['batteryCritical'] else 1 + + for item, key in nuki_event_items.items(): + if key == nuki_id: + item(nuki_state, 'NUKI') + for item, key in nuki_door_items.items(): + if key == nuki_id: + item(nuki_doorstate, 'NUKI') + for item, key in nuki_battery_items.items(): + if key == nuki_id: + item(nuki_battery, 'NUKI') + + @staticmethod def update_lock_state(nuki_id, lock_state): @@ -244,6 +271,20 @@ def _register_callback(self): "Plugin '{}': No callback ip set. Automatic Nuki lock status updates not available.".format (self.get_shortname())) + def _get_nuki_status_via_list(self): + self.logger.info("Plugin '{}': Getting Nuki status ...".format + (self.get_shortname())) + + response = self._api_call(self._base_url, endpoint='list', token=self._token, + no_wait=self._noWait) + if response is None: + self.logger.info("Plugin '{}': Getting Nuki status ... Response is None.".format(self.get_shortname())) + return + for nuki_id in paired_nukis: + for nuki_data in response: + if nuki_data['nukiId'] == int(nuki_id): + Nuki.update_lock_state_via_list(nuki_id, nuki_data) + def _get_nuki_status(self): self.logger.info("Plugin '{}': Getting Nuki status ...".format (self.get_shortname())) @@ -387,7 +428,6 @@ def index(self): self.plugin.logger.debug( "Plugin '{pluginname}' - NukiWebServiceInterface: Status Smartlock: ID: {nuki_id} Status: {state_name}". format(pluginname=self.plugin.get_shortname(), nuki_id=nuki_id, state_name=state_name)) - Nuki.update_lock_state(nuki_id, input_json) except Exception as err: self.plugin.logger.error( diff --git a/nuki/plugin.yaml b/nuki/plugin.yaml index f23b50ac3..8a2c03a9d 100755 --- a/nuki/plugin.yaml +++ b/nuki/plugin.yaml @@ -12,7 +12,7 @@ plugin: # documentation: https://github.com/smarthomeNG/smarthome/wiki/CLI-Plugin # url of documentation (wiki) page support: https://knx-user-forum.de/node/1052437 - version: 1.6.1 # Plugin version + version: 1.6.3 # Plugin version sh_minversion: 1.9.0 # minimum shNG version to use this plugin # sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest) multi_instance: False # plugin supports multi instance diff --git a/resol/user_doc.rst b/resol/user_doc.rst index 6ef13a406..12d8d515b 100755 --- a/resol/user_doc.rst +++ b/resol/user_doc.rst @@ -17,9 +17,8 @@ Allgemein Resol plugin, mit Unterstützung für Resol Solar Datenlogger, Frischwasserwärmetauscher und Regler. -http://www.resol.de/index/produktdetail/kategorie/4/id/8/sprache/de - -http://www.cosmo-info.de/fileadmin/user_upload/DL/COSMO-Solarregelung/COSMO-Multi.pdf +`Resol Webseite `_ +`Cosmo Solarregelung `_ Konfiguration @@ -53,7 +52,7 @@ Beispiel enforce_updates: 'true' resol_offset: 2 resol_bituse: 15 - resol_factor: + resol_factor: - '0.1' - '25.6' @@ -63,7 +62,7 @@ Beispiel enforce_updates: 'true' resol_offset: 28 resol_bituse: 48 - resol_factor: + resol_factor: - '1' - '256' - '1000' @@ -93,15 +92,13 @@ Beispiel database_maxage: 62 resol_offset@solar: 0 resol_bituse@solar: 16 - resol_factor@solar: + resol_factor@solar: - '0.1' - '25.6' resol_isSigned@solar: - False - True - - Resol Protokoll =============== @@ -110,23 +107,22 @@ Informationen Weitere Informationen zu Resol Parametern und Quellen sind hier zu finden: -https://github.com/danielwippermann/resol-vbus - -https://danielwippermann.github.io/resol-vbus/#/vsf +`Github `_ +`Daniel Wippermann `_ Über die Installation der Resol Software Service Center können weitere Offsets und Bitmasken ausgelesen werden. Diese werden im XML Format von RESOL als Teil der RSC Software (Resol Service Center) bereitgestellt. Hierzu einfach download, installieren (unter Linux ``wine`` nutzen) und die benötigten XML Dateien von hier beziehen: {Install_dir}/eclipse/plugins/de.resol.servicecenter.vbus.resol_2.0.0/ - -Synch byte zwischen verschiedenen Messages: 0xAA +Sync byte zwischen verschiedenen Messages: 0xAA Message: =============== ========================================================================= -Byte(s) Inhalt +Byte(s) Inhalt =============== ========================================================================= 0-1 Destination 2-3 Source - 4 Protocol Version, 0x10 -> "PV1", 0x20 -> "PV2", 0x30 -> "PV3" +4 Protocol Version, 0x10 -> "PV1", 0x20 -> "PV2", 0x30 -> "PV3" 5-6 Command 7-8 Frame count, Example 0x1047-> 104 bytes =============== ========================================================================= diff --git a/smartvisu/tplNG/index.html b/smartvisu/tplNG/index.html index f965818ad..6a041ed9b 100755 --- a/smartvisu/tplNG/index.html +++ b/smartvisu/tplNG/index.html @@ -12,26 +12,9 @@ {% block sidebar %} - {% import "lib.html" as lib %} {{ lib.updatecheck() }} - {% import "clock.html" as clock %} - {{ clock.digiclock('clock') }} - -
- {{ now|smartdate('l') }}, {{ now|smartdate() }} -
- -
- - {% import "weather.html" as weather %} - {{ weather.current('weather') }} - -
- - {{ weather.forecastweek('weather_forecast') }} - -
+ {% include 'infoblock.html' %} {% endblock %} diff --git a/smartvisu/tplNG/infoblock.html b/smartvisu/tplNG/infoblock.html index 766c13994..3f3f6ab10 100755 --- a/smartvisu/tplNG/infoblock.html +++ b/smartvisu/tplNG/infoblock.html @@ -10,7 +10,6 @@ * ----------------------------------------------------------------------------- */ - {% import "clock.html" as clock %} {{ clock.digiclock('clock') }}
@@ -18,7 +17,6 @@

- {% import "weather.html" as weather %} {{ weather.current('weather') }}
diff --git a/sml/plugin.yaml b/sml/plugin.yaml index c031f5e10..924f846ba 100755 --- a/sml/plugin.yaml +++ b/sml/plugin.yaml @@ -7,7 +7,7 @@ plugin: en: 'Read data from powermeter device using SML protocol' maintainer: ohinckel tester: '?' # Who tests this plugin? - state: ready + state: deprecated # keywords: iot xyz documentation: http://smarthomeng.de/user/plugins_doc/config/sml.html # support: https://knx-user-forum.de/forum/supportforen/smarthome-py diff --git a/sml/tests/base.py b/sml/tests/base.py index 676ed3e6a..b5454f83f 100755 --- a/sml/tests/base.py +++ b/sml/tests/base.py @@ -63,6 +63,7 @@ def plugin(self): self.sh = MockSmartHome() plugin = Sml(self.sh) + plugin.alive = True plugin.connect() plugin.data = SmlPacketReader() plugin._serial = plugin.data diff --git a/solarforecast/__init__.py b/solarforecast/__init__.py index 53b8752b6..bb384cec6 100755 --- a/solarforecast/__init__.py +++ b/solarforecast/__init__.py @@ -32,7 +32,7 @@ class Solarforecast(SmartPlugin): - PLUGIN_VERSION = '1.9.2' + PLUGIN_VERSION = '1.9.3' def __init__(self, sh): """ @@ -53,8 +53,8 @@ def __init__(self, sh): self.longitude = self.get_parameter_value('longitude') else: self.logger.debug("__init__: latitude and longitude not provided, using shng system values instead.") - self.latitude = self.get_sh().lat - self.longitude = self.get_sh().lon + self.latitude = self.get_sh()._lat + self.longitude = self.get_sh()._lon self.declination = self.get_parameter_value('declination') self.azimuth = self.get_parameter_value('azimuth') diff --git a/solarforecast/plugin.yaml b/solarforecast/plugin.yaml index d4bcf7d26..1b4e48eff 100755 --- a/solarforecast/plugin.yaml +++ b/solarforecast/plugin.yaml @@ -12,7 +12,7 @@ plugin: # documentation: support: https://knx-user-forum.de/forum/supportforen/smarthome-py/1842817-support-thread-f%C3%BCr-das-solarforecast-plugin - version: 1.9.2 # Plugin version + version: 1.9.3 # Plugin version sh_minversion: 1.8.0 # minimum shNG version to use this plugin # sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest) multi_instance: True # plugin supports multi instance @@ -43,9 +43,11 @@ parameters: azimuth: type: num mandatory: True + valid_min: -180 + valid_max: 180 description: - de: 'Azimutwinkel der Panelausrichtung. 0 Grad entspricht Süden' - en: 'Azimuth angle of panel direction. 0 degree is equivalent to southern direction' + de: 'Azimutwinkel der Panelausrichtung (-180 bis 180 Grad). 0 Grad entspricht Süden' + en: 'Azimuth angle of panel direction (-180 to 180 degrees). 0 degree is equivalent to southern direction' kwp: type: num mandatory: True diff --git a/sonos/README.md b/sonos/README.md deleted file mode 100755 index a1e6e06ce..000000000 --- a/sonos/README.md +++ /dev/null @@ -1,822 +0,0 @@ -# Sonos - -## Overview - -[1. Requirements](#req) - -[2. Sonos Speaker UID](#uid) - -[3. SmarthomeNG Integration](#sh) - -[4. Item Structure](#struc) - -[5. Item Description](#desc) - -[6. SmartVISU Integration](#visu) - -[7. Best Practise](#best) - -## Requirements - -* SmarthomeNG v1.5 or newer -* Python3 libraries ```requests```, ```tinytag``` and ```xmltodict``` -* available ```ping``` executable on the host system -* tested on Sonos software 10.3 -* SoCo 0.22 (it will be necessary to update the Sonos software to ≥10.1) - -To install all necessary libraries for SmarthomeNG, you can run following bash command: - -```bash -sudo pip3 install -r /usr/local/smarthome/requirements/all.txt -``` - -Change the path ```/usr/local/smarthome``` to your SmarthomeNG base directory. - -For any questions, bug reports and feature requests, please post to the -[Sonos-Plugin thread](https://knx-user-forum.de/forum/supportforen/smarthome-py/25151-sonos-anbindung) in the -[KNX-User-Forum](https://knx-user-forum.de/). - -### Sonos Speaker UID -Before you can start, you have to find all UIDs of your Sonos Speaker in the network. Therefor you can use the -```search_uids.py``` script in the plugin folder. Execute the script on your console via: - -```python3 search_uids.py``` - -The output should be just about like this: -```bash - ---------------------------------------------------------- -rincon_000f448c3392a01411 - ip : 192.168.1.100 - speaker name : Wohnzimmer - speaker model: Sonos PLAY:1 - ---------------------------------------------------------- -rincon_c7e91735d19711411 - ip : 192.168.1.99 - speaker name : Kinderzimmer - speaker model: Sonos PLAY:3 ---------------------------------------------------------- -``` -The first line of each entry is our UID (rincon_xxxxxxxxxxxxxx) we were looking for. - -## Smarthome Integration - -Edit the file ```/usr/local/smarthome/etc/plugins.yaml``` (might differ) and add the following entry: -```yaml - -Sonos: - class_name: Sonos - class_path: plugins.sonos - # tts: true # optional, default: false - # local_webservice_path: /tmp/tts # optional, default: empty. If 'tts' is enabled, this option is mandatory. - # All tts files will be stored here. - # local_webservice_path_snippet: /tmp/snippet # optional, default: empty. For some reasons it could be necessary to have - # separated paths for TTS files and your own snippet files. You can define the - # local path for your snippets here. If 'tts' is enabled and - # 'local_webservice_path_snippet' is empty, the value for - # 'local_webservice_path' is used for your snippet audio files. - # webservice_ip: 192.168.1.40 # optional, default: automatic. You can set a specific ip address. - # If you're using a docker container, you have to set the host - # ip address here. - # webservice_port: 23500 # optional, default: 23500 - # discover_cycle: 180 # optional, default: 180 (in seconds) - # snippet_duration_offset: 0.4 # optional, default: 0.0 (in seconds) - # speaker_ips: # optional. You can set static IP addresses for your Sonos speaker. This - # - 192.168.1.10 # will disable auto-discovery. This is useful if you're using a - # - 192.168.1.77 # containerized environment with restricted network access. -``` - -After that you have to create an item configuration file under ```/usr/local/smarthome/items```, e.g. ```sonos.yaml```. -You can use the full-featured example configuration in the example sub folder. Just change the [Sonos UID](#uid) to your -needs.< - -### Item Structure -The first thing to mention is that you don't have to implement all items / functions for a speaker. Choose your -functionality and all the relevant items. To get the Sonos widget working you have at least to implement all items -marked with ```visu``` in the items description below. This list is updated if a new functionality is implemented in the -widget. - -Every item is described by one or more additional tags in the item description below: ```read```, ```write``` and -```visu```. These attributes indicates whether an item is readable and/or writeable. - -For a minimal functionality you have to set up an item with the attribute 'sonos_uid' and at least one child item. -Example: - -```yaml -MyRoom: - MySonos: - sonos_uid: rincon_xxxxxxxxxxxxxx - - play: - type: bool - sonos_recv: play - sonos_send: play -``` - -The level of the item with the attribute 'sonos_uid' doesn't matter, the below example is also possible. -Example: - -```yaml -MyRoom: - parent: - child: - ... - - child2: - ... - - child3: - MySonos: - sonos_uid: rincon_xxxxxxxxxxxxxx - - play: - type: bool - sonos_recv: play - sonos_send: play -``` - -You can multiple use the same Sonos speaker for your items. The only requirement for a Sonos item is the parent item -with the sonos uid. - -Example: -```yaml -Kitchen: - child1: - MySonos: - sonos_uid: rincon_xxxxxxxxxxxxxx - - play: - type: bool - sonos_recv: play - sonos_send: play - - child2: - MySonos2: - sonos_uid: rincon_xxxxxxxxxxxxxx - - play: - type: bool - sonos_recv: play - sonos_send: play - stop: - type: bool - sonos_recv: stop - sonos_send: stop -``` - -Last but not least you can rename the item name. This is not recommended due to the fact, that (only) the Sonos widget -depends on that names (of course you can edit the sonos.html to adapt the widget to your changes). - -Example: - -```yaml -MyRoom: - MySonos: - sonos_uid: rincon_xxxxxxxxxxxxxx - - my_awesome_mute_item_name: - type: bool - sonos_recv: mute - sonos_send: mute -``` - -### Item Description - -#### bass -```read``` ```write``` - -This item sets the bass level for a speaker. It must be an integer value between -10 and 10. This property is NOT a -group item, nevertheless you can set the child item ```group_command``` to 'True' to set the bass level to all members -of the group. This must be done before setting the bass item to a new value. This item is changed by Sonos events and -should always be up-to-date. - -#### coordinator -```read``` - -Returns the UID of the coordinator as a string. This is the uid of the current speaker if ```is_coordinator``` is -'True'. This item is changed by Sonos events and should always be up-to-date. - -#### cross_fade -```read``` ```write``` - -Sets / gets the cross-fade mode for a speaker. 'True' to set cross-fade to 'on' or 'False' for 'off'. This is a group -command and effects all speakers in the group. This item is changed by Sonos events and should always be up-to-date. - -#### current_track -```read``` - -Returns the current position in the playlist / queue of the played track. This item is changed by Sonos events and -should always be up-to-date. - -#### current_track_duration -```read``` - -Returns the current duration of track in format HH:mm:ss. This item is changed by Sonos events and should always -be up-to-date. - -#### current_transport_actions -```read``` ```visu``` - - -Returns the possible transport actions for the current track. Possible value are: Set, Stop, Pause, Play, -X_DLNA_SeekTime, Next, Previous, X_DLNA_SeekTrackNr. This item is changed by Sonos events and should always be -up-to-date. - -#### current_valid_play_modes -```read``` - -Returns all valid play mode options for the current track. The modes are delivered as string, delimited by a ','. -One of these modes can be passed to the 'play_mode' command. This item is changed by Sonos events and should always be -up-to-date. - -#### dialog_mode -```read``` ```write``` - -Only supported by Sonos Playbar. -Sets / gets the dialog mode for a Playbar. It must be 'True' to set the dialog mode to 'on' or 'False' for 'off'. -This item is changed by Sonos events and should always be up-to-date (this must be proofed). - -#### household_id -```read``` - -Returns the household id for the speaker. - -#### is_coordiantor -```read``` - -Bool value that indicates whether the current speaker is the coordinator of the group or not. 'True' if the speaker is -the coordinator, 'False' if not. This item is changed by Sonos events and should always be up-to-date. - -#### is_initialized -```read``` - -If 'True', this item indicates a fully initialized Sonos speaker. If 'False' the sepaker is either offline or not fully -initialized. Use this item to before starting logics or scenes. - -#### join -```write``` - -Joins a Sonos speaker to an existing group by passing any UID of a speaker that is member of this group. You should use -the additional SmarthomeNG attribute ```enforce_update: True```. - -#### load_sonos_playlist -```write``` - -Loads a Sonos playlist by its name. The item ```sonos_playlists``` shows all available playlists. This is a group -command can be executed on any speaker of a group. - -_child item_ ```start_after```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: start_after``` you can control the -behaviour after the playlist was loaded. If you set this item to ```True```, the speaker starts playing -immediately, ```False``` otherwise. (see example item configuration). You can omit this child item, the default -setting is 'False'. - -_child item_ ```clear_queue```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: clear_queue```, the Sonos queue will be -cleared before loading the new playlist if you set this item to ```True```, ```False``` otherwise. (see example item -configuration). You can omit this child item, the default setting is 'False'. - -_child item_ ```start_track```: -If you add an child item (type ```num```) with an attribute ```sonos_attrib: start_track```, you can define the track -to start play from. First item in the queue is 0. You can omit this child item, the default setting is 0. - -#### loudness -```read``` ```write``` - -Sets / gets the loudness for a speaker. It must be 'True' to set loudness to 'on' or 'False' for 'off'. This property -is NOT a group item, nevertheless you can set the child item ```group_command``` to 'True' to set the loudness to all -members of the group. This must be done before setting the loudness item to a new value. This item is changed by Sonos -events and should always be up-to-date. - -#### streamtype -```read``` ```visu``` - -Returns the current stream type. Possible values are 'music' (default, e.g. playing a Spotify track), 'radio', 'tv' (if -the audio output of a Sonos Playbar is set to TV), or 'line-in' (e.g Sonos Play5). This item is changed by Sonos events -and should always be up-to-date. - -#### mute -```read``` ```write``` ```visu``` - -Mutes or un-mutes a speaker. Must be a bool value. 'True' to mute, 'False' to un-mute the speaker. This is a group -command and effects all speakers in the group. This item is changed by Sonos events and should always be up-to-date. - -#### next -```write``` ```visu``` - -Go to the next track. 'True' for the next track, all other values have no effects. Be aware that you have to use the -additional SmarthomeNG attribute ```enforce_updates: true``` for this item to make it working. This is a group command -and effects all speakers in the group. - -#### night_mode -```read``` ```write``` - -Only supported by Sonos Playbar. -Sets / gets the night mode for a Playbar. It must be 'True' to set the night mode to 'on' or 'False' for 'off'. -This item is changed by Sonos events and should always be up-to-date (this must be proofed). - -#### number_of_tracks -```read``` - -Returns the total number of tracks in the queue. This item is changed by Sonos events and should always -be up-to-date. - -#### pause -```read``` ```write``` ```visu``` - -Pauses the playback. 'True' for pause, 'False' to start the playback. This is a group command and effects all -speakers in the group. This item is changed by Sonos events and should always be up-to-date. - -#### play -```read``` ```write``` ```visu``` - -Start playback. 'True' for play, 'False' to pause the playback. This is a group command and effects all -speakers in the group. This item is changed by Sonos events and should always be up-to-date. - -#### player_name -```read``` - -Returns the speaker name. This item is changed by Sonos events and should always be up-to-date. - -#### play_mode -```read``` ```write``` - -Sets / gets the play mode for a speaker. Allowed values are 'NORMAL', 'REPEAT_ALL', 'SHUFFLE', 'SHUFFLE_NOREPEAT', -'SHUFFLE_REPEAT_ONE', 'REPEAT_ONE'. This is a group command and effects all speakers in the group. This item is changed -by Sonos events and should always be up-to-date. - -#### play_snippet -```write``` - -Plays a snippet audio file by a given audio filename (e.g. 'alarm.mp3'). -You have to set at least two parameters in the ```plugin.yaml```: ```tts``` and the ```local_webservice_path``` to -enable this feature. You have to save the audio file to the value of parameter ```local_webservice_path``` or -```local_webservice_path_snippet```. Following audio formats should be supported: 'mp3', 'mp4', 'ogg', 'wav', 'aac' -(tested only with 'mp3'). This is a group command and effects all speakers in the group. - -_child item_ ```snippet_volume```: -If you add an child item (type ```num```) with an attribute ```sonos_attrib: snippet_volume``` you can set the volume -for the audio snippet. This does not affect the normal ```volume``` and will be resetted to the normal ```volume``` -level after the audio file was played. If a speaker group is in use, the volume level for each speaker is restored -separately. - -_child item_ ```snippet_fade_in```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: snippet_fade_in``` the normal ```volume``` -will be increased from 0 to the desired volume level after the audio file was played. - -#### play_tts -```write``` - -Sets a message which will be parsed by the Google TTS API. You have to set at least two parameters in the -```plugin.yaml```: ```tts``` and the ```local_webservice_path```. This is a group command and effects all speakers in -the group. - -_child item_ ```tts_language```: -If you add an child item (type ```str```) with an attribute ```sonos_attrib: tts_language``` you set the TTS language. -Valid values are 'en', 'de', 'es', 'fr', 'it'. You can omit this child item, the default setting is 'de'. - -_child item_ ```tts_volume```: -If you add an child item (type ```num```) with an attribute ```sonos_attrib: tts_volume``` you can set the volume for -the TTS message. This does not affect the normal ```volume``` and will be resetted to the normal ```volume``` level -after the TTS message was played. If a speaker group is in use, the volume level for each speaker is restored -separately. - -_child item_ ```tts_fade_in```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: tts_fade_in``` the normal ```volume``` -will be increased from 0 to the desired volume level after the TTS message was played. - -#### play_tunein -```write``` - -Plays a radio station by a give name. Keep in mind that Sonos searches for an appropiate radio station. If more than one -station was found, the first result will be used. This is a group command and effects all speakers in the group. - -_child item_ ```start_after```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: start_after``` you can control the behaviour -after the radio station was added to the Sonos speaker. If you set this item to ```True```, the speaker starts playing -immediately, ```False``` otherwise. (see example item configuration). You can omit this child item, the default -setting is 'True'. - -#### play_url -```write``` - -Plays a given url. - -_child item_ ```start_after```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: start_after``` you can control the behaviour -after the url was added to the Sonos speaker. If you set this item to ```True```, the speaker starts playing -immediately, ```False``` otherwise. (see example item configuration). You can omit this child item, the default -setting is 'True'. This is a group command and effects all speakers in the group. - -#### play_sharelink -```write``` - -Plays a given sharelink, e.g. a Spotify sharelink. You need a Spotify premium account to play links. The free account does not support sharelinks. - -_child item_ ```start_after```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: start_after``` you can control the behaviour -after the sharelink was added to the Sonos speaker. If you set this item to ```True```, the speaker starts playing -immediately, ```False``` otherwise. (see example item configuration). You can omit this child item, the default -setting is 'True'. This is a group command and effects all speakers in the group. - -#### previous -```write``` ```visu``` - -Go back to the previously played track. 'True' for previously played track, all other values have no effects. Be aware -that you have to use the additional SmarthomeNG attribute ```enforce_updates: true``` for this item to make it working. -This is a group command and effects all speakers in the group. - -#### radio_station -```read``` ```visu``` - -Returns the name of the currently played radio station. If no radio broadcast is currently played (see item -```streamtype```), the item is empty. This item is changed by Sonos events and should always be up-to-date. - -#### radio_show -```read``` ```visu``` - -If available (it dependson the radio station), this item returns the name of the currently played radio show. If no -radio broadcast is currently played (see item ```streamtype```), this item is always empty. This item is changed by -Sonos events and should always be up-to-date. - -#### snooze -```read``` ```write``` - -Sets / gets the snooze timer. It must be an integer between 0 - 86399 (in seconds). If this item is set to or is 0, the -snooze timer is deactivated. This is a group command and effects all speakers in the group. The value is NOT updated in -real-time. For each speaker discover cycle the item will be updated. - -#### sonos_playlists -```read``` ```visu``` - - -Returns a list of Sonos playlists. These playlists can be loaded by the ```load_sonos_playlist``` item. - -#### status_light -```read``` ```write``` - -Sets / gets the status light indicator of a speaker. 'True' to turn the light on, 'False' to turn it off. The value is -NOT updated in real-time. For each speaker discover cycle the item will be updated. - -#### buttons_enabled -```read``` ```write``` - -Sets / gets the state of the buttons/touch enabled feature of a speaker. 'True' to enable button/touch control, 'False' to disable it. The value is -NOT updated in real-time. For each speaker discover cycle the item will be updated. - - -#### stop -```read``` ```write``` ```visu``` - -Stops the playback. 'True' for stop, 'False' to start the playback. This is a group command and effects all -speakers in the group. This item is changed by Sonos events and should always be up-to-date. - -#### stream_content -```read``` ```visu``` - -Returns the content send by a radio station, e.g. the currently played track and artist. If no radio broadcast is -currently played (see item```streamtype```), the item is empty. This item is changed by Sonos events and should always -be up-to-date. - -#### switch_line_in -```write``` - -Switches the audio input of a Sonos Play5 (or all other speakers with a line-in) to line-in. 'True' to switch to -line-in, all other values have no effect. - -#### switch_tv -```write``` - -Switch the playbar speaker's input to TV. 'True' to switch to TV, all other values have no effect. Only supported by -Sonos Playbar. - -#### track_album -```read``` ```visu``` - -Returns the album title of currently played track. This item is changed by Sonos events and should always be up-to-date. - -#### track_album_art -```read``` ```visu``` - -Returns the album cover url of currently played track. This item is changed by Sonos events and should always be -up-to-date. - -#### track_artist -```read``` ```visu``` - -Returns the artist of the current track. This item is changed by Sonos events and should always be up-to-date. - -#### track_title -```read``` ```visu``` - -Returns the title of the current track. This item is changed by Sonos events and should always be up-to-date. - -#### track_uri -```read``` ```visu``` - -Returns the uri of currently played track. This item is changed by Sonos events and should always be up-to-date. - -#### treble -```read``` ```write``` - -Sets / gets the treble level for a speaker. It must be an integer value between -10 and 10. This property is NOT a -group item, nevertheless you can set the child item ```group_command``` to 'True' to set the bass level to all members -of the group. This must be done before setting the treble item to a new value. This item is changed by Sonos events and -should always be up-to-date. - -#### uid -```read``` - -Returns the UID of a Sonos speaker. - -#### unjoin -```write``` - -Unjoins a speaker from a group. - -_child item_ ```start_after```: -If you add an child item (type ```bool```) with an attribute ```sonos_attrib: start_after``` you can control the -behaviour after the speaker was unjoined from a group.. If you set this item to ```True```, the speaker starts playing -immediately, ```False``` otherwise. (see example item configuration). You can omit this child item, the default -setting is 'False'. - -#### volume -```read``` ```write``` ```visu``` - -Sets / gets the volume level of a speaker. Must be an integer between 0-100. This item is changed by Sonos events and -should always be up-to-date. It's recommend to set the attribute ```enforce_updates: true```. - -_child item_ ```group_command```: -If you add a child item with type of ```bool``` and an attribute ```sonos_attrib: group_command``` the volume will bet -set to all members of the current group. - -_child item_ ```max_volume```: -If you add a child item with type of ```num``` and an attribute ```sonos_attrib: max_volume``` the volume can only be -set to the given ```max_volume``` value. This does not effect the volume set by the Sonos app. If -```group_command``` was set to ```true``` the ```max_volume``` effects all speakers in the group. - -_child item_ ```volume_dpt3```: -Things get a little bit more complicated when you're trying to increase or decrease the volume level via a knx dpt3 -command. To make it easier and without logics, a child item ```volume_dpt3``` can be added to the volume item: - -```yaml -volume: - ... - ... - volume_dpt3: - type: list - sonos_attrib: vol_dpt3 - sonos_dpt3_step: 2 - sonos_dpt3_time: 1 - - helper: - sonos_attrib: dpt3_helper - type: num - sonos_send: volume -``` -Make sure you also add the shown helper item. You can change the fade steps [```sonos_dpt3_step```] and the time per -step in seconds ```[sonos_dpt3_time]```. Both values can be omitted. In this case the default values are: -```sonos_dpt3_step: 2``` and ```sonos_dpt3_step: 1```. The ```group_command``` and ```max_volume``` items will be -considered. - -#### zone_group_members -```read``` - -Returns a list of all UIDs of the group the speaker is a member in. The list contains always the current speaker. This -item is changed by Sonos events and should always be up-to-date. - -## SmartVISU Integration - -**This widget is only compatible with SmartVisu 2.9 or higher.** - -The Sonos Plugin fulfills all requirements for an automatic integration in SmartVISU via the **visu_websocket** and -**visu_smartvisu** plugins (for detailed information follow this -[link](https://github.com/smarthomeNG/smarthome/wiki/Visu_smartvisu_autogen_in_v1.2)). - -### Sonos widget via plugin - -To install / show the Sonos widget via the ```visu_smartvisu``` plugin, you have to [set up the mentioned plugin -properly](https://github.com/smarthomeNG/plugins/blob/develop/visu_smartvisu/README.md). After that you can define a -page item like that: -```yaml -MyPage: - name: Sonos - sv_page: room - sv_img: audio_audio.svg - - sonos: - name: Sonos Kitchen - visu_acl: rw - sv_blocksize: 1 # optional - sv_widget: "{{ sonos.player('sonos_kueche', 'MySonos.Kueche') }}" -``` -The important entry here is ```{{ sonos.player('sonos_kueche', 'MySonos.Kueche') }}```. The first value is a -self-defined unique identifier, the second value is the full path of the Sonos item which you want to control. If you -have more than one Sonos widget per page, make sure you set an **unique** identifier for each widget. - -### Manual setup -Copy the file ```widget_sonos.html``` from the ```sv_widget``` folder to your smartVISU directory, e.g. - -```bash -/var/www/smartvisu/pages/YOUR_PATH_HERE -``` - -Change to this directory and create two directories (if not exists) ```css``` and ```js```. -Copy ```widget_sonos.css``` to the css folder and ```widget_sonos.js``` to the js folder. - -Edit your page where you want to display the widget and add the following code snippet: - -```html -{% import "widget_sonos.html" as sonos %} -{% block content %} - -
-
-
- {{ sonos.player('sonos_kueche', 'Sonos.Kueche') }} -
-
-
- -{% endblock %} - -``` -Change the item to your needs. - - -## Best practice - -### Group commands -As you can see, some of the items have an additional child item "group_command". You can ommit this child item, then -the default value is always ```False```. If you set the```group_command``` item to ```True``` the value from the parent -item( e.g. ```volume```) will be set to all members of the speaker's group. To get all UIDs of a group you can check the -the item ```zone_group_members```. - -**Important**: Some of the items ​​always act as a group commands. Here is list of all relevant item: - -``` -play -pause -stop -mute -cross_fade -snooze -play_mode -next -previous -play_tunein -play_url -load_sonos_playlist -``` -For this items you don't have to pay attention to which speaker of the group you have to send the command. This is done -automatically and affects all speakers of the group. - -### Do not stress the discover functionality -You can define the parameter 'discover_cycle' on plugin start to set the interval how often the plugin searches for -new and / or offline speakers in the network. Due to the initialization of the speakers and network traffic, it is -not recommended to set the value less than 60 seconds. - -### Use the "is_initialized" item - -It takes some time to discover all Sonos speakers in the network. Use the "is_initialized" item for your logic. If true, -the speaker is fully functional. If this item is 'False' the speaker is not yet initialized or offline. - -Example - -```python -if sh.MySonosPlayer.is_initialized(): - do_something() -``` - -### "Non-realtime" items - -Some properties are not event-driver. That means they are not updated by the Sonos event system. These properties are: - -snooze -status_light - -These values are updated periodically with each speaker discovery cycle. - -### Yaml or "classical" item configuration -The plugin comes with an example in yaml format. This will be the preferable format for the SamrthomeNG item -configuration in the future. Feel free to change this example to the "classical" format. SmarthomeNG is -backwards compatible. - -This example shows a yaml config and the 'classic' pendant: -```yaml -MySonos: - Kueche: - sonos_uid: rincon_xxxxxxxxxxxxxx - - is_initialized: - type: bool - sonos_recv: is_initialized - - volume: - type: num - sonos_recv: volume - sonos_send: volume - - group_command: - type: bool - value: false - sonos_attrib: group - - play: - type: bool - sonos_recv: play - sonos_send: play - - ..... -``` -becomes -```yaml -[MySonos] - [[Kueche]] - sonos_uid = rincon_xxxxxxxxxxxxxx - - [[[is_initialized]]] - type =bool - sonos_recv = is_initialized - - [[[volume]] - type = num - sonos_recv = volume - sonos_send = volume - [[[[group_command]]]] - type = bool - value = false - sonos_attrib = group - - [[[play]]] - type = bool - sonos_recv = play - sonos_send = play - ..... -``` - -### DPT3 volume example - -```yaml - Kueche: - sonos_uid: rincon_000e58cxxxxxxxxx - - volume: - type: num - sonos_recv: volume - sonos_send: volume - enforce_updates: true - - group_command: - type: bool - value: false - sonos_attrib: group - - max_volume: - type: num - value: -1 - sonos_attrib: max_volume - - volume_dpt3: - type: list - sonos_attrib: vol_dpt3 - sonos_dpt3_step: 4 - sonos_dpt3_time: 1 - knx_dpt: 3 - knx_listen: 7/1/0 - - helper: - sonos_attrib: dpt3_helper - type: num - sonos_send: volume -``` -### TTS and Snippet functionality - -If you want to use either the ```play_tts``` or ```play_snippet``` functionality, you have to enable the ```tts``` -option for the Sonos plugin in your ```plugin.yaml```. In addition to that, you have to set a valid local path for the -```local_webservice_path``` option. If you want to separate your audio snippets from the automatic generated TTS audio -files, you have to set the ```local_webservice_path_snippet``` option. -A very simple Webservice will be started to serve Sonos requests. -In order to adapt the automatically calculated duration of audio snippets to different hardware, a fixed duration offset (in seconds) can be configured via the snippet_duration_offset option. - -### Configure Speaker IPs manually - -You can set the IP addresses of your speakers statically to avoid using the internal discover function. -This can be useful if you're using Docker or Rkt and you don't want to allow UDP and/or Multicast packets. -To do so, edit your ```etc/plugin.yaml``` and configure it like this: - -```yaml -Sonos: - class_name: Sonos - class_path: plugins.sonos - speaker_ips: - - 192.168.1.10 - - 192.168.1.77 -``` - -### Debug on error - -You've any trouble to get the plugin working, start SmarthomeNG in debug mode and post the logfile with the error to -the [**support thread**](https://knx-user-forum.de/forum/supportforen/smarthome-py/25151-sonos-anbindung) in the -KNX User Forum. diff --git a/sonos/requirements.txt b/sonos/requirements.txt index f7c65d069..bc00d90ab 100755 --- a/sonos/requirements.txt +++ b/sonos/requirements.txt @@ -6,4 +6,4 @@ gtts # These packages are used by SoCo: ifaddr appdirs -lxml \ No newline at end of file +lxml<=4.9.4 \ No newline at end of file diff --git a/sonos/user_doc.rst b/sonos/user_doc.rst index 02a043314..d0b846660 100755 --- a/sonos/user_doc.rst +++ b/sonos/user_doc.rst @@ -35,9 +35,9 @@ Unterstützte Geräte Es werden alle Sonos Lautsprecher mit Sonos Softwareversion > 10.1 unterstützt. -Offizielle Sonos Seite: ``https://www.sonos.com/`` +`Offizielle Sonos Seite `_ -Das Plugin basiert auf dem Sonos SoCo Github Projekt: ``https://github.com/SoCo/SoCo`` +Das Plugin basiert auf dem Sonos `SoCo Github Projekt `_ Konfiguration ============= @@ -45,7 +45,7 @@ Konfiguration Erste Schritte -------------- -Die Zuordnung der Items zu den Speakern erfolgt über eine eindeutige Speaker ID, auch UID genannt. +Die Zuordnung der Items zu den Speakern erfolgt über eine eindeutige Speaker ID, auch UID genannt. Diese können für Speaker im lokalen Netzwerk mittels des Python Skriptes ``search_uids.py`` ausgelesen werden. Dazu wird das Skript in der Konsole folgendermaßen ausgeführt: @@ -60,14 +60,14 @@ Die Aussgabe sieht dann so aus: --------------------------------------------------------- rincon_000f448c3392a01411 ip : 192.168.1.100 - speaker name : Wohnzimmer - speaker model: Sonos PLAY:1 + speaker name : Wohnzimmer + speaker model: Sonos PLAY:1 --------------------------------------------------------- rincon_c7e91735d19711411 ip : 192.168.1.99 - speaker name : Kinderzimmer - speaker model: Sonos PLAY:3 + speaker name : Kinderzimmer + speaker model: Sonos PLAY:3 --------------------------------------------------------- Die erste Zeile jedes Eintrags gibt die UID an (rincon_xxxxxxxxxxxxxx). @@ -98,8 +98,8 @@ Folgendermaßen werden Speaker statisch in der plugin.yaml konfiguriert: Sonos: class_name: Sonos class_path: plugins.sonos - speaker_ips: - - 192.168.1.10 + speaker_ips: + - 192.168.1.10 - 192.168.1.77 - 192.168.1.78 @@ -164,7 +164,7 @@ cross_fade Setzt bzw. liest den Cross-Fade Modus eines Speakers. Das Item ist vom Typ Boolean. `True` bedeutet Cross-Fade eingeschaltet, `False` ausgeschaltet. -Das Setzen ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Das Setzen ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. current_track @@ -194,15 +194,15 @@ current_valid_play_modes ``read`` Gibt alle validen Abspielmodi für den aktuellen Zustand zurück. Die Modi werden als String (mit Kommata getrennt) ausgegeben. -Einer der Modi kann dem ``play_mode`` Befehl übergeben werden. +Einer der Modi kann dem ``play_mode`` Befehl übergeben werden. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. dialog_mode ----------- ``read`` ``write`` -Nur unterstützt von Sonos Playbars. -Setzt bzw. liest den Dialog Modus einer Playbar. `True` bedeutet Dialog Modus ein, `False` Modus aus. +Nur unterstützt von Sonos Playbars. +Setzt bzw. liest den Dialog Modus einer Playbar. `True` bedeutet Dialog Modus ein, `False` Modus aus. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an (zu bestätigen). household_id @@ -224,7 +224,7 @@ is_initialized ``read`` Gibt den Status zurück, ob ein Speaker initialisiert und erreichbar ist. Das Item ist vom Typ Boolean. -`True` bedeutet, dass der Speaker initialisiert und erreichbar ist. Bei `False` ist der Speaker entweder offline oder nicht vollständig initialisiert. +`True` bedeutet, dass der Speaker initialisiert und erreichbar ist. Bei `False` ist der Speaker entweder offline oder nicht vollständig initialisiert. Nutze dieses Item in Logiken oder Szenen, bevor weitere Kommendos an den Speaker gesendet werden, siehe Beispiel 3). join @@ -239,9 +239,9 @@ load_sonos_playlist ------------------- ``write`` -Lädt eine Sonos playlist über ihren Namen. Die Funktion ``sonos_playlists`` zeigt alle verfügbaren Playlisten an. -Dies ist ein Gruppenbefehl, der auf jeden Speaker einer Gruppe angewandt werden kann. - +Lädt eine Sonos playlist über ihren Namen. Die Funktion ``sonos_playlists`` zeigt alle verfügbaren Playlisten an. +Dies ist ein Gruppenbefehl, der auf jeden Speaker einer Gruppe angewandt werden kann. + Unteritem ``start_after``: Wird ein untergeordnetes item vom Typ Boolean mit dem Attribut ``sonos_attrib: start_after`` angelegt, kann das Verhalten nach Laden der Playliste bestimmt werden. Wird das Item auf `True` gesetzt, startet der Speaker direkt die Wiedergabe. @@ -253,11 +253,11 @@ Wird ein untergeordnetes item vom Typ Boolean mit dem Attribut ``sonos_attrib: c `True` die bestehende Sonos Playlist gelöscht bevor die neue Playlist geladen wird. Bei Wert `False` bleibt die bestehende Liste erhalten und die Songs der neu zu ladenden Playliste werden angehängt. Wird dieses Item weggelassen, ist das Standardverhalten `False`. - + Unteritem ``start_track``: Wird ein untergeordnetes item vom Typ Number mit dem Attribut ``sonos_attrib: start_track`` angelegt, kann die Indexposition innerhalb der geladen Playliste definiert werden, von wo die Wiedergabe startet. Der erste Song in der Playliste entspricht der -Indexposition `0`. +Indexposition `0`. Wird dieses Item weggelassen, ist das Standardverhalten ein Start bei Indexposition `0`. loudness @@ -275,7 +275,7 @@ streamtype ``read`` ``visu`` Gibt den aktuellen Streamtyp zurück. Das Item ist vom Typ String. Mögliche Werte sind -`music` (Standard, z.B. beim Spielen eines Songs aus dem Netzwerk), `radio`, `tv` (falls der Audio Output einer Playbar +`music` (Standard, z.B. beim Spielen eines Songs aus dem Netzwerk), `radio`, `tv` (falls der Audio Output einer Playbar auf `TV` gesetzt ist, oder `line-in` (z.B. beim Sonos Play5). Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -285,7 +285,7 @@ mute Stellt einen Speaker auf lautlos. Das Item ist vom Typ Boolean. Der Wert `True` bedeutet lautlos (mute), `False` bedeutet laut (un-mute). -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. next @@ -295,7 +295,7 @@ next Wechselt zum nächsten Song der aktuellen Playliste. Das Item ist vom Typ Boolean. Der Wert `True` bedeutet Sprung zum nächsten Track. Ein Setzen auf `False` hat keinen Effekt. Zusätzlich muss für das Item das smarthomeNG item Attribut ``enforce_update: True`` gesetzt werden. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. night_mode ---------- @@ -317,7 +317,7 @@ pause ----- ``read`` ``write`` ``visu`` -Pausiert die Wiedergabe. Das Item ist vom Typ Boolean. Wert `True` bedeutet pausieren, `False` führt die Wiedergabe fort. +Pausiert die Wiedergabe. Das Item ist vom Typ Boolean. Wert `True` bedeutet pausieren, `False` führt die Wiedergabe fort. Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -325,7 +325,7 @@ play ---- ``read`` ``write`` ``visu`` -Startet die Wiedergabe. Das Item ist vom Typ Boolean. Der Wert `True` bedeutet Wiedergabe, `False` bedeutet pausieren. +Startet die Wiedergabe. Das Item ist vom Typ Boolean. Der Wert `True` bedeutet Wiedergabe, `False` bedeutet pausieren. Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -350,36 +350,36 @@ play_snippet ``write`` Spielt ein Audio Snippet über einen Audiodateinamen ab (z.B. `alarm.mp3`). Das Item ist vom Typ String. -Voraussetzung ist, dass in der ``plugin.yaml`` die Attribute ``tts`` und der ``local_webservice_path`` gesetzt sind. -Die Audiodatei muss in dem unter ``local_webservice_path`` oder ``local_webservice_path_snippet`` angegebenen Pfaden liegen. +Voraussetzung ist, dass in der ``plugin.yaml`` die Attribute ``tts`` und der ``local_webservice_path`` gesetzt sind. +Die Audiodatei muss in dem unter ``local_webservice_path`` oder ``local_webservice_path_snippet`` angegebenen Pfaden liegen. Folgende Dateiformate werden unterstützt: `mp3`, `mp4`, `ogg`, `wav`, `aac` (tested only with `mp3`). Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Unteritem ``snippet_volume``: -Wird ein untergeordnetes Item vom Typ Number mit Attribut ``sonos_attrib: snippet_volume`` definiert, +Wird ein untergeordnetes Item vom Typ Number mit Attribut ``sonos_attrib: snippet_volume`` definiert, kann die Laustärke explizit für das Abspielen von Snippets gesetzt werden. Diese Snippet Lautstärke beeinflusst nicht die Lautstärke der normalen Wiedergabe, auf die nach Abspielen des Snippets zurück gewechselt wird. -Wird ein Snippet in einer Gruppe abgespielt, wird für jeden einzelnen Speaker die ursprüngliche Lautstärke wiederhergestellt. +Wird ein Snippet in einer Gruppe abgespielt, wird für jeden einzelnen Speaker die ursprüngliche Lautstärke wiederhergestellt. Unteritem ``snippet_fade_in``: Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: snippet_fade_in`` definiert, wird die Lautstärke -nach dem Abspielen des Snippets von `0` auf das gewünschte Level schrittweise angehoben und eingeblendet. +nach dem Abspielen des Snippets von `0` auf das gewünschte Level schrittweise angehoben und eingeblendet. play_tts -------- ``write`` Spielt eine definierte Nachricht ab (Text-to-Speech). Das Item ist vom Typ String. Aus der Nachricht im String wird von dem Google TTS API eine -Audiodatei erzeugt, die lokal gespeichert und abgespielt wird. +Audiodatei erzeugt, die lokal gespeichert und abgespielt wird. Für die Nutzung dieses Features müssen mindestens zwei Parameter in der ``plugin.yaml`` gesetzt sein: ``tts`` und ``local_webservice_path``. Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Unteritem ``tts_language``: Wird ein untergeordnetes Item vom Typ String mit Attribut ``sonos_attrib: tts_language`` angelegt, kann die -Spracheinstellung der Google TTS API definiert werden. +Spracheinstellung der Google TTS API definiert werden. Gültige Werte sind `en`, `de`, `es`, `fr`, `it`. Ist das Item nicht vorhanden, wird die Standardeinstellung `de` verwendet. - + Unteritem ``tts_volume``: Wird ein untergeordnetes Item vom Typ Number mit Attribut ``sonos_attrib: tts_volume`` angelegt, kann die Lautstärke für das Abspielen von Text-to-Speech separat definiert werden. Die reguläre Lautstärke wird damit nicht beeinflusst. @@ -387,7 +387,7 @@ Nach der Ansage wird die Lautstärke jedes Speakers individuell in der Gruppe wi Unteritem ``tts_fade_in``: Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: tts_fade_in`` definiert, wird die Lautstärke -nach dem Abspielen der Nachricht von 0 auf das gewünschte Level schrittweise angehoben und eingeblendet. +nach dem Abspielen der Nachricht von 0 auf das gewünschte Level schrittweise angehoben und eingeblendet. play_sonos_radio / play_tunein ------------------------------ @@ -395,15 +395,15 @@ play_sonos_radio / play_tunein Spielt einen Radiosender anhand eines Namens. Das Item ist vom Typ String. Sonos sucht dazu in einer Datenbank nach potentiellen Radiostationen, die dem Namen entsprechen. -Wird mehr als ein zum Suchbegriff passender Radiosender gefunden, wird der erste Treffer verwendet. +Wird mehr als ein zum Suchbegriff passender Radiosender gefunden, wird der erste Treffer verwendet. Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Empfohlen wird die Nutzung der Funktion play_sonos_radio. -Die alte Funktion play_tunein existiert noch, sollte aber nicht mehr verwendet werden. +Die alte Funktion play_tunein existiert noch, sollte aber nicht mehr verwendet werden. Unteritem ``start_after``: -Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das +Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das Verhalten nach dem Laden der Radiostation definiert. Der Wert `True`, startet die Wiedergabe automatisch. Existiert das Unteritem nicht, ist die Standardeinstellung `True`. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. play_url -------- @@ -412,10 +412,10 @@ play_url Spielt eine gegebene URL. Das Item ist vom Typ String, in dem die URL übergeben wird. Unteritem ``start_after``: -Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das +Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das Verhalten nach dem Laden der URL definiert. Wurde der obige ``group_command`` auf `True` gesetzt, startet die Wiedergabe automatisch. Existiert das Unteritem nicht, ist die Standardeinstellung `True`. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. play_sharelink -------------- @@ -425,10 +425,10 @@ Spielt einen gegebenen Sharelink, z.B. einen Spotify Sharelink. In diesem Fall w kostenlose Account Sharelinks nicht unterstützt. Unteritem ``start_after``: -Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das +Wird ein untergeordnetes Item vom Typ Boolean mit Attribut ``sonos_attrib: start_after`` definiert, wird das Verhalten nach dem Laden des Sharelinks definiert. Wurde der obige ``group_command`` auf `True` gesetzt, startet die Wiedergabe automatisch. Existiert das Unteritem nicht, ist die Standardeinstellung `True`. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. previous -------- @@ -437,13 +437,13 @@ previous Setzt den aktuellen Track auf den Vorherigen zurück. Das Item ist vom Typ Boolean. Der Wert `True` triggert das Schalten auf den vorherigen Track, der Wert `False` hat keinen Effekt. Zusätzlich muss für das Item das smarthomeNG Item Attribut ``enforce_update: True`` gesetzt werden. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. radio_station ------------- ``read`` ``visu`` -Gibt den Namen des aktuellen Radiosenders zurück. +Gibt den Namen des aktuellen Radiosenders zurück. Das Item ist vom Typ String. Falls kein Radio gespielt wird, siehe ``streamtype``, ist das Item leer. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -451,7 +451,7 @@ radio_show ---------- ``read`` ``visu`` -Falls verfügbar (hängt von dem Radiosender ab), gibt dieses Item den Namen des aktuellen Programms zurück. +Falls verfügbar (hängt von dem Radiosender ab), gibt dieses Item den Namen des aktuellen Programms zurück. Das Item ist vom Typ String. Falls kein Radio gespielt wird, siehe ``streamtype``, ist das Item leer. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -461,9 +461,9 @@ snooze Setzt bzw. liest den Snooze Timer. Das Item ist vom Typ Number mit ganzzahligen Werten zwischen 0 - 86399 (in Sekunden). Der Wert `0` bedeutet, dass der Snooze Timer ausgeschaltet ist. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Der Wert wird **nicht** in Echtzeit aktualisiert, sondern in jedem Speaker Discovery Zyklus aktualisiert. - + sonos_playlists --------------- ``read`` ``visu`` @@ -492,7 +492,7 @@ stop ``read`` ``write`` ``visu`` Stoppt die Wiedergabe. Das Item ist vom Typ Boolean. Der Wert `True` steht für Stop, `False` für Wiedergabe starten. -Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. +Der Befehl ist ein Gruppenbefehl und wird für alle Speaker einer Gruppe angewendet. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. stream_content @@ -559,7 +559,7 @@ treble ``read`` ``write`` Setzt bzw. liest das Höhen Level eines Speakers. Das Item ist vom Typ Number und muss ein ganzzahligen Wert zwischen -10 and 10 enthalten. -Diese Eigenschaft ist **kein** Gruppenbefehl. Nichtsdestotrotz kann ein untergeordnetes Item ``group_command: True`` definiert werden, +Diese Eigenschaft ist **kein** Gruppenbefehl. Nichtsdestotrotz kann ein untergeordnetes Item ``group_command: True`` definiert werden, um die Höheneinstellung für alle Speaker innerhalb der Gruppe zu übernehmen. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. @@ -617,7 +617,7 @@ Liest die Liste der gespeicherten Sonos Favoriten. Das Item ist vom Typ List. Das Item wird über Sonos Events aktualisiert und zeigt daher immer den aktuellen Status an. favorite_radio_stations ---------------- +----------------------- ``read`` Liest die Liste der gespeicherten Tunein Favoriten. Das Item ist vom Typ List. @@ -662,28 +662,30 @@ Nicht echtzeitfähige Eigenschaften Einige Eigenschaften sind nicht Event basiert. Das bedeutet, dass sie nicht direkt nach Änderung über ein Event aktualisiert werden, sondern die Änderung erst bei der nächsten zyklischen Abfrage bei smarthomeNG ankommt. + Folgende Eigenschaften sind **nicht** Event basiert: - * snooze - * status_light + +- snooze +- status_light Gruppenbefehle -------------- Einige Items werden immer als Gruppenbefehl, d.h. auf alle Speaker innerhalb einer Gruppe ausgeführt. Folgende Methoden sind Gruppenbefehle: - - * play - * pause - * stop - * mute - * cross_fade - * snooze - * play_mode - * next - * previous - * play_tunein - * play_url - * load_sonos_playlist + +* play +* pause +* stop +* mute +* cross_fade +* snooze +* play_mode +* next +* previous +* play_tunein +* play_url +* load_sonos_playlist Für diese Items ist es egal, für welchen Speaker einer Gruppe diese Kommandos gesendet werden. Sie werden automatisch für alle Speaker einer Gruppe angewendet. @@ -728,7 +730,7 @@ Beispiel: do_something() 4a) Lautstärke inkrementell verstellen (via KNX dpt3) ----------------------------------------------------- +----------------------------------------------------- Dieses Beispiel zeigt die Verstellung der Laustärke inkrementell via dpt3: @@ -742,7 +744,7 @@ Dieses Beispiel zeigt die Verstellung der Laustärke inkrementell via dpt3: sonos_attrib: vol_dpt3 sonos_dpt3_step: 2 sonos_dpt3_time: 1 - + helper: sonos_attrib: dpt3_helper type: num @@ -802,7 +804,7 @@ Beispiel: MyRoom: MySonos: sonos_uid: rincon_xxxxxxxxxxxxxx - + play: type: bool sonos_recv: play @@ -825,7 +827,6 @@ Folgende Informationen können im Webinterface angezeigt werden: - Tab Speakers/Zones: Details zu den Speakern/Zones im Netzwerk u.a. UID - SmartVisu Widget ================ @@ -848,8 +849,3 @@ Sofern alle Sonos Items gemäß Beispiel Struct definiert worden sind, wird das {% endblock %} - - -Version History -=============== - diff --git a/stateengine/StateEngineAction.py b/stateengine/StateEngineAction.py index 9b2ae9a9e..36497db3e 100755 --- a/stateengine/StateEngineAction.py +++ b/stateengine/StateEngineAction.py @@ -1079,7 +1079,8 @@ def real_execute(self, state, actionname: str, namevar: str = "", repeat_text: s return source = self.set_source(current_condition, previous_condition, previousstate_condition) # Set to different value first ("force") - if self.__item() == value: + current_value = self.__item() + if current_value == value: if self.__item._type == 'bool': self._log_debug("{0}: Set '{1}' to '{2}' (Force)", actionname, self.__item.property.path, not value) self.__item(not value, caller=self._caller, source=source) @@ -1091,12 +1092,8 @@ def real_execute(self, state, actionname: str, namevar: str = "", repeat_text: s self._log_debug("{0}: Set '{1}' to '{2}' (Force)", actionname, self.__item.property.path, '-') self.__item('-', caller=self._caller, source=source) elif self.__item._type == 'num': - if value != 0: - self._log_debug("{0}: Set '{1}' to '{2}' (Force)", actionname, self.__item.property.path, 0) - self.__item(0, caller=self._caller, source=source) - else: - self._log_debug("{0}: Set '{1}' to '{2}' (Force)", actionname, self.__item.property.path, 1) - self.__item(1, caller=self._caller, source=source) + self._log_debug("{0}: Set '{1}' to '{2}' (Force)", actionname, self.__item.property.path, current_value+0.1) + self.__item(current_value+0.1, caller=self._caller, source=source) else: self._log_warning("{0}: Force not implemented for item type '{1}'", actionname, self.__item._type) else: diff --git a/viessmann/user_doc.rst b/viessmann/user_doc.rst index c9147d140..788e1932e 100755 --- a/viessmann/user_doc.rst +++ b/viessmann/user_doc.rst @@ -16,7 +16,7 @@ Das Viessmann-Plugin ermöglicht die Verbindung zu einer Viessmann-Heizung über Derzeit sind das P300- und das KW-Protokoll unterstützt. Weitere Gerätetypen, die diese Protokolle unterstützen, können einfach hinzugefügt werden. Für weitere Protokolle (z.B. GWG) wird zusätzliche Entwicklungsarbeit notwendig sein. Details zu den betroffenen Geräten und Protokollen finden sich im -.. _OpenV-Wiki: https://github.com/openv/openv/wiki/vcontrold +`OpenV Wiki `_ Dieses Plugin nutzt eine separate Datei ``commands.py``, in der die Definitionen für Protokolle, Gerätetypen und Befehlssätze enthalten sind. Neue Geräte können hinzugefügt werden, indem die entsprechenden Informationen in der ``commands.py`` ergänzt werden. @@ -25,15 +25,15 @@ Das Plugin unterstützt die serielle Kommunikation mit dem Lesekopf (ggf. über Zur Identifizierung des Heizungstyps kann das Plugin auch im Standalone-Modus betrieben werden (s.u.) Changelog ---------- +========= 1.2.2 -~~~~~ +----- - Funktion zum manuellen Schreiben von Werten hinzugefügt 1.2.0 -~~~~~ +----- - Komplette Überarbeitung von Code und Webinterface (AJAX) - Code refaktorisiert und besser strukturiert @@ -43,12 +43,12 @@ Changelog - Webinterface mit der Möglichkeit, Adressen manuell auszulesen 1.1.0 -~~~~~ +----- - Unterstützung für das KW-Protokoll 1.0.0 -~~~~~ +----- - Erste Version @@ -58,7 +58,7 @@ Anforderungen Das Plugin benötigt die ``pyserial``-Bibliothek und einen seriellen IR-Adapter. Unterstützte Geräte -------------------- +=================== Jede Viessmann-Heizung mit Optolink-Anschluss wird grundsätzlich unterstützt. @@ -77,7 +77,6 @@ Konfiguration Diese Plugin Parameter und die Informationen zur Item-spezifischen Konfiguration des Plugins sind unter :doc:`/plugins_doc/config/viessmann` beschrieben. - plugin.yaml ----------- @@ -98,44 +97,44 @@ Die Verknüfpung von SmartHomeNG-Items und Heizungsparametern ist vollständig f Die folgenden Attribute werden unterstützt: -viess\_read -~~~~~~~~~~~ +viess_read +~~~~~~~~~~ Der Wert des angegebenen Parameters wird gelesen und dem Item zugewiesen. -.. code:: yaml +.. code-block:: yaml item: viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1 -viess\_send -~~~~~~~~~~~ +viess_send +~~~~~~~~~~ Der angegebene Parameter wird bei Änderungen an diesem Item an die Heizung gesendet. -.. code:: yaml +.. code-block:: yaml item: viess_send: Raumtemperatur_Soll_Normalbetrieb_A1M1 Sofern das Item sowohl zum Lesen als auch zum Schreiben eines Parameters konfiguriert wird, kann die vereinfachte Konfiguration mit ``true`` erfolgen: -.. code:: yaml +.. code-block:: yaml item: viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1 viess_send: true -viess\_read\_afterwrite -~~~~~~~~~~~~~~~~~~~~~~~ +viess_read_afterwrite +~~~~~~~~~~~~~~~~~~~~~ Wenn dieses Attribut mit einer Dauer in Sekunden angegeben ist, wird nach eine Schreibvorgang die angegebene Anzahl an Sekunden gewartet und ein erneuter Lesevorgang ausgelöst. Damit dieses Attribut verwendet werden kann, muss das Item sowohl die Attribute ``viess_read`` als auch ``viess_send`` enthalten. -.. code:: yaml +.. code-block:: yaml item: viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1 @@ -143,33 +142,33 @@ Damit dieses Attribut verwendet werden kann, muss das Item sowohl die Attribute viess_read_afterwrite: 1 # seconds -viess\_read\_cycle -~~~~~~~~~~~~~~~~~~ +viess_read_cycle +~~~~~~~~~~~~~~~~ Mit einer Angabe in Sekunden wird ein periodisches Lesen angefordert. ``viess_read`` muss zusätzlich konfiguriert sein. -.. code:: yaml +.. code-block:: yaml item: viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1 viess_read_cycle: 3600 # every hour -viess\_init -~~~~~~~~~~~ +viess_init +~~~~~~~~~~ Wenn dieses Attribut vorhanden und auf ``true`` gesetzt ist, wird das Item nach dem Start von SmartHomeNG einmalig gelesen. ``viess_read`` muss zusätzlich konfiguriert sein. -.. code:: yaml +.. code-block:: yaml item: viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1 viess_init: true -viess\_trigger -~~~~~~~~~~~~~~ +viess_trigger +~~~~~~~~~~~~~ Enthält eine Liste von Parametern. Wenn dieses Item aktualisiert wird, wird ein Lesevorgang für jeden Eintrag in der Liste angestoßen. ``viess_send`` muss zusätzlich konfiguriert sein. @@ -177,7 +176,7 @@ Zwischen dem Schreibvorgang und den folgenden Lesevorgängen ist standardmäßig Beispiel: wenn der Betriebsmodus geändert wird, können neue Sollwerte für Raum- und Wassertemperaturen gelesen werden. -.. code:: yaml +.. code-block:: yaml item: viess_send: Betriebsart_A1M1 @@ -186,14 +185,14 @@ Beispiel: wenn der Betriebsmodus geändert wird, können neue Sollwerte für Rau - Wassertemperatur_Soll -viess\_trigger\_afterwrite -~~~~~~~~~~~~~~~~~~~~~~~~~~ +viess_trigger_afterwrite +~~~~~~~~~~~~~~~~~~~~~~~~ Wenn ein ``viess_trigger`` konfiguriert ist, kann mit diesem Attribut die Verzögerung zwischen Schreib- und Lesevorgang verändert werden. Standardmäßig beträgt diese Verzögerung 5 Sekunden. -.. code:: yaml +.. code-block:: yaml item: viess_send: Betriebsart_A1M1 @@ -203,41 +202,44 @@ Standardmäßig beträgt diese Verzögerung 5 Sekunden. viess_trigger_afterwrite: 10 # seconds -viess\_update -~~~~~~~~~~~~~ +viess_update +~~~~~~~~~~~~ + Das Zuweisen von ``true`` an ein Item mit diesem Attribut löst den Lesevorgang aller konfigurierter Items mit ``viess_read`` aus. Der in der Itemkonfiguration angegebene Wert wird nicht ausgewertet. -.. code:: yaml +.. code-block:: yaml item: viess_update: 'egal' -viess\_timer -~~~~~~~~~~~~ +viess_timer +~~~~~~~~~~~ + Das Item mit diesem Attribut übergibt als Attributwert den Namen einer Anwendung, z.B. Heizkreis_A1M1, und das Plugin gibt ein UZSU-formatiertes dict mit allen zugehörigen Timern der Heizung zurück Beim Schreiben wird das UZSU-dict in die einzelnen Tagestimer aufgeteilt und an die Heizung gesendet. -.. code:: yaml +.. code-block:: yaml item: viess_timer: 'Heizkreis_A1M1' -viess\_ba\_list -~~~~~~~~~~~~~~~ +viess_ba_list +~~~~~~~~~~~~~ + Das Item mit diesem Attribut erhält einmalig beim Start des Plugins die Liste der für den konfigurierten Heizungstyp gültigen Betriebsarten. Diese kann z.B. in SmartVISU wie folgt eingebunden werden: -.. code:: yaml +.. code-block:: yaml item: viess_ba_list: 'egal' -.. code:: +.. code-block:: html {{ basic.select('heizen_ba_item', 'heizung.betriebsart', 'menu', '', '', '', '', '', 'heizung.ba_list') }} @@ -250,7 +252,7 @@ Beispiel Here you can find a configuration sample using the commands for V200KO1B: -.. code:: yaml +.. code-block:: yaml viessmann: viessmann_update: @@ -379,38 +381,40 @@ V200KO1B: Funktionen ========== -update\_all\_read\_items() --------------------------- +update_all_read_items() +----------------------- Diese Funktion stößt den Lesevorgang aller konfigurierten Items mit ``viess_read``-Attribut an. -read\_addr(addr) ----------------- +read_addr(addr) +--------------- Diese Funktion löst das Lesen des Parameters mit der übergebenen Adresse ``addr`` aus. Die Adresse muss als vierstellige Hex-Zahl im String-Format übergeben werden. Es können nur Adressen ausgelesen werden, die im Befehlssatz für den aktiven Heizungstyp enthalten sind. Unabhängig von der Itemkonfiguration werden durch ``read_addr()`` keine Werte an Items zugewiesen. Der Rückgabewert ist das Ergebnis des Lesevorgangs oder None, wenn ein Fehler aufgetreten ist. -read\_temp\_addr(addr, length, unit) ------------------------------------- +read_temp_addr(addr, length, unit) +---------------------------------- Diese Funktion versucht, den Parameter an der Adresse ``addr`` zu lesen und einen Wert von ``length`` Bytes in die Einheit ``unit`` zu konvertieren. Die Adresse muss als vierstellige Hex-Zahl im String-Format übergeben werden, im Gegensatz zu ``read_addr()`` aber nicht im Befehlssatz definiert sein. ``length`` ist auf Werte zwischen 1 und 8 (Bytes) beschränkt. ``unit`` muss im aktuellen Befehlssatz definiert sein. Der Rückgabewert ist das Ergebnis des Lesevorgangs oder None, wenn ein Fehler aufgetreten ist. -write\_addr(addr, value) ------------------------- +write_addr(addr, value) +----------------------- Diese Funktion versucht, den Wert ``value`` an die angegebene Adresse zu schreiben. Die Adresse muss als vierstellige Hex-Zahl im String-Format übergeben werden. Es können nur Adressen beschrieben werden, die im Befehlssatz für den aktiven Heizungstyp enthalten sind. Durch ``write_addr`` werden Itemwerte nicht direkt geändert; wenn die geschriebenen Werte von der Heizung wieder ausgelesen werden (z.B. durch zyklisches Lesen), werden die geänderten Werte in die entsprechenden Items übernommen. +.. warning:: -:Warning: Das Schreiben von beliebigen Werten oder Werten, deren Bedeutung nicht klar ist, kann im Heizungsgerät möglicherweise unerwartete Folgen haben. Auch eine Beschädigung der Heizung ist nicht auszuschließen. + Das Schreiben von beliebigen Werten oder Werten, deren Bedeutung nicht klar ist, kann im Heizungsgerät möglicherweise unerwartete Folgen haben. Auch eine Beschädigung der Heizung ist nicht auszuschließen. +.. hint:: -:Note: Wenn eine der Plugin-Funktionen in einer Logik verwendet werden sollen, kann dies in der folgenden Form erfolgen: + Wenn eine der Plugin-Funktionen in einer Logik verwendet werden sollen, kann dies in der folgenden Form erfolgen: -.. code::yaml +.. code-block:: yaml result = sh.plugins.return_plugin('viessmann').read_temp_addr('00f8', 2, 'DT') @@ -440,4 +444,4 @@ Der serielle Port ist dabei die Gerätedatei bzw. der entsprechende Port, an dem Das optionale zweite Argument `-v` weist das Plugin an, zusätzliche Debug-Ausgaben zu erzeugen. Solange keine Probleme beim Aufruf auftreten, ist das nicht erforderlich. -Sollte die Datei sich nicht starten lassen, muss ggf. der Dateimodus angepasst werden. Mit ``chmod u+x __init__.py`` kann die z.B. unter Linux erfolgen. \ No newline at end of file +Sollte die Datei sich nicht starten lassen, muss ggf. der Dateimodus angepasst werden. Mit ``chmod u+x __init__.py`` kann die z.B. unter Linux erfolgen. diff --git a/withings_health/user_doc.rst b/withings_health/user_doc.rst index d4c3febdb..5cada8c16 100644 --- a/withings_health/user_doc.rst +++ b/withings_health/user_doc.rst @@ -13,7 +13,7 @@ withings_health :align: left Dieses Plugin ermöglicht den Abruf von Daten aus der Withings (ehemals Nokia) -`Health API (https://developer.withings.com/api)`_. Derzeit bietet es nur +`Health API `_. Derzeit bietet es nur Unterstützung für den "Withings WS-50 Smart Body Analyzer", eine WLAN-fähige Waage. @@ -22,9 +22,9 @@ Vorbereitung Dieses Plugin benötigt die withings-api. -Sie müssen sich unter `Withings Account (https://account.withings.com/)`_ registrieren und im Dashboard -eine Applikation anlegen. Der Name ist frei wählbar, die (lokale) Callback-URL wird über die Weboberfläche des Plugins angezeigt: :/plugin/withings_health. -Wenn Sie sich bei der `Withings App (https://app.withings.com/)`_ einloggen, kann die achtstellige Zahl +Sie müssen sich unter `Withings Account `_ registrieren und im Dashboard +eine Applikation anlegen. Der Name ist frei wählbar, die (lokale) Callback-URL wird über die Weboberfläche des Plugins angezeigt: http://:/plugin/withings_health. +Wenn Sie sich bei der `Withings App `_ einloggen, kann die achtstellige Zahl in der URL ausgelesen und in der Pluginkonfiguration als user_id angegeben werden. Weiters muss das Plugin struct mittles ``struct: withings_health.body`` eingebunden werden. diff --git a/xiaomi_vac/requirements.txt b/xiaomi_vac/requirements.txt index bf915d485..b32c8cb9d 100755 --- a/xiaomi_vac/requirements.txt +++ b/xiaomi_vac/requirements.txt @@ -1,2 +1,3 @@ +zeroconf<=0.52.0 python-miio==0.4.6;python_version<'3.6' python-miio>=0.4.7;python_version>='3.6' diff --git a/yamaha/requirements.txt b/yamaha/requirements.txt index e5fc25b92..441878685 100755 --- a/yamaha/requirements.txt +++ b/yamaha/requirements.txt @@ -1,2 +1 @@ -lxml -requests +lxml<=4.9.4 \ No newline at end of file diff --git a/zigbee2mqtt/__init__.py b/zigbee2mqtt/__init__.py index 78d353ad8..a5a63249d 100755 --- a/zigbee2mqtt/__init__.py +++ b/zigbee2mqtt/__init__.py @@ -61,9 +61,12 @@ def __init__(self, sh, **kwargs): self.z2m_base = self.get_parameter_value('base_topic').lower() self.cycle = self.get_parameter_value('poll_period') self.read_at_init = self.get_parameter_value('read_at_init') - self.bool_values = self.get_parameter_value('bool_values') self._z2m_gui = self.get_parameter_value('z2m_gui') + # bool_values is only good if used internally, because MQTT data is + # usually sent in JSON. So just make this easy... + self.bool_values = [False, True] + self._items_read = [] self._items_write = [] self._devices = {'bridge': {}} @@ -88,17 +91,17 @@ def __init__(self, sh, **kwargs): # Add subscription to get bridge announces bridge_subs = [ - ['devices', 'list', None], - ['state', 'dict', None], - ['info', 'dict', None], - ['log', 'dict', None], - ['extensions', 'list', None], - ['config', 'dict', None], - ['groups', 'list', None], - ['response', 'dict', None] + ['devices', 'list'], + ['state', 'str'], + ['info', 'dict'], + ['log', 'dict'], + ['extensions', 'list'], + ['config', 'dict'], + ['groups', 'list'], + ['response', 'dict'] ] - for attr, dtype, blist in bridge_subs: - self.add_z2m_subscription('bridge', attr, '', '', dtype, callback=self.on_mqtt_msg, bool_values=blist) + for attr, dtype in bridge_subs: + self.add_z2m_subscription('bridge', attr, '', '', dtype, callback=self.on_mqtt_msg) # Add subscription to get device announces self.add_z2m_subscription('+', '', '', '', 'dict', callback=self.on_mqtt_msg) @@ -526,7 +529,11 @@ def _handle_in_dev_bridge(self, device: str, topic_3: str = "", topic_4: str = " _bridge = self._devices[device] if topic_3 == 'state': - return {'online': bool(['offline', 'online'].index(payload.get(topic_3)))} + try: + data = json.loads(payload) + except json.JSONDecodeError: + data = {'state': payload} + return {'online': bool(['offline', 'online'].index(data.get(topic_3)))} elif topic_3 in ('config', 'info'): assert isinstance(payload, dict), 'dict' diff --git a/zigbee2mqtt/plugin.yaml b/zigbee2mqtt/plugin.yaml index 525a57dce..a7e05769e 100755 --- a/zigbee2mqtt/plugin.yaml +++ b/zigbee2mqtt/plugin.yaml @@ -52,19 +52,12 @@ parameters: de: Pfad zum Suspend-Item en: Path to suspend item - bool_values: - type: list - default: ['OFF', 'ON'] - description: - de: Plugin-weite Ersetzungwerte für bool-Werte - en: Plugin-wide substitution values for bool items - z2m_gui: type: str - default: '' + default: 'localhost:8080' description: - de: Host:Port des zigbee2mqtt-Web-GUI - en: host:port of the zigbee2mqtt-web-GUI + de: Web-Adresse des zigbee2mqtt-Web-GUI (Standard localhost:8080) + en: Web address of the zigbee2mqtt-web-GUI (default localhost:8080) item_attributes: # Definition of item attributes defined by this plugin (enter 'item_attributes: NONE', if section should be empty) @@ -95,8 +88,8 @@ item_attributes: z2m_bool_values: type: list description: - de: Ersetzungwerte für bool-Werte - en: substitution values for bool items + de: Ersetzungwerte für bool-Werte (z.B. ['OFF', 'ON']) + en: substitution values for bool items (e.g. ['OFF', 'ON']) item_structs: @@ -225,7 +218,7 @@ item_structs: z2m_attr: last_seen light_white_ambient: - struct: priv_z2m.light_white_ambient_group + struct: zigbee2mqtt.light_white_ambient_group linkquality: type: num @@ -253,7 +246,7 @@ item_structs: eval_trigger: .. light_rgb_group: - struct: priv_z2m.light_white_ambient_group + struct: zigbee2mqtt.light_white_ambient_group color: type: dict @@ -286,7 +279,7 @@ item_structs: z2m_attr: color_temp_startup light_rgb: - struct: priv_z2m.light_rgb_group + struct: zigbee2mqtt.light_rgb_group linkquality: type: num diff --git a/zigbee2mqtt/webif/templates/index.html b/zigbee2mqtt/webif/templates/index.html index 2eb3966ea..74d59e9e9 100755 --- a/zigbee2mqtt/webif/templates/index.html +++ b/zigbee2mqtt/webif/templates/index.html @@ -193,6 +193,7 @@ + @@ -205,6 +206,7 @@ {% for item in items %} {% set item_id = item.id() %} +
{{ _('Item') }} {{ _('Typ') }} {{ _('Wert') }}
{{ item.property.path }} {{ item.property.type }} {{ item()}}