diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9e2d76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pro.user +.crossbuilder* +*.qm diff --git a/debian/changelog b/debian/changelog index 7a2cd6f..c539ec5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -nymea-plugins (0.30.0) xenial; urgency=medium +nymea-plugins-genericthings (0.30.0) xenial; urgency=medium [ Michael Zanetti ] * ZigbeePhilipsHue: Use manufacturer specific remote commands diff --git a/debian/control b/debian/control index dcc88e6..a408178 100644 --- a/debian/control +++ b/debian/control @@ -1,1440 +1,141 @@ -Source: nymea-plugins +Source: nymea-plugins-genericthings Section: utils Priority: options Maintainer: Nymea GmbH Build-depends: libboblight-dev, debhelper (>= 0.0.0), libnymea-dev (>= 0.26~), - libnymea-mqtt-dev, - libnymea-gpio-dev (>= 1.0.5~), - libnymea-zigbee-dev, - libqt5serialport5-dev, - libqt5websockets5-dev, nymea-dev-tools:native, pkg-config, - python:any, qtbase5-dev, - qtconnectivity5-dev, - libow-dev, - libsodium-dev, - libudev-dev, - libhidapi-dev, Standards-Version: 3.9.3 -Package: nymea-plugin-anel +Package: nymea-plugin-generic-buttons +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends}, +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic buttons + This package contains the nymea integration plugin for buttons buttons + and switches. This can be used represent buttons (like remote controls) + in nymea which don't have a specific nymea plugin but can be connected + via other means, like input GPIOs or such. Also it contains a virtual + buttons to create buttons in nymea that don't actually reflect a physical + device and are used to trigger other logic such as rules, scenes or scripts + by pressing the button in the client application ui. + + +Package: nymea-plugin-generic-car Architecture: any Section: libs Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for ANEL Elektronik NET-PwrCtrl power sockets - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for ANEL Elektronik NET-PwrCtrl - network controlled power sockets. +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic cars + This package contains the nymea integration plugin for generic cars. -Package: nymea-plugin-aqi +Package: nymea-plugin-generic-energy Architecture: any Section: libs Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin to fetch the air quaility index from http://aqicn.org - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for the air quality index +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic energy related thins + This package contains the nymea integeration plugin for generic energy + related devices. They can be used to represent such energy related devices + in nymea when a particular device doesn't offer its own plugin but instead + provides data via some other channel to nymea. -Package: nymea-plugin-avahimonitor +Package: nymea-plugin-generic-garages Architecture: any Section: libs Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for avahimonitor - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for avahimonitor +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic garages + This package contains the nymea integration plugin for generic garages. + They can be used to connect represent various garages in nymea when + a particular garage doesn't offer its own nymea plugin but instead can + be controlled via other means, like GPIOs or other types of relays. -Package: nymea-plugin-awattar +Package: nymea-plugin-generic-heatingcooling Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for awattar - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for awattar +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for geeric heating and cooling devices + This package contains the nymea integration plugin for generic heating and + cooling devices. They can be used to represent such devices in nymea when + a particular device doesn't offer its own plugin but instead can be controlled + via other means, like GPIOs or other types of relays. -Package: nymea-plugin-bluos +Package: nymea-plugin-generic-irrigation Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for bluos - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for bluos +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic irrigation systems + This package contains the nymea integration plugin for generic irrigation + systems. They can be used to represent such devices in nymea when a particular + device doesn't offer its own plugin but instead can be controlled via other + means, like GPIOs or other types of relays. -Package: nymea-plugin-boblight +Package: nymea-plugin-generic-sensors Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for boblight - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for boblight. Boblight allows - controlling LEDs via home-brew controllers. See https://github.com/arvydas/boblight - for informations on boblight. +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic sensors + This package contains the nymea integration plugin for generic sensors. + They can be used to represent such sensors in nymea when a particular + device doesn't offer its own plugin but instead provides data via some + other channel to nymea, like analog input GPIOs or MQTT. -Package: nymea-plugin-bose +Package: nymea-plugin-generic-shading Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for bose soundtouch - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for bose soundtouch. +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for generic shading devices + This package contains the nymea integration plugin for generic shading devices. + They can be used to represent such devices in nymea when a particular device + doesn't offer its own plugin instead can be controller via other means, + like GPIOs or other types of relays. -Package: nymea-plugin-coinmarketcap +Package: nymea-plugin-generic-thing Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for coin market cap - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for coinmarketcap +Conflicts: nymea-plugin-genericthings +Description: nymea integration plugin for a generic thing + This package contains the nymea integration plugin for all generic thing. + This can be used to represent various data for devices or services that + don't fit any of the known device/service types. -Package: nymea-plugin-commandlauncher +Package: nymea-plugins-genericthings Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for commandlauncher - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for commandlauncher + nymea-plugin-generic-buttons, + nymea-plugin-generic-car, + nymea-plugin-generic-energy, + nymea-plugin-generic-garages, + nymea-plugin-generic-heatingcooling, + nymea-plugin-generic-irrigation, + nymea-plugin-generic-sensors, + nymea-plugin-generic-shading, + nymea-plugin-generic-thing, +Replaces: nymea-plugin-genericthings +Conflicts: nymea-plugin-genericthings +Description: meta package for nymeas generic things plugins + This package will install all generic things plugins - -Package: nymea-plugin-datetime -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for datetime - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for datetime - - -Package: nymea-plugin-daylightsensor -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for a mathematical daylight sensor - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install a plugin for a mathematical daylight sensor. That means - it will work without any internet connection or hardware. It computes daylight - times based on the geographical location of the nymea instance. - - -Package: nymea-plugin-denon -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for denon - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for denon - - -Package: nymea-plugin-dht -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, - python3-pip, -Description: nymea.io plugin for DHT11/DHT22/AM2302 - This plugin add support for the DHT11, DHT22 and AM2302 temperature and humidity - sensors to nymea. - - -Package: nymea-plugin-doorbird -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for DoorBird - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for DoorBird - - -Package: nymea-plugin-dweetio -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for dweet.io - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for dweet.io - - -Package: nymea-plugin-dynatrace -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for dynatrace - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for dynatrace - - -Package: nymea-plugin-elgato -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for elgato - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for elgato - - -Package: nymea-plugin-fastcom -Architecture: any -Depends: ${misc:Depends}, - nymea-plugins-translations, - python3-pip, -Description: nymea.io plugin for fast.com based internet speed test - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for performing ineternet speed - tests using fast.com - - -Package: nymea-plugin-flowercare -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Xiaomi Flower care devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Xiaomi Flower care devices, - also know as Plant care or MiCare - - -Package: nymea-plugin-fronius -Architecture: any -Section: libs -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Fronius PV inverters - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Fronius - - -Package: nymea-plugin-eq-3 -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for eq-3 - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for eq-3 - - -Package: nymea-plugin-garadget -Architecture: any -Multi-Arch: same -Section: libs -Depends: ${shlibs:Depends}, - ${misc:Depends}, -Description: nymea.io plugin for Garadget - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Garadget Garage Door Opener - - -Package: nymea-plugin-genericelements -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for genericelements - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for genericelements - - -Package: nymea-plugin-genericthings -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Replaces: nymea-plugin-genericinterfaces -Conflicts: nymea-plugin-genericinterfaces -Description: nymea.io plugin for generic things - Use the generic things plugin to create visually appealing thing setups - containing lights, shutter, sensors etc which are connected to GPIOs. - . - This package will install the nymea.io plugin for genericthings - - -Package: nymea-plugin-gpio -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-gpio, - nymea-plugins-translations, -Description: nymea.io plugin for gpio - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for gpio - - -Package: nymea-plugin-goecharger -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for the go-eCharger wallbox - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for the go-eCharger wallbox - - -Package: nymea-plugin-homeconnect -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for home connect - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for home connect appliances - - -Package: nymea-plugin-i2cdevices -Architecture: any -Section: libs -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for I2C devies - This plugin adds support for I2C devices to nymea. - Currently supported devices are the ADS1114/1114/1115 and the Pi-16ADC. - . - This package will install the nymea.io plugin for AD converters - - -Package: nymea-plugin-kodi -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for kodi - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for kodi - - -Package: nymea-plugin-lgsmarttv -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for lgsmarttv - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for lgsmarttv - - -Package: nymea-plugin-lifx -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for lifx - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for lifx - -Package: nymea-plugin-mecelectronics -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for mec electronics devices - This package will add support for the mec meter to nymea. - - -Package: nymea-plugin-mailnotification -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for mailnotification - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for mailnotification - - -Package: nymea-plugin-mcp3008 -Architecture: any -Depends: ${misc:Depends}, - nymea-plugins-translations, - python3-pip, -Description: MCP3008 DAC integration plugin for nymea - This package will install the nymea.io plugin for using the MCP3008 DAC. - - -Package: nymea-plugin-mqttclient -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for a generic MQTT client - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install a generic MQTT client plugin for nymea.io - - -Package: nymea-plugin-mystrom -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for myStrom devices - This package will add support for myStrom devices to nymea. - - -Package: nymea-plugin-neatobotvac -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, - python3-pip, -Description: nymea.io plugin for neato - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Neato Botvac robots. - - -Package: nymea-plugin-netatmo -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for netatmo - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for netatmo - - -Package: nymea-plugin-nanoleaf -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for nanoleaf - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for nanoleaf - - -Package: nymea-plugin-networkdetector -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nmap, - fping, - arping, - nymea-plugins-translations, -Description: nymea.io plugin for networkdetector - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for networkdetector - - -Package: nymea-plugin-nuki -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Replaces: nymea-nukiplugin -Description: nymea.io plugin for the nuki smart lock - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for nuki devices - - -Package: nymea-plugin-onewire -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for one wire devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for one wire devices - - -Package: nymea-plugin-openuv -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for OpenUV - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for OpenUV - - -Package: nymea-plugin-openweathermap -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for openweathermap - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for openweathermap - - -Package: nymea-plugin-osdomotics -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for osdomotics - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for osdomotics - - -Package: nymea-plugin-philipshue -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for philipshue - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for philipshue - - -Package: nymea-plugin-pushbullet -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Pushbullet - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for sending messages via Pushbullet. - - -Package: nymea-plugin-pushnotifications -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin to send Push notifications - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for sending messages via GCM, APNs and UBPorts - - -Package: nymea-plugin-solarlog -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Solar-Log - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Solar-Log. - - -Package: nymea-plugin-tasmota -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Sonoff-Tasmota devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Tasmota-Sonoff devices - -Package: nymea-plugin-texasinstruments -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Texas Instruments devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Texas Instruments devices - - -Package: nymea-plugin-telegram -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Telegram - This plugin allows nymea to send messages to telegram via the bot API. - - -Package: nymea-plugin-tempo -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Tempo time tracking - This package will install the nymea.io plugin for Tempo time tracking. - - -Package: nymea-plugin-tplink -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for tp-link Kasa devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for tp-link Kasa devices - - -Package: nymea-plugin-tuya -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Tuya cloud devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Tuya cloud devices - - -Package: nymea-plugin-udpcommander -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for UDP commander - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for udpcommander - - -Package: nymea-plugin-unifi -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for UniFi network controllers - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for UniFi network controllers - - -Package: nymea-plugin-usbrelay -Architecture: any -Multi-Arch: same -Section: libs -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libudev1, - libhidapi-hidraw0, -Description: nymea.io plugin for USB relay - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for USB relay - - -Package: nymea-plugin-wakeonlan -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for wakeonlan - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for wakeonlan - - -Package: nymea-plugin-wemo -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for wemo - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for wemo - - -Package: nymea-plugin-ws2812fx -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for ws2812fx - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for ws2812fx - - -Package: nymea-plugin-tcpcommander -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for TCP commander - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for the TCP commander - -Package: nymea-plugin-httpcommander -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for HTTP commander - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for the HTPP commander - - -Package: nymea-plugin-senic -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for senic - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for senic - - -Package: nymea-plugin-sgready -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-gpio, - nymea-plugins-translations, -Description: nymea.io plugin for SG-Ready heat pump interface based on GPIOs - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for SG-Ready heat pump interface based on GPIOs - - -Package: nymea-plugin-shelly -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Shelly devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Shelly devices - - -Package: nymea-plugin-simpleheatpump -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-gpio, - nymea-plugins-translations, -Description: nymea.io plugin for simple heat pumps - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for simple heat pumps - - -Package: nymea-plugin-somfytahoma -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Somfy TaHoma - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Somfy TaHoma devices - - -Package: nymea-plugin-sonos -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Sonos smart speakers - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Sonos smart speakers - - -Package: nymea-plugin-sunposition -Architecture: any -Depends: ${misc:Depends}, - libatlas-base-dev, - python3-pip, - nymea-plugins-translations, -Description: nymea.io plugin for calculating the sun position - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for calculating the sun position - - -Package: nymea-plugin-keba -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, - nmap, - arping, -Description: nymea.io plugin for keba - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for keba - - -Package: nymea-plugin-reversessh -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - sshpass, - nymea-plugins-translations, -Recommends: openssh-server -Replaces: nymea-plugin-remotessh -Conflicts: nymea-plugin-remotessh -Description: nymea.io plugin to configure remotessh for your nymea:core - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for remote ssh connections - - -Package: nymea-plugin-serialportcommander -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libqt5serialport5, - nymea-plugins-translations, -Description: nymea.io plugin to send and receive strings over a serial port - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for serial ports - - -Package: nymea-plugin-sma -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for SMA PV-Inverter - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for SMA PV-Inverter - - -Package: nymea-plugin-systemmonitor -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin to monitor the system - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for system monitoring - - -Package: nymea-plugin-tado -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin to connect to your Tado account - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Tado - - -Package: nymea-plugin-wheretheissat -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin to monitor the ISS position - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for wheretheiss.at - - -Package: nymea-plugin-yamahaavr -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, - python3-pip, -Description: nymea.io plugin for Yamaha receivers - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for (non-Musiccast) Yamaha AV receivers. - - -Package: nymea-plugin-zigbee-develco -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for develco things - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Develco - - -Package: nymea-plugin-zigbee-generic -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for different generic recognizable devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for generic recognizable zigbee devices - - -Package: nymea-plugin-zigbee-generic-lights -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for different generic recognizable lights - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for generic recognizable lights - - -Package: nymea-plugin-zigbee-lumi -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for lumi/aquara/xiaomi things - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Lumi - - -Package: nymea-plugin-zigbee-philipshue -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for Philips Hue devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Philips Hue zigbee devices - - -Package: nymea-plugin-zigbee-remotes -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io plugin for various zigbee remote controls. - - -Package: nymea-plugin-zigbee-tradfri -Architecture: any -Depends: ${shlibs:Depends}, - ${misc:Depends}, - libnymea-zigbee1, - nymea-plugins-translations, -Description: nymea.io zigbee plugin for Ikea TRADRFI devices - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Ikea TRADFRI zigbee devices - - -Package: nymea-plugins-translations -Section: misc -Architecture: all -Depends: ${misc:Depends} -Description: Translation files for nymea plugins - translations - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package provides the translation files for all nymea plugins. - - -Package: nymea-plugins -Section: libs -Architecture: all -Depends: nymea-plugin-anel, - nymea-plugin-aqi, - nymea-plugin-awattar, - nymea-plugin-bose, - nymea-plugin-datetime, - nymea-plugin-daylightsensor, - nymea-plugin-denon, - nymea-plugin-doorbird, - nymea-plugin-eq-3, - nymea-plugin-flowercare, - nymea-plugin-fronius, - nymea-plugin-genericthings, - nymea-plugin-homeconnect, - nymea-plugin-kodi, - nymea-plugin-lgsmarttv, - nymea-plugin-lifx, - nymea-plugin-mailnotification, - nymea-plugin-texasinstruments, - nymea-plugin-telegram, - nymea-plugin-mystrom, - nymea-plugin-nanoleaf, - nymea-plugin-neatobotvac, - nymea-plugin-netatmo, - nymea-plugin-networkdetector, - nymea-plugin-nuki, - nymea-plugin-openuv, - nymea-plugin-openweathermap, - nymea-plugin-philipshue, - nymea-plugin-pushbullet, - nymea-plugin-pushnotifications, - nymea-plugin-wakeonlan, - nymea-plugin-tasmota, - nymea-plugin-tempo, - nymea-plugin-tplink, - nymea-plugin-wemo, - nymea-plugin-elgato, - nymea-plugin-shelly, - nymea-plugin-senic, - nymea-plugin-somfytahoma, - nymea-plugin-sma, - nymea-plugin-sonos, - nymea-plugin-solarlog, - nymea-plugin-tado, - nymea-plugin-keba, - nymea-plugin-unifi, - nymea-plugin-usbrelay, - nymea-plugin-yamahaavr, - nymea-plugins-zigbee, -Description: Plugins for nymea IoT server - the default plugin collection - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the default nymea plugins. - -Package: nymea-plugins-zigbee -Section: libs -Architecture: all -Depends: nymea-plugin-zigbee-develco, - nymea-plugin-zigbee-lumi, - nymea-plugin-zigbee-generic, - nymea-plugin-zigbee-generic-lights, - nymea-plugin-zigbee-philipshue, - nymea-plugin-zigbee-tradfri -Description: Zigbee plugins for nymea IoT server - meta package for all zigbee replated plugins - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install all nymea zigbee related plugins. - - -Package: nymea-plugins-maker -Section: libs -Architecture: all -Depends: nymea-plugin-boblight, - nymea-plugin-commandlauncher, - nymea-plugin-udpcommander, - nymea-plugin-tcpcommander, - nymea-plugin-httpcommander, - nymea-plugin-avahimonitor, - nymea-plugin-anel, - nymea-plugin-gpio, - nymea-plugin-sgready, - nymea-plugin-i2cdevices, - nymea-plugin-mqttclient, - nymea-plugin-mcp3008, - nymea-plugin-remotessh, - nymea-plugin-serialportcommander, - nymea-plugin-systemmonitor, - nymea-plugin-simpleheatpump, - nymea-plugin-onewire, - nymea-plugin-dynatrace, -Description: Meta package for nymea makers, tinkerers and hackers plugins. - This package is a meta package that pulls in useful nymea plugins for makers. - Such plugins allow tinkering with GPIOs, I2C, One-Wire, raw MQTT and more. - . - This package will install nymea plugins for makers, tinkerers and hackers. - - -Package: nymea-plugins-merkurboard -Section: libs -Architecture: all -Depends: nymea-plugin-osdomotics, -Description: Plugins for nymea IoT server - Meta package for 6LoWPAN Merkur boards - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the 6LoWPAN Merkur board plugins for nymea. - - -Package: nymea-plugins-all -Section: libs -Architecture: all -Depends: nymea-plugins, - nymea-plugins-maker, - nymea-plugins-merkurboard, -Description: Plugins for nymea IoT server - Meta package for all plugins - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install all the available plugins for nymea. diff --git a/debian/nymea-plugin-anel.install.in b/debian/nymea-plugin-anel.install.in deleted file mode 100644 index c8b52d8..0000000 --- a/debian/nymea-plugin-anel.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginanel.so diff --git a/debian/nymea-plugin-aqi.install.in b/debian/nymea-plugin-aqi.install.in deleted file mode 100644 index e2bd73f..0000000 --- a/debian/nymea-plugin-aqi.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginaqi.so diff --git a/debian/nymea-plugin-avahimonitor.install.in b/debian/nymea-plugin-avahimonitor.install.in deleted file mode 100644 index a408b0d..0000000 --- a/debian/nymea-plugin-avahimonitor.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginavahimonitor.so \ No newline at end of file diff --git a/debian/nymea-plugin-awattar.install.in b/debian/nymea-plugin-awattar.install.in deleted file mode 100644 index 3302c8b..0000000 --- a/debian/nymea-plugin-awattar.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginawattar.so \ No newline at end of file diff --git a/debian/nymea-plugin-bluos.install.in b/debian/nymea-plugin-bluos.install.in deleted file mode 100644 index f0a17ed..0000000 --- a/debian/nymea-plugin-bluos.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginbluos.so diff --git a/debian/nymea-plugin-boblight.install.in b/debian/nymea-plugin-boblight.install.in deleted file mode 100644 index 271ef3a..0000000 --- a/debian/nymea-plugin-boblight.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginboblight.so diff --git a/debian/nymea-plugin-bose.install.in b/debian/nymea-plugin-bose.install.in deleted file mode 100644 index adb6201..0000000 --- a/debian/nymea-plugin-bose.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginbose.so diff --git a/debian/nymea-plugin-coinmarketcap.install.in b/debian/nymea-plugin-coinmarketcap.install.in deleted file mode 100644 index 6d5d7ba..0000000 --- a/debian/nymea-plugin-coinmarketcap.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugincoinmarketcap.so diff --git a/debian/nymea-plugin-commandlauncher.install.in b/debian/nymea-plugin-commandlauncher.install.in deleted file mode 100644 index 7cd317f..0000000 --- a/debian/nymea-plugin-commandlauncher.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugincommandlauncher.so \ No newline at end of file diff --git a/debian/nymea-plugin-datetime.install.in b/debian/nymea-plugin-datetime.install.in deleted file mode 100644 index 2331c6d..0000000 --- a/debian/nymea-plugin-datetime.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindatetime.so \ No newline at end of file diff --git a/debian/nymea-plugin-daylightsensor.install.in b/debian/nymea-plugin-daylightsensor.install.in deleted file mode 100644 index d9df0e2..0000000 --- a/debian/nymea-plugin-daylightsensor.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindaylightsensor.so diff --git a/debian/nymea-plugin-denon.install.in b/debian/nymea-plugin-denon.install.in deleted file mode 100644 index 85fdce7..0000000 --- a/debian/nymea-plugin-denon.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindenon.so \ No newline at end of file diff --git a/debian/nymea-plugin-dht.install.in b/debian/nymea-plugin-dht.install.in deleted file mode 100644 index e0d1406..0000000 --- a/debian/nymea-plugin-dht.install.in +++ /dev/null @@ -1,3 +0,0 @@ -dht/integrationplugindht.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/dht/ -dht/integrationplugindht.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/dht/ -dht/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/dht/ diff --git a/debian/nymea-plugin-doorbird.install.in b/debian/nymea-plugin-doorbird.install.in deleted file mode 100644 index 47568ef..0000000 --- a/debian/nymea-plugin-doorbird.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindoorbird.so diff --git a/debian/nymea-plugin-dweetio.install.in b/debian/nymea-plugin-dweetio.install.in deleted file mode 100644 index 7b7c66d..0000000 --- a/debian/nymea-plugin-dweetio.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindweetio.so diff --git a/debian/nymea-plugin-dynatrace.install.in b/debian/nymea-plugin-dynatrace.install.in deleted file mode 100644 index 428b30a..0000000 --- a/debian/nymea-plugin-dynatrace.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugindynatrace.so diff --git a/debian/nymea-plugin-elgato.install.in b/debian/nymea-plugin-elgato.install.in deleted file mode 100644 index 4f86a00..0000000 --- a/debian/nymea-plugin-elgato.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginelgato.so diff --git a/debian/nymea-plugin-eq-3.install.in b/debian/nymea-plugin-eq-3.install.in deleted file mode 100644 index 3cb31b7..0000000 --- a/debian/nymea-plugin-eq-3.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugineq-3.so diff --git a/debian/nymea-plugin-fastcom.install.in b/debian/nymea-plugin-fastcom.install.in deleted file mode 100644 index f5a308b..0000000 --- a/debian/nymea-plugin-fastcom.install.in +++ /dev/null @@ -1,3 +0,0 @@ -fastcom/integrationpluginfastcom.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/fastcom/ -fastcom/integrationpluginfastcom.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/fastcom/ -fastcom/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/fastcom/ diff --git a/debian/nymea-plugin-flowercare.install.in b/debian/nymea-plugin-flowercare.install.in deleted file mode 100644 index d64218e..0000000 --- a/debian/nymea-plugin-flowercare.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginflowercare.so diff --git a/debian/nymea-plugin-fronius.install.in b/debian/nymea-plugin-fronius.install.in deleted file mode 100644 index 1b72531..0000000 --- a/debian/nymea-plugin-fronius.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginfronius.so diff --git a/debian/nymea-plugin-garadget.install.in b/debian/nymea-plugin-garadget.install.in deleted file mode 100644 index 620d438..0000000 --- a/debian/nymea-plugin-garadget.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingaradget.so diff --git a/debian/nymea-plugin-generic-buttons.install.in b/debian/nymea-plugin-generic-buttons.install.in new file mode 100644 index 0000000..25a0f6f --- /dev/null +++ b/debian/nymea-plugin-generic-buttons.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericbuttons.so +genericbuttons/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-car.install.in b/debian/nymea-plugin-generic-car.install.in new file mode 100644 index 0000000..fa0523a --- /dev/null +++ b/debian/nymea-plugin-generic-car.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericcar.so +genericcar/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-energy.install.in b/debian/nymea-plugin-generic-energy.install.in new file mode 100644 index 0000000..027cc07 --- /dev/null +++ b/debian/nymea-plugin-generic-energy.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericenergy.so +genericenergy/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-garages.install.in b/debian/nymea-plugin-generic-garages.install.in new file mode 100644 index 0000000..986cf66 --- /dev/null +++ b/debian/nymea-plugin-generic-garages.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericgarages.so +genericgarages/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-heatingcooling.install.in b/debian/nymea-plugin-generic-heatingcooling.install.in new file mode 100644 index 0000000..7c74d7e --- /dev/null +++ b/debian/nymea-plugin-generic-heatingcooling.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericheatingcooling.so +genericheatingcooling/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-irrigation.install.in b/debian/nymea-plugin-generic-irrigation.install.in new file mode 100644 index 0000000..f790493 --- /dev/null +++ b/debian/nymea-plugin-generic-irrigation.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericirrigation.so +genericirrigation/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-sensors.install.in b/debian/nymea-plugin-generic-sensors.install.in new file mode 100644 index 0000000..4226374 --- /dev/null +++ b/debian/nymea-plugin-generic-sensors.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericsensors.so +genericsensors/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-shading.install.in b/debian/nymea-plugin-generic-shading.install.in new file mode 100644 index 0000000..f907e63 --- /dev/null +++ b/debian/nymea-plugin-generic-shading.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericshading.so +genericshading/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-generic-thing.install.in b/debian/nymea-plugin-generic-thing.install.in new file mode 100644 index 0000000..5c174ac --- /dev/null +++ b/debian/nymea-plugin-generic-thing.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericthing.so +genericthing/translations/*qm usr/share/nymea/translations/ diff --git a/debian/nymea-plugin-genericelements.install.in b/debian/nymea-plugin-genericelements.install.in deleted file mode 100644 index df09f77..0000000 --- a/debian/nymea-plugin-genericelements.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericelements.so \ No newline at end of file diff --git a/debian/nymea-plugin-genericthings.install.in b/debian/nymea-plugin-genericthings.install.in deleted file mode 100644 index 055ac7d..0000000 --- a/debian/nymea-plugin-genericthings.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingenericthings.so diff --git a/debian/nymea-plugin-goecharger.install.in b/debian/nymea-plugin-goecharger.install.in deleted file mode 100644 index d959940..0000000 --- a/debian/nymea-plugin-goecharger.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingoecharger.so diff --git a/debian/nymea-plugin-gpio.install.in b/debian/nymea-plugin-gpio.install.in deleted file mode 100644 index 57f215e..0000000 --- a/debian/nymea-plugin-gpio.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingpio.so \ No newline at end of file diff --git a/debian/nymea-plugin-homeconnect.install.in b/debian/nymea-plugin-homeconnect.install.in deleted file mode 100644 index 44410fd..0000000 --- a/debian/nymea-plugin-homeconnect.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginhomeconnect.so diff --git a/debian/nymea-plugin-httpcommander.install.in b/debian/nymea-plugin-httpcommander.install.in deleted file mode 100644 index 472c8a2..0000000 --- a/debian/nymea-plugin-httpcommander.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginhttpcommander.so diff --git a/debian/nymea-plugin-i2cdevices.install.in b/debian/nymea-plugin-i2cdevices.install.in deleted file mode 100644 index ec483f3..0000000 --- a/debian/nymea-plugin-i2cdevices.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugini2cdevices.so diff --git a/debian/nymea-plugin-keba.install.in b/debian/nymea-plugin-keba.install.in deleted file mode 100644 index 7f474a0..0000000 --- a/debian/nymea-plugin-keba.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginkeba.so diff --git a/debian/nymea-plugin-kodi.install.in b/debian/nymea-plugin-kodi.install.in deleted file mode 100644 index 80728d8..0000000 --- a/debian/nymea-plugin-kodi.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginkodi.so \ No newline at end of file diff --git a/debian/nymea-plugin-lgsmarttv.install.in b/debian/nymea-plugin-lgsmarttv.install.in deleted file mode 100644 index 42acdab..0000000 --- a/debian/nymea-plugin-lgsmarttv.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginlgsmarttv.so \ No newline at end of file diff --git a/debian/nymea-plugin-lifx.install.in b/debian/nymea-plugin-lifx.install.in deleted file mode 100644 index d8f7c34..0000000 --- a/debian/nymea-plugin-lifx.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginlifx.so diff --git a/debian/nymea-plugin-mailnotification.install.in b/debian/nymea-plugin-mailnotification.install.in deleted file mode 100644 index b43f110..0000000 --- a/debian/nymea-plugin-mailnotification.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginmailnotification.so \ No newline at end of file diff --git a/debian/nymea-plugin-mcp3008.install.in b/debian/nymea-plugin-mcp3008.install.in deleted file mode 100644 index 813a722..0000000 --- a/debian/nymea-plugin-mcp3008.install.in +++ /dev/null @@ -1,3 +0,0 @@ -mcp3008/integrationpluginmcp3008.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/mcp3008/ -mcp3008/integrationpluginmcp3008.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/mcp3008/ -mcp3008/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/mcp3008/ diff --git a/debian/nymea-plugin-mecelectronics.install.in b/debian/nymea-plugin-mecelectronics.install.in deleted file mode 100644 index 589ff78..0000000 --- a/debian/nymea-plugin-mecelectronics.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginmecelectronics.so diff --git a/debian/nymea-plugin-mqttclient.install.in b/debian/nymea-plugin-mqttclient.install.in deleted file mode 100644 index 8e82fe3..0000000 --- a/debian/nymea-plugin-mqttclient.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginmqttclient.so diff --git a/debian/nymea-plugin-mystrom.install.in b/debian/nymea-plugin-mystrom.install.in deleted file mode 100644 index 5fa1df3..0000000 --- a/debian/nymea-plugin-mystrom.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginmystrom.so diff --git a/debian/nymea-plugin-nanoleaf.install.in b/debian/nymea-plugin-nanoleaf.install.in deleted file mode 100644 index 5c16467..0000000 --- a/debian/nymea-plugin-nanoleaf.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginnanoleaf.so diff --git a/debian/nymea-plugin-neatobotvac.install.in b/debian/nymea-plugin-neatobotvac.install.in deleted file mode 100644 index 76a6c8b..0000000 --- a/debian/nymea-plugin-neatobotvac.install.in +++ /dev/null @@ -1,3 +0,0 @@ -neatobotvac/integrationpluginneatobotvac.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/neatobotvac/ -neatobotvac/integrationpluginneatobotvac.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/neatobotvac/ -neatobotvac/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/neatobotvac/ diff --git a/debian/nymea-plugin-netatmo.install.in b/debian/nymea-plugin-netatmo.install.in deleted file mode 100644 index 1b41476..0000000 --- a/debian/nymea-plugin-netatmo.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginnetatmo.so \ No newline at end of file diff --git a/debian/nymea-plugin-networkdetector.install.in b/debian/nymea-plugin-networkdetector.install.in deleted file mode 100644 index 7300771..0000000 --- a/debian/nymea-plugin-networkdetector.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginnetworkdetector.so \ No newline at end of file diff --git a/debian/nymea-plugin-nuki.install.in b/debian/nymea-plugin-nuki.install.in deleted file mode 100644 index 2419f69..0000000 --- a/debian/nymea-plugin-nuki.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginnuki.so diff --git a/debian/nymea-plugin-onewire.install.in b/debian/nymea-plugin-onewire.install.in deleted file mode 100644 index 8f211e3..0000000 --- a/debian/nymea-plugin-onewire.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginonewire.so diff --git a/debian/nymea-plugin-openuv.install.in b/debian/nymea-plugin-openuv.install.in deleted file mode 100644 index b39091a..0000000 --- a/debian/nymea-plugin-openuv.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginopenuv.so diff --git a/debian/nymea-plugin-openweathermap.install.in b/debian/nymea-plugin-openweathermap.install.in deleted file mode 100644 index 992d62b..0000000 --- a/debian/nymea-plugin-openweathermap.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginopenweathermap.so \ No newline at end of file diff --git a/debian/nymea-plugin-osdomotics.install.in b/debian/nymea-plugin-osdomotics.install.in deleted file mode 100644 index 7631f63..0000000 --- a/debian/nymea-plugin-osdomotics.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginosdomotics.so \ No newline at end of file diff --git a/debian/nymea-plugin-philipshue.install.in b/debian/nymea-plugin-philipshue.install.in deleted file mode 100644 index 5c11860..0000000 --- a/debian/nymea-plugin-philipshue.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginphilipshue.so \ No newline at end of file diff --git a/debian/nymea-plugin-pushbullet.install.in b/debian/nymea-plugin-pushbullet.install.in deleted file mode 100644 index 4e36090..0000000 --- a/debian/nymea-plugin-pushbullet.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginpushbullet.so diff --git a/debian/nymea-plugin-pushnotifications.install.in b/debian/nymea-plugin-pushnotifications.install.in deleted file mode 100644 index 514c1c0..0000000 --- a/debian/nymea-plugin-pushnotifications.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginpushnotifications.so diff --git a/debian/nymea-plugin-reversessh.install.in b/debian/nymea-plugin-reversessh.install.in deleted file mode 100644 index b4d37fb..0000000 --- a/debian/nymea-plugin-reversessh.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginreversessh.so diff --git a/debian/nymea-plugin-senic.install.in b/debian/nymea-plugin-senic.install.in deleted file mode 100644 index 5688791..0000000 --- a/debian/nymea-plugin-senic.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsenic.so diff --git a/debian/nymea-plugin-serialportcommander.install.in b/debian/nymea-plugin-serialportcommander.install.in deleted file mode 100644 index a5592a1..0000000 --- a/debian/nymea-plugin-serialportcommander.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginserialportcommander.so diff --git a/debian/nymea-plugin-sgready.install.in b/debian/nymea-plugin-sgready.install.in deleted file mode 100644 index 1832546..0000000 --- a/debian/nymea-plugin-sgready.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsgready.so diff --git a/debian/nymea-plugin-shelly.install.in b/debian/nymea-plugin-shelly.install.in deleted file mode 100644 index 5676cae..0000000 --- a/debian/nymea-plugin-shelly.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginshelly.so diff --git a/debian/nymea-plugin-simpleheatpump.install.in b/debian/nymea-plugin-simpleheatpump.install.in deleted file mode 100644 index 8d1184b..0000000 --- a/debian/nymea-plugin-simpleheatpump.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsimpleheatpump.so diff --git a/debian/nymea-plugin-sma.install.in b/debian/nymea-plugin-sma.install.in deleted file mode 100644 index 106718a..0000000 --- a/debian/nymea-plugin-sma.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsma.so diff --git a/debian/nymea-plugin-solarlog.install.in b/debian/nymea-plugin-solarlog.install.in deleted file mode 100644 index fec3ab6..0000000 --- a/debian/nymea-plugin-solarlog.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsolarlog.so diff --git a/debian/nymea-plugin-somfytahoma.install.in b/debian/nymea-plugin-somfytahoma.install.in deleted file mode 100644 index f0e177e..0000000 --- a/debian/nymea-plugin-somfytahoma.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsomfytahoma.so diff --git a/debian/nymea-plugin-sonos.install.in b/debian/nymea-plugin-sonos.install.in deleted file mode 100644 index ba2f12e..0000000 --- a/debian/nymea-plugin-sonos.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsonos.so diff --git a/debian/nymea-plugin-sunposition.install.in b/debian/nymea-plugin-sunposition.install.in deleted file mode 100644 index e8aa93f..0000000 --- a/debian/nymea-plugin-sunposition.install.in +++ /dev/null @@ -1,4 +0,0 @@ -sunposition/integrationpluginsunposition.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/sunposition/ -sunposition/integrationpluginsunposition.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/sunposition/ -sunposition/sunposition.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/sunposition/ -sunposition/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/sunposition/ diff --git a/debian/nymea-plugin-systemmonitor.install.in b/debian/nymea-plugin-systemmonitor.install.in deleted file mode 100644 index f3ec981..0000000 --- a/debian/nymea-plugin-systemmonitor.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsystemmonitor.so diff --git a/debian/nymea-plugin-tado.install.in b/debian/nymea-plugin-tado.install.in deleted file mode 100644 index 2d62b79..0000000 --- a/debian/nymea-plugin-tado.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintado.so diff --git a/debian/nymea-plugin-tasmota.install.in b/debian/nymea-plugin-tasmota.install.in deleted file mode 100644 index 24c16a9..0000000 --- a/debian/nymea-plugin-tasmota.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintasmota.so diff --git a/debian/nymea-plugin-tcpcommander.install.in b/debian/nymea-plugin-tcpcommander.install.in deleted file mode 100644 index c24bb95..0000000 --- a/debian/nymea-plugin-tcpcommander.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintcpcommander.so diff --git a/debian/nymea-plugin-telegram.install.in b/debian/nymea-plugin-telegram.install.in deleted file mode 100644 index 029afb3..0000000 --- a/debian/nymea-plugin-telegram.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintelegram.so diff --git a/debian/nymea-plugin-tempo.install.in b/debian/nymea-plugin-tempo.install.in deleted file mode 100644 index 00a44b1..0000000 --- a/debian/nymea-plugin-tempo.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintempo.so diff --git a/debian/nymea-plugin-texasinstruments.install.in b/debian/nymea-plugin-texasinstruments.install.in deleted file mode 100644 index 4e46ce5..0000000 --- a/debian/nymea-plugin-texasinstruments.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintexasinstruments.so diff --git a/debian/nymea-plugin-tplink.install.in b/debian/nymea-plugin-tplink.install.in deleted file mode 100644 index bd51f8e..0000000 --- a/debian/nymea-plugin-tplink.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintplink.so diff --git a/debian/nymea-plugin-tuya.install.in b/debian/nymea-plugin-tuya.install.in deleted file mode 100644 index b95d6af..0000000 --- a/debian/nymea-plugin-tuya.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugintuya.so diff --git a/debian/nymea-plugin-udpcommander.install.in b/debian/nymea-plugin-udpcommander.install.in deleted file mode 100644 index d1b8e44..0000000 --- a/debian/nymea-plugin-udpcommander.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginudpcommander.so \ No newline at end of file diff --git a/debian/nymea-plugin-unifi.install.in b/debian/nymea-plugin-unifi.install.in deleted file mode 100644 index 0c98cf0..0000000 --- a/debian/nymea-plugin-unifi.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginunifi.so diff --git a/debian/nymea-plugin-usbrelay.install.in b/debian/nymea-plugin-usbrelay.install.in deleted file mode 100644 index 680061e..0000000 --- a/debian/nymea-plugin-usbrelay.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginusbrelay.so diff --git a/debian/nymea-plugin-wakeonlan.install.in b/debian/nymea-plugin-wakeonlan.install.in deleted file mode 100644 index 1d88443..0000000 --- a/debian/nymea-plugin-wakeonlan.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginwakeonlan.so diff --git a/debian/nymea-plugin-wemo.install.in b/debian/nymea-plugin-wemo.install.in deleted file mode 100644 index d44e763..0000000 --- a/debian/nymea-plugin-wemo.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginwemo.so diff --git a/debian/nymea-plugin-wheretheissat.install.in b/debian/nymea-plugin-wheretheissat.install.in deleted file mode 100644 index 7a810ea..0000000 --- a/debian/nymea-plugin-wheretheissat.install.in +++ /dev/null @@ -1,4 +0,0 @@ -wheretheissat/integrationpluginwheretheissat.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/wheretheissat/ -wheretheissat/integrationpluginwheretheissat.js usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/wheretheissat/ -wheretheissat/wheretheissat.mjs usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/wheretheissat/ - diff --git a/debian/nymea-plugin-ws2812fx.install.in b/debian/nymea-plugin-ws2812fx.install.in deleted file mode 100644 index 3ef6c58..0000000 --- a/debian/nymea-plugin-ws2812fx.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginws2812fx.so diff --git a/debian/nymea-plugin-yamahaavr.install.in b/debian/nymea-plugin-yamahaavr.install.in deleted file mode 100644 index b95cf3f..0000000 --- a/debian/nymea-plugin-yamahaavr.install.in +++ /dev/null @@ -1,4 +0,0 @@ -yamahaavr/integrationpluginyamahaavr.json usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/yamahaavr/ -yamahaavr/integrationpluginyamahaavr.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/yamahaavr/ -yamahaavr/zeroconfbrowser.py usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/yamahaavr/ -yamahaavr/requirements.txt usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/yamahaavr/ \ No newline at end of file diff --git a/debian/nymea-plugin-zigbee-develco.install.in b/debian/nymea-plugin-zigbee-develco.install.in deleted file mode 100644 index 5d94b1e..0000000 --- a/debian/nymea-plugin-zigbee-develco.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeedevelco.so diff --git a/debian/nymea-plugin-zigbee-generic-lights.install.in b/debian/nymea-plugin-zigbee-generic-lights.install.in deleted file mode 100644 index f46b810..0000000 --- a/debian/nymea-plugin-zigbee-generic-lights.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeegenericlights.so diff --git a/debian/nymea-plugin-zigbee-generic.install.in b/debian/nymea-plugin-zigbee-generic.install.in deleted file mode 100644 index e36eada..0000000 --- a/debian/nymea-plugin-zigbee-generic.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeegeneric.so diff --git a/debian/nymea-plugin-zigbee-lumi.install.in b/debian/nymea-plugin-zigbee-lumi.install.in deleted file mode 100644 index 06ebdbf..0000000 --- a/debian/nymea-plugin-zigbee-lumi.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeelumi.so diff --git a/debian/nymea-plugin-zigbee-philipshue.install.in b/debian/nymea-plugin-zigbee-philipshue.install.in deleted file mode 100644 index 80a4b9a..0000000 --- a/debian/nymea-plugin-zigbee-philipshue.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeephilipshue.so diff --git a/debian/nymea-plugin-zigbee-remotes.install.in b/debian/nymea-plugin-zigbee-remotes.install.in deleted file mode 100644 index 1fb765c..0000000 --- a/debian/nymea-plugin-zigbee-remotes.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeeremotes.so diff --git a/debian/nymea-plugin-zigbee-tradfri.install.in b/debian/nymea-plugin-zigbee-tradfri.install.in deleted file mode 100644 index 9f7f026..0000000 --- a/debian/nymea-plugin-zigbee-tradfri.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginzigbeetradfri.so diff --git a/debian/nymea-plugins-translations.dirs b/debian/nymea-plugins-translations.dirs deleted file mode 100644 index 43694e3..0000000 --- a/debian/nymea-plugins-translations.dirs +++ /dev/null @@ -1 +0,0 @@ -usr/share/nymea/translations diff --git a/debian/nymea-plugins-translations.install.in b/debian/nymea-plugins-translations.install.in deleted file mode 100644 index 69dcb0c..0000000 --- a/debian/nymea-plugins-translations.install.in +++ /dev/null @@ -1 +0,0 @@ -translations/*.qm usr/share/nymea/translations diff --git a/genericbuttons/README.md b/genericbuttons/README.md new file mode 100644 index 0000000..824e4d4 --- /dev/null +++ b/genericbuttons/README.md @@ -0,0 +1,29 @@ +# Generic buttons + +The generic buttons plugin allows to set up generic buttons (as in remote controls) and power switches +for devices that don't have their own specialized plugin but can be connected via some generic input +like GPIOs or MQTT. +The virtual buttons plugin allows to create virtual buttons. Unlike other nymea plugins they are not +meant to be used for a certain pyhsical device or service, but instead simulate a button or power switch +thing inside nymea. This may be useful to create buttons or toggle switches in nymea which are then +connected to a rule or script to trigger other behavior in the system. One example use case would be +to create a "lights off" button which is then hooked up to a rule to turn off a larger set of lights +with a single button press. +Another example would be to use the virtual switch as a condition for a scene to be active or not. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin. +When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs accordingly. For more complex inputs, like MQTT, use a +nymea script to process the MQTT payload and set the buttons events/states accordingls. + +### Example: A light switch on a digital output GPIO + +First, set up the GPIO to control the light. Please refer to the documentation of the +according plugin for this. Once the lights can be controlled by nymea using the raw +GPIO toggle, set up a generic light from this plugin and go to the settings of the +newly added generic light. In there, you'll find a section for Input/Output connections +which can be used to connect the power state of this generic light to the GPIO that +actually controls the light. The light can now be used like any other ready-made light +device in nymea. diff --git a/genericbuttons/genericbuttons.pro b/genericbuttons/genericbuttons.pro new file mode 100644 index 0000000..d6b0484 --- /dev/null +++ b/genericbuttons/genericbuttons.pro @@ -0,0 +1,9 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericbuttons.cpp + +HEADERS += \ + integrationplugingenericbuttons.h + + diff --git a/genericbuttons/integrationplugingenericbuttons.cpp b/genericbuttons/integrationplugingenericbuttons.cpp new file mode 100644 index 0000000..bd3a8dd --- /dev/null +++ b/genericbuttons/integrationplugingenericbuttons.cpp @@ -0,0 +1,91 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericbuttons.h" +#include "plugininfo.h" + +#include + +IntegrationPluginGenericButtons::IntegrationPluginGenericButtons() +{ +} + +void IntegrationPluginGenericButtons::setupThing(ThingSetupInfo *info) +{ + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericButtons::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == buttonThingClassId) { + if (action.actionTypeId() == buttonPressActionTypeId) { + thing->emitEvent(buttonPressedEventTypeId); + info->finish(Thing::ThingErrorNoError); + return; + } + } + + if (thing->thingClassId() == virtualButtonThingClassId) { + if (action.actionTypeId() == virtualButtonPressActionTypeId) { + thing->emitEvent(virtualButtonPressedEventTypeId); + info->finish(Thing::ThingErrorNoError); + return; + } + } + + if (thing->thingClassId() == powerSwitchThingClassId) { + if (action.actionTypeId() == powerSwitchPowerActionTypeId) { + thing->setStateValue(powerSwitchPowerStateTypeId, action.param(powerSwitchPowerActionPowerParamTypeId).value()); + thing->emitEvent(powerSwitchPressedEventTypeId, { + Param(powerSwitchPowerActionPowerParamTypeId, + action.paramValue(powerSwitchPowerActionPowerParamTypeId).toBool()) + }); + info->finish(Thing::ThingErrorNoError); + return; + } + } + + if (thing->thingClassId() == virtualPowerSwitchThingClassId) { + if (action.actionTypeId() == virtualPowerSwitchPowerActionTypeId) { + thing->setStateValue(virtualPowerSwitchPowerStateTypeId, action.param(virtualPowerSwitchPowerActionPowerParamTypeId).value()); + thing->emitEvent(virtualPowerSwitchPressedEventTypeId, { + Param(virtualPowerSwitchPowerActionPowerParamTypeId, + action.paramValue(virtualPowerSwitchPowerActionPowerParamTypeId).toBool()) + }); + info->finish(Thing::ThingErrorNoError); + return; + } + } + + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); +} diff --git a/genericelements/integrationplugingenericelements.h b/genericbuttons/integrationplugingenericbuttons.h similarity index 85% rename from genericelements/integrationplugingenericelements.h rename to genericbuttons/integrationplugingenericbuttons.h index be25eb4..700687b 100644 --- a/genericelements/integrationplugingenericelements.h +++ b/genericbuttons/integrationplugingenericbuttons.h @@ -28,20 +28,22 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#ifndef INTEGRATIONPLUGINGENERICELEMENTS_H -#define INTEGRATIONPLUGINGENERICELEMENTS_H +#ifndef INTEGRATIONPLUGINVIRTUALBUTTONS_H +#define INTEGRATIONPLUGINVIRTUALBUTTONS_H #include "integrations/integrationplugin.h" -class IntegrationPluginGenericElements : public IntegrationPlugin +#include "extern-plugininfo.h" + +class IntegrationPluginGenericButtons : public IntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericelements.json") + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericbuttons.json") Q_INTERFACES(IntegrationPlugin) public: - explicit IntegrationPluginGenericElements(); + explicit IntegrationPluginGenericButtons(); void setupThing(ThingSetupInfo *info) override; public slots: @@ -49,4 +51,4 @@ public slots: }; -#endif // INTEGRATIONPLUGINGENERICELEMENTS_H +#endif // INTEGRATIONPLUGINVIRTUALBUTTONS_H diff --git a/genericbuttons/integrationplugingenericbuttons.json b/genericbuttons/integrationplugingenericbuttons.json new file mode 100644 index 0000000..a182274 --- /dev/null +++ b/genericbuttons/integrationplugingenericbuttons.json @@ -0,0 +1,128 @@ +{ + "name": "genericButtons", + "displayName": "Generic buttons", + "id": "6e22161e-39b7-4416-8623-39e730721efb", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "a3a73bf2-ebe4-47fa-8a0a-dc91927c6ce3", + "name": "button", + "displayName": "Generic button", + "createMethods": [ "user" ], + "interfaces": [ "button" ], + "paramTypes": [ ], + "actionTypes": [ + { + "id": "3a7bda8e-b92c-454b-8ea2-b798fcec8e4b", + "name": "Press", + "displayName": "press" + } + ], + "eventTypes": [ + { + "id": "48bd63b3-da71-4aef-a6b2-e583cf9a7196", + "name": "pressed", + "displayName": "Pressed" + } + ] + }, + { + "id": "820b2f2d-0d92-48c8-8fd4-f94ce8fc4103", + "name": "virtualButton", + "displayName": "Virtual button", + "createMethods": [ "user" ], + "interfaces": [ "button" ], + "paramTypes": [ ], + "actionTypes": [ + { + "id": "01f38af1-b2ab-4ec3-844e-ef52f0f229a9", + "name": "press", + "displayName": "Press" + } + ], + "eventTypes": [ + { + "id": "effdbc2d-e467-4b0b-80a9-9dda251bfa5c", + "name": "pressed", + "displayName": "Pressed" + } + ] + }, + { + "id": "57daa147-dd6f-4673-a757-d8f01a2054c7", + "name": "powerSwitch", + "displayName": "Generic power switch", + "createMethods": ["user"], + "interfaces": ["powerswitch"], + "stateTypes": [ + { + "id": "08087af6-6a3b-4e4a-ac6d-56f23ce63edf", + "name": "power", + "displayName": "Powered", + "displayNameEvent": "Turned on or off", + "displayNameAction": "Turn on or off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ], + "eventTypes": [ + { + "id": "3bd54b64-dd3f-4584-b3a6-75bbc4d9041a", + "name": "pressed", + "displayName": "Pressed", + "paramTypes": [ + { + "id": "a43fd9e4-2097-4dd8-afe5-ad85afd9ef50", + "name": "power", + "displayName": "Power", + "type": "bool" + } + ] + } + ] + }, + { + "id": "8ea0a168-74ff-4445-8c13-74aab195af4e", + "name": "virtualPowerSwitch", + "displayName": "Virtual power switch", + "createMethods": ["user"], + "interfaces": ["powerswitch"], + "stateTypes": [ + { + "id": "bd3be4e3-7377-421a-a374-104dd451de6d", + "name": "power", + "displayName": "Powered", + "displayNameEvent": "Turned on or off", + "displayNameAction": "Turn on or off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ], + "eventTypes": [ + { + "id": "8a0526d1-ca0b-4a86-addd-41f93c9a9268", + "name": "pressed", + "displayName": "Pressed", + "paramTypes": [ + { + "id": "ba5790aa-b9bb-48b7-84af-4f5a9cd4e902", + "name": "power", + "displayName": "Power", + "type": "bool" + } + ] + } + ] + } + ] + } + ] +} diff --git a/genericbuttons/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts b/genericbuttons/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts new file mode 100644 index 0000000..f9fd767 --- /dev/null +++ b/genericbuttons/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts @@ -0,0 +1,103 @@ + + + + + virtualButtons + + + Generic button + The name of the ThingClass ({a3a73bf2-ebe4-47fa-8a0a-dc91927c6ce3}) + + + + + Generic power switch + The name of the ThingClass ({57daa147-dd6f-4673-a757-d8f01a2054c7}) + + + + + + Power + The name of the ParamType (ThingClass: virtualPowerSwitch, EventType: pressed, ID: {ba5790aa-b9bb-48b7-84af-4f5a9cd4e902}) +---------- +The name of the ParamType (ThingClass: powerSwitch, EventType: pressed, ID: {a43fd9e4-2097-4dd8-afe5-ad85afd9ef50}) + + + + + + + + Powered + The name of the ParamType (ThingClass: virtualPowerSwitch, ActionType: power, ID: {bd3be4e3-7377-421a-a374-104dd451de6d}) +---------- +The name of the StateType ({bd3be4e3-7377-421a-a374-104dd451de6d}) of ThingClass virtualPowerSwitch +---------- +The name of the ParamType (ThingClass: powerSwitch, ActionType: power, ID: {08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) +---------- +The name of the StateType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch + + + + + Press + The name of the ActionType ({01f38af1-b2ab-4ec3-844e-ef52f0f229a9}) of ThingClass virtualButton + + + + + + + + Pressed + The name of the EventType ({8a0526d1-ca0b-4a86-addd-41f93c9a9268}) of ThingClass virtualPowerSwitch +---------- +The name of the EventType ({3bd54b64-dd3f-4584-b3a6-75bbc4d9041a}) of ThingClass powerSwitch +---------- +The name of the EventType ({effdbc2d-e467-4b0b-80a9-9dda251bfa5c}) of ThingClass virtualButton +---------- +The name of the EventType ({48bd63b3-da71-4aef-a6b2-e583cf9a7196}) of ThingClass button + + + + + + Turn on or off + The name of the ActionType ({bd3be4e3-7377-421a-a374-104dd451de6d}) of ThingClass virtualPowerSwitch +---------- +The name of the ActionType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch + + + + + Virtual button + The name of the ThingClass ({820b2f2d-0d92-48c8-8fd4-f94ce8fc4103}) + + + + + Virtual buttons + The name of the plugin virtualButtons ({6e22161e-39b7-4416-8623-39e730721efb}) + + + + + Virtual power switch + The name of the ThingClass ({8ea0a168-74ff-4445-8c13-74aab195af4e}) + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + + press + The name of the ActionType ({3a7bda8e-b92c-454b-8ea2-b798fcec8e4b}) of ThingClass button + + + + diff --git a/genericcar/README.md b/genericcar/README.md new file mode 100644 index 0000000..007ae14 --- /dev/null +++ b/genericcar/README.md @@ -0,0 +1,11 @@ +# Generic car + +This plugin allows to add a generic electric car in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs or MQTT. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the MQTT client plugin. +When done, set up the generic car and use nymea scripts to process incoming messages and +fill the cars states accordingly. diff --git a/genericcar/genericcar.pro b/genericcar/genericcar.pro new file mode 100644 index 0000000..ecf98e8 --- /dev/null +++ b/genericcar/genericcar.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericcar.cpp + +HEADERS += \ + integrationplugingenericcar.h + + + diff --git a/genericcar/integrationplugingenericcar.cpp b/genericcar/integrationplugingenericcar.cpp new file mode 100644 index 0000000..61dc5a2 --- /dev/null +++ b/genericcar/integrationplugingenericcar.cpp @@ -0,0 +1,77 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericcar.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericCar::IntegrationPluginGenericCar() +{ + +} + +void IntegrationPluginGenericCar::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + // Set the min charging current state if the settings value changed + connect(thing, &Thing::settingChanged, this, [thing](const ParamTypeId ¶mTypeId, const QVariant &value){ + if (paramTypeId == carSettingsMinChargingCurrentParamTypeId) { + qCDebug(dcGenericCar()) << "Car minimum charging current settings changed" << value.toUInt() << "A"; + thing->setStateValue(carMinChargingCurrentStateTypeId, value); + } + }); + + // Finish the setup + info->finish(Thing::ThingErrorNoError); + + // Set the inital state value + thing->setStateValue(carMinChargingCurrentStateTypeId, thing->setting(carSettingsMinChargingCurrentParamTypeId)); +} + +void IntegrationPluginGenericCar::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (action.actionTypeId() == carCapacityActionTypeId) { + thing->setStateValue(carCapacityStateTypeId, action.paramValue(carCapacityActionCapacityParamTypeId)); + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == carBatteryLevelActionTypeId) { + thing->setStateValue(carBatteryLevelStateTypeId, action.paramValue(carBatteryLevelActionBatteryLevelParamTypeId)); + thing->setStateValue(carBatteryCriticalStateTypeId, action.paramValue(carBatteryLevelActionBatteryLevelParamTypeId).toInt() < 10); + info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled action: %1").arg(action.actionTypeId().toString()).toUtf8()); + } +} diff --git a/genericcar/integrationplugingenericcar.h b/genericcar/integrationplugingenericcar.h new file mode 100644 index 0000000..87acc21 --- /dev/null +++ b/genericcar/integrationplugingenericcar.h @@ -0,0 +1,58 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICCAR_H +#define INTEGRATIONPLUGINGENERICCAR_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericCar: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericcar.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericCar(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; + +private: + QHash m_pulsesPerTimeframe; + + QHash m_smartMeterTimer; +}; + +#endif // INTEGRATIONPLUGINGENERICCAR_H diff --git a/genericcar/integrationplugingenericcar.json b/genericcar/integrationplugingenericcar.json new file mode 100644 index 0000000..6e9a14d --- /dev/null +++ b/genericcar/integrationplugingenericcar.json @@ -0,0 +1,78 @@ +{ + "name": "genericCar", + "displayName": "Generic Car", + "id": "83ede9b2-aa5f-49ff-8f7d-5ca30d8964df", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "dbe0a9ff-94ba-4a94-ae52-51da3f05c717", + "name": "car", + "displayName": "Generic electric car", + "createMethods": ["user"], + "interfaces": ["electricvehicle"], + "settingsTypes": [ + { + "id": "0c55516d-4285-4d02-8926-1dae03649e18", + "name": "minChargingCurrent", + "displayName": "Minimum charging current", + "type": "uint", + "unit": "Ampere", + "minValue": 6, + "maxValue": 16, + "defaultValue": 6 + } + ], + "stateTypes": [ + { + "id": "363a2a39-61b6-4109-9cd9-aca7367d12c7", + "name": "capacity", + "displayName": "Capacity", + "displayNameEvent": "Capacity changed", + "displayNameAction": "Set capacity", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 50, + "writable": true + }, + { + "id": "d33982d6-6467-4281-b448-68c1b1db088d", + "name": "batteryCritical", + "displayName": "Battery level critical", + "displayNameEvent": "Battery entered or left critical state", + "type": "bool", + "defaultValue": false + }, + { + "id": "3f1cca10-8988-4ec6-b937-0775653cde12", + "name": "batteryLevel", + "displayName": "Battery level", + "displayNameEvent": "Battery level changed", + "displayNameAction": "Set battery level", + "type": "int", + "unit": "Percentage", + "writable": true, + "minValue": 0, + "maxValue": 100, + "defaultValue": 100 + }, + { + "id": "20faf2b8-2b40-4bee-b228-97dbaf0cdffc", + "name": "minChargingCurrent", + "displayName": "Minimum charging current", + "displayNameEvent": "Minimum charging current changed", + "type": "uint", + "unit": "Ampere", + "minValue": 6, + "maxValue": 16, + "defaultValue": 6 + } + ] + } + ] + } + ] +} diff --git a/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-de.ts b/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-de.ts new file mode 100644 index 0000000..beac4a1 --- /dev/null +++ b/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-de.ts @@ -0,0 +1,106 @@ + + + + + GenericCar + + + Battery entered or left critical state + The name of the EventType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car + Akkuladung kritisch geändert + + + + + + Battery level + The name of the ParamType (ThingClass: car, ActionType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) +---------- +The name of the ParamType (ThingClass: car, EventType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) +---------- +The name of the StateType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + Akkuladung + + + + Battery level changed + The name of the EventType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + Akkuladung geändert + + + + + Battery level critical + The name of the ParamType (ThingClass: car, EventType: batteryCritical, ID: {d33982d6-6467-4281-b448-68c1b1db088d}) +---------- +The name of the StateType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car + Akkuladung kritisch + + + + + + Capacity + The name of the ParamType (ThingClass: car, ActionType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) +---------- +The name of the ParamType (ThingClass: car, EventType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) +---------- +The name of the StateType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + Kapazität + + + + Capacity changed + The name of the EventType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + Kapazität geändert + + + + Generic Car + The name of the plugin GenericCar ({83ede9b2-aa5f-49ff-8f7d-5ca30d8964df}) + Generisches Auto + + + + Generic electric car + The name of the ThingClass ({dbe0a9ff-94ba-4a94-ae52-51da3f05c717}) + Generisches Elektroauto + + + + + + Minimum charging current + The name of the ParamType (ThingClass: car, EventType: minChargingCurrent, ID: {20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) +---------- +The name of the StateType ({20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) of ThingClass car +---------- +The name of the ParamType (ThingClass: car, Type: settings, ID: {0c55516d-4285-4d02-8926-1dae03649e18}) + Minmaler Ladestrom + + + + Minimum charging current changed + The name of the EventType ({20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) of ThingClass car + Minimaler Ladestrom geändert + + + + Set battery level + The name of the ActionType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + Setze Akkuladung + + + + Set capacity + The name of the ActionType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + Setze Kapazität + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + nymea + + + diff --git a/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-en_US.ts b/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-en_US.ts new file mode 100644 index 0000000..3317695 --- /dev/null +++ b/genericcar/translations/83ede9b2-aa5f-49ff-8f7d-5ca30d8964df-en_US.ts @@ -0,0 +1,106 @@ + + + + + GenericCar + + + Battery entered or left critical state + The name of the EventType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car + + + + + + + Battery level + The name of the ParamType (ThingClass: car, ActionType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) +---------- +The name of the ParamType (ThingClass: car, EventType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) +---------- +The name of the StateType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + + + + + Battery level changed + The name of the EventType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + + + + + + Battery level critical + The name of the ParamType (ThingClass: car, EventType: batteryCritical, ID: {d33982d6-6467-4281-b448-68c1b1db088d}) +---------- +The name of the StateType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car + + + + + + + Capacity + The name of the ParamType (ThingClass: car, ActionType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) +---------- +The name of the ParamType (ThingClass: car, EventType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) +---------- +The name of the StateType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + + + + + Capacity changed + The name of the EventType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + + + + + Generic Car + The name of the plugin GenericCar ({83ede9b2-aa5f-49ff-8f7d-5ca30d8964df}) + + + + + Generic electric car + The name of the ThingClass ({dbe0a9ff-94ba-4a94-ae52-51da3f05c717}) + + + + + + + Minimum charging current + The name of the ParamType (ThingClass: car, EventType: minChargingCurrent, ID: {20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) +---------- +The name of the StateType ({20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) of ThingClass car +---------- +The name of the ParamType (ThingClass: car, Type: settings, ID: {0c55516d-4285-4d02-8926-1dae03649e18}) + + + + + Minimum charging current changed + The name of the EventType ({20faf2b8-2b40-4bee-b228-97dbaf0cdffc}) of ThingClass car + + + + + Set battery level + The name of the ActionType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car + + + + + Set capacity + The name of the ActionType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericelements/README.md b/genericelements/README.md deleted file mode 100644 index 5bd15ed..0000000 --- a/genericelements/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Generic elements - -The generic elements plugin allows you create virtual buttons, which can be connected with a rule. This gives you -the possibility to execute multiple actions with one signal. Without a rule this generic elements are -useless. - -## Toggle Button -With the "Toggle Button" you can create a button with one action toggle. In the `state` you can find out, -what happens if the button will be pressed. The states can be true or false. - -## Button -With the "Button" you can create a button with one action `press`. This button just creates one event. - -## ON/OFF Button -With the "ON/OFF Button" you create a button pair with the actions `ON` and `OFF`. diff --git a/genericelements/genericelements.pro b/genericelements/genericelements.pro deleted file mode 100644 index 660914e..0000000 --- a/genericelements/genericelements.pro +++ /dev/null @@ -1,11 +0,0 @@ -include(../plugins.pri) - -TARGET = $$qtLibraryTarget(nymea_integrationplugingenericelements) - -SOURCES += \ - integrationplugingenericelements.cpp - -HEADERS += \ - integrationplugingenericelements.h - - diff --git a/genericelements/genericelements.svg b/genericelements/genericelements.svg deleted file mode 100644 index 3e1a4cf..0000000 --- a/genericelements/genericelements.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/genericelements/integrationplugingenericelements.cpp b/genericelements/integrationplugingenericelements.cpp deleted file mode 100644 index 6b60b9d..0000000 --- a/genericelements/integrationplugingenericelements.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "integrationplugingenericelements.h" -#include "plugininfo.h" - -#include - -IntegrationPluginGenericElements::IntegrationPluginGenericElements() -{ -} - -void IntegrationPluginGenericElements::setupThing(ThingSetupInfo *info) -{ - info->finish(Thing::ThingErrorNoError); -} - -void IntegrationPluginGenericElements::executeAction(ThingActionInfo *info) -{ - Thing *thing = info->thing(); - Action action = info->action(); - - // Power Button - if (thing->thingClassId() == powerButtonThingClassId) { - if (action.actionTypeId() == powerButtonPowerActionTypeId) { - thing->setStateValue(powerButtonPowerStateTypeId, action.params().paramValue(powerButtonPowerActionPowerParamTypeId).toBool()); - } - } - - // Button - if (thing->thingClassId() == buttonThingClassId) { - if (action.actionTypeId() == buttonPressActionTypeId) { - emit emitEvent(Event(buttonPressedEventTypeId, thing->id())); - } - } - - // Trigger button - if (thing->thingClassId() == triggerButtonThingClassId) { - if (action.actionTypeId() == triggerButtonTriggerActionTypeId) { - emit emitEvent(Event(triggerButtonPressedEventTypeId, thing->id())); - } - } - - // ON/OFF Button - if (thing->thingClassId() == onOffButtonThingClassId) { - if (action.actionTypeId() == onOffButtonOnActionTypeId) { - emit emitEvent(Event(onOffButtonPressedEventTypeId, thing->id(), ParamList() << Param(onOffButtonPressedEventButtonNameParamTypeId, "On"))); - } else if (action.actionTypeId() == onOffButtonOffActionTypeId) { - emit emitEvent(Event(onOffButtonPressedEventTypeId, thing->id(), ParamList() << Param(onOffButtonPressedEventButtonNameParamTypeId, "Off"))); - } - } - - info->finish(Thing::ThingErrorNoError); -} diff --git a/genericelements/integrationplugingenericelements.json b/genericelements/integrationplugingenericelements.json deleted file mode 100644 index b5051b4..0000000 --- a/genericelements/integrationplugingenericelements.json +++ /dev/null @@ -1,115 +0,0 @@ - { - "name": "GenericElements", - "displayName": "Generic Elements", - "id": "6e22161e-39b7-4416-8623-39e730721efb", - "vendors": [ - { - "name": "nymea", - "displayName": "nymea", - "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", - "thingClasses": [ - { - "id": "c0f511f9-70f5-499b-bd70-2c0e9ddd68c4", - "name": "powerButton", - "displayName": "Power Button", - "createMethods": [ "user" ], - "interfaces": [ "power" ], - "paramTypes": [ ], - "stateTypes": [ - { - "id": "b5e90567-54aa-49bd-a78a-3c19fb38aaf5", - "name": "power", - "displayName": "state", - "displayNameEvent": "power changed", - "displayNameAction": "set power", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - } - ] - }, - { - "id": "820b2f2d-0d92-48c8-8fd4-f94ce8fc4103", - "name": "button", - "displayName": "Button", - "createMethods": [ "user" ], - "interfaces": [ "button" ], - "paramTypes": [ ], - "actionTypes": [ - { - "id": "01f38af1-b2ab-4ec3-844e-ef52f0f229a9", - "name": "press", - "displayName": "press" - } - ], - "eventTypes": [ - { - "id": "effdbc2d-e467-4b0b-80a9-9dda251bfa5c", - "name": "pressed", - "displayName": "button pressed" - } - ] - }, - { - "id": "5f91923e-fc8e-48db-9de7-9a2fc36798dd", - "name": "triggerButton", - "displayName": "Trigger button", - "createMethods": [ "user" ], - "interfaces": [ "outputtrigger", "button" ], - "paramTypes": [ ], - "actionTypes": [ - { - "id": "da322b8e-2116-4565-805a-03f7726373c8", - "name": "trigger", - "displayName": "trigger" - } - ], - "eventTypes": [ - { - "id": "51197853-0559-42a0-a97b-6ead56ae22f6", - "name": "pressed", - "displayName": "triggered" - } - ] - }, - { - "id": "430d188c-476d-4825-a9bd-86dfa3094b56", - "name": "onOffButton", - "displayName": "ON/OFF Button", - "createMethods": ["user"], - "interfaces": [ "multibutton" ], - "paramTypes": [ ], - "actionTypes": [ - { - "id": "892596d2-0863-4807-97da-469b9f7003f2", - "name": "on", - "displayName": "on" - }, - { - "id": "a8d64050-0b58-4ccf-b052-77ce2b7368ad", - "name": "off", - "displayName": "off" - } - ], - "eventTypes": [ - { - "id": "4eeba6a2-e4c7-4a2e-8360-2797d98114e6", - "name": "pressed", - "displayName": "Button pressed", - "paramTypes": [ - { - "id": "2e6bc343-41a3-4634-b514-4512ae54afbc", - "name": "buttonName", - "displayName": "Button name", - "type": "QString", - "allowedValues": ["Off", "On"] - } - ] - } - ] - } - ] - } - ] -} diff --git a/genericelements/meta.json b/genericelements/meta.json deleted file mode 100644 index 5b9fd6b..0000000 --- a/genericelements/meta.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Generic Elements", - "tagline": "Add basic buttons.", - "icon": "genericelements.svg", - "stability": "community", - "offline": true, - "technologies": [ - ], - "categories": [ - "tool" - ] -} diff --git a/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-de.ts b/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-de.ts deleted file mode 100644 index 0f73f20..0000000 --- a/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-de.ts +++ /dev/null @@ -1,115 +0,0 @@ - - - - - GenericElements - - - Generic Elements - The name of the plugin GenericElements ({6e22161e-39b7-4416-8623-39e730721efb}) - - - - - nymea - The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) - - - - - - - state - The name of the ParamType (ThingClass: powerButton, ActionType: power, ID: {b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) ----------- -The name of the ParamType (ThingClass: powerButton, EventType: power, ID: {b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) ----------- -The name of the StateType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - Button - The name of the ThingClass ({820b2f2d-0d92-48c8-8fd4-f94ce8fc4103}) - Taster - - - - Button name - The name of the ParamType (ThingClass: onOffButton, EventType: pressed, ID: {2e6bc343-41a3-4634-b514-4512ae54afbc}) - - - - - Button pressed - The name of the EventType ({4eeba6a2-e4c7-4a2e-8360-2797d98114e6}) of ThingClass onOffButton - - - - - Power Button - The name of the ThingClass ({c0f511f9-70f5-499b-bd70-2c0e9ddd68c4}) - - - - - Trigger button - The name of the ThingClass ({5f91923e-fc8e-48db-9de7-9a2fc36798dd}) - - - - - off - The name of the ActionType ({a8d64050-0b58-4ccf-b052-77ce2b7368ad}) of ThingClass onOffButton - - - - - on - The name of the ActionType ({892596d2-0863-4807-97da-469b9f7003f2}) of ThingClass onOffButton - - - - - power changed - The name of the EventType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - press - The name of the ActionType ({01f38af1-b2ab-4ec3-844e-ef52f0f229a9}) of ThingClass button - - - - - set power - The name of the ActionType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - trigger - The name of the ActionType ({da322b8e-2116-4565-805a-03f7726373c8}) of ThingClass triggerButton - - - - - triggered - The name of the EventType ({51197853-0559-42a0-a97b-6ead56ae22f6}) of ThingClass triggerButton - - - - - button pressed - The name of the EventType ({effdbc2d-e467-4b0b-80a9-9dda251bfa5c}) of ThingClass button - - - - - ON/OFF Button - The name of the ThingClass ({430d188c-476d-4825-a9bd-86dfa3094b56}) - An/Aus Taster - - - diff --git a/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts b/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts deleted file mode 100644 index d76697c..0000000 --- a/genericelements/translations/6e22161e-39b7-4416-8623-39e730721efb-en_US.ts +++ /dev/null @@ -1,115 +0,0 @@ - - - - - GenericElements - - - Generic Elements - The name of the plugin GenericElements ({6e22161e-39b7-4416-8623-39e730721efb}) - - - - - nymea - The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) - - - - - - - state - The name of the ParamType (ThingClass: powerButton, ActionType: power, ID: {b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) ----------- -The name of the ParamType (ThingClass: powerButton, EventType: power, ID: {b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) ----------- -The name of the StateType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - Button - The name of the ThingClass ({820b2f2d-0d92-48c8-8fd4-f94ce8fc4103}) - - - - - Button name - The name of the ParamType (ThingClass: onOffButton, EventType: pressed, ID: {2e6bc343-41a3-4634-b514-4512ae54afbc}) - - - - - Button pressed - The name of the EventType ({4eeba6a2-e4c7-4a2e-8360-2797d98114e6}) of ThingClass onOffButton - - - - - Power Button - The name of the ThingClass ({c0f511f9-70f5-499b-bd70-2c0e9ddd68c4}) - - - - - Trigger button - The name of the ThingClass ({5f91923e-fc8e-48db-9de7-9a2fc36798dd}) - - - - - off - The name of the ActionType ({a8d64050-0b58-4ccf-b052-77ce2b7368ad}) of ThingClass onOffButton - - - - - on - The name of the ActionType ({892596d2-0863-4807-97da-469b9f7003f2}) of ThingClass onOffButton - - - - - power changed - The name of the EventType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - press - The name of the ActionType ({01f38af1-b2ab-4ec3-844e-ef52f0f229a9}) of ThingClass button - - - - - set power - The name of the ActionType ({b5e90567-54aa-49bd-a78a-3c19fb38aaf5}) of ThingClass powerButton - - - - - trigger - The name of the ActionType ({da322b8e-2116-4565-805a-03f7726373c8}) of ThingClass triggerButton - - - - - triggered - The name of the EventType ({51197853-0559-42a0-a97b-6ead56ae22f6}) of ThingClass triggerButton - - - - - button pressed - The name of the EventType ({effdbc2d-e467-4b0b-80a9-9dda251bfa5c}) of ThingClass button - - - - - ON/OFF Button - The name of the ThingClass ({430d188c-476d-4825-a9bd-86dfa3094b56}) - - - - diff --git a/genericenergy/README.md b/genericenergy/README.md new file mode 100644 index 0000000..99b20d1 --- /dev/null +++ b/genericenergy/README.md @@ -0,0 +1,11 @@ +# Generic energy devices + +This plugin allows to create generic energy related things in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs or MQTT. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO or MQTT plugins. +When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs or nymea scripts to fill in the thing states accordingly. diff --git a/genericenergy/genericenergy.pro b/genericenergy/genericenergy.pro new file mode 100644 index 0000000..fdf5775 --- /dev/null +++ b/genericenergy/genericenergy.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericenergy.cpp + +HEADERS += \ + integrationplugingenericenergy.h + + + diff --git a/genericenergy/integrationplugingenericenergy.cpp b/genericenergy/integrationplugingenericenergy.cpp new file mode 100644 index 0000000..5bec43c --- /dev/null +++ b/genericenergy/integrationplugingenericenergy.cpp @@ -0,0 +1,142 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericenergy.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericEnergy::IntegrationPluginGenericEnergy() +{ + +} + +void IntegrationPluginGenericEnergy::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + if (thing->thingClassId() == smartMeterThingClassId) { + + QTimer* smartMeterTimer = new QTimer(this); + int timeframe = thing->setting(smartMeterSettingsImpulseTimeframeParamTypeId).toInt(); + smartMeterTimer->setInterval(timeframe * 1000); + m_smartMeterTimer.insert(thing, smartMeterTimer); + smartMeterTimer->start(); + connect(thing, &Thing::settingChanged, smartMeterTimer, [smartMeterTimer] (const ParamTypeId ¶mTypeId, const QVariant &value) { + if (paramTypeId == smartMeterSettingsImpulseTimeframeParamTypeId) { + smartMeterTimer->setInterval(value.toInt() * 1000); + } + }); + + connect(smartMeterTimer, &QTimer::timeout, thing, [this, smartMeterTimer, thing] { + double impulsePerKwh = thing->setting(smartMeterSettingsImpulsePerKwhParamTypeId).toDouble(); + int interval = smartMeterTimer->interval()/1000; + double power = (m_pulsesPerTimeframe.value(thing)/impulsePerKwh)/(interval/3600.00); // Power = Energy/Time; Energy = Impulses/ImpPerkWh + thing->setStateValue(smartMeterCurrentPowerStateTypeId, power*1000); + m_pulsesPerTimeframe.insert(thing, 0); + }); + } else if (thing->thingClassId() == batteryThingClassId) { + connect(thing, &Thing::settingChanged, [thing](const ParamTypeId &settingTypeId, const QVariant &value){ + if (settingTypeId == batterySettingsCriticalLevelParamTypeId) { + int currentBatteryLevel = thing->stateValue(batteryBatteryLevelStateTypeId).toInt(); + thing->setStateValue(batteryBatteryCriticalStateTypeId, currentBatteryLevel <= value.toInt()); + } + }); + } + + // Fall trough, if not already finished and returned... + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericEnergy::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == socketThingClassId) { + if (action.actionTypeId() == socketPowerActionTypeId) { + thing->setStateValue(socketPowerStateTypeId, action.param(socketPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == lightThingClassId) { + if (action.actionTypeId() == lightPowerActionTypeId) { + thing->setStateValue(lightPowerStateTypeId, action.param(lightPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == smartMeterThingClassId) { + if (action.actionTypeId() == smartMeterImpulseInputActionTypeId) { + bool value = info->action().param(smartMeterImpulseInputActionImpulseInputParamTypeId).value().toBool(); + thing->setStateValue(smartMeterImpulseInputStateTypeId, value); + int impulsePerKwh = info->thing()->setting(smartMeterSettingsImpulsePerKwhParamTypeId).toInt(); + if (value) { + double currentEnergy = thing->stateValue(smartMeterTotalEnergyConsumedStateTypeId).toDouble(); + thing->setStateValue(smartMeterTotalEnergyConsumedStateTypeId ,currentEnergy + (1.00/impulsePerKwh)); + m_pulsesPerTimeframe[thing]++; + } + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + + } else if (thing->thingClassId() == batteryThingClassId) { + if (action.actionTypeId() == batteryBatteryLevelControlActionTypeId) { + int value = action.paramValue(batteryBatteryLevelControlActionBatteryLevelControlParamTypeId).toInt(); + thing->setStateValue(batteryBatteryLevelStateTypeId, value); + thing->setStateValue(batteryBatteryLevelControlStateTypeId, value); + int criticalValue = thing->setting(batterySettingsCriticalLevelParamTypeId).toInt(); + thing->setStateValue(batteryBatteryCriticalStateTypeId, value <= criticalValue); + info->finish(Thing::ThingErrorNoError); + return; + } else if (action.actionTypeId() == batteryChargingActionTypeId) { + thing->setStateValue(batteryChargingStateTypeId, action.paramValue(batteryChargingActionChargingParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} + +void IntegrationPluginGenericEnergy::thingRemoved(Thing *thing) +{ + if (thing->thingClassId() == smartMeterThingClassId) { + m_pulsesPerTimeframe.remove(thing); + } else if (thing->thingClassId() == smartMeterThingClassId) { + m_smartMeterTimer.take(thing)->deleteLater(); + m_pulsesPerTimeframe.remove(thing); + } +} diff --git a/genericenergy/integrationplugingenericenergy.h b/genericenergy/integrationplugingenericenergy.h new file mode 100644 index 0000000..45aae00 --- /dev/null +++ b/genericenergy/integrationplugingenericenergy.h @@ -0,0 +1,59 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICENERGY_H +#define INTEGRATIONPLUGINGENERICENERGY_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericEnergy: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericenergy.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericEnergy(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; + void thingRemoved(Thing *thing) override; + +private: + QHash m_pulsesPerTimeframe; + + QHash m_smartMeterTimer; +}; + +#endif // INTEGRATIONPLUGINGENERICENERGY_H diff --git a/genericenergy/integrationplugingenericenergy.json b/genericenergy/integrationplugingenericenergy.json new file mode 100644 index 0000000..5201f90 --- /dev/null +++ b/genericenergy/integrationplugingenericenergy.json @@ -0,0 +1,177 @@ +{ + "name": "genericEnergy", + "displayName": "Generic energy devices", + "id": "b3188696-2585-4806-bf98-30ab576ce5c8", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "4e7261af-a27b-4446-8346-914ea59f7547", + "name": "socket", + "displayName": "Generic power socket", + "createMethods": ["user"], + "interfaces": ["powersocket"], + "stateTypes": [ + { + "id": "018038d7-1d02-4b17-8fe3-babca044b087", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "c50d3216-f307-4f9f-8190-4391510c385c", + "name": "light", + "displayName": "Generic light", + "createMethods": ["user"], + "interfaces": ["light"], + "stateTypes": [ + { + "id": "8b6e4a67-6522-408b-b676-8d2f09ed2d54", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "c3123967-f741-4fe1-a0d4-9a3e405d7e52", + "name": "smartMeter", + "displayName": "Impulse based energy meter", + "createMethods": ["user"], + "interfaces": ["smartmeterconsumer"], + "settingsTypes": [ + { + "id": "c361732b-68eb-447e-a434-e84031231871", + "name": "impulsePerKwh", + "displayName": "Impulse/kWh", + "type": "int", + "minValue": 1, + "maxValue": 1000000, + "defaultValue": 1000 + }, + { + "id": "73c9acc3-8f76-40d7-a79b-a1f08bb308d4", + "name": "impulseTimeframe", + "displayName": "Timeframe for power calculation", + "type": "int", + "unit": "Seconds", + "minValue": 1, + "maxValue": 600, + "defaultValue": 10 + } + ], + "stateTypes": [ + { + "id": "5983d714-5f80-42d8-bee2-9228b6382b3b", + "name": "currentPower", + "displayName": "Current Power usage", + "displayNameEvent": "Current Power usage changed", + "type": "double", + "defaultValue": 0.00, + "unit": "Watt" + }, + { + "id": "5821edb7-e6cb-4e5a-9d0b-3375126d3367", + "name": "totalEnergyConsumed", + "displayName": "Energy", + "displayNameEvent": "Energy changed", + "type": "double", + "defaultValue": 0.00, + "unit": "KiloWattHour" + }, + { + "id": "9cd7e5ca-f8f8-48d5-9785-911ae75158c3", + "name": "impulseInput", + "displayName": "Impulse input", + "displayNameEvent": "Impulse input changed", + "displayNameAction": "Set impulse input", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalOutput" + } + ] + }, + { + "id": "81418556-cae3-4803-aa0c-9c4b3304a3eb", + "name": "battery", + "displayName": "Generic battery", + "createMethods": ["user"], + "interfaces": ["battery"], + "settingsTypes": [ + { + "id": "8d875cb7-3a14-42d1-bf1b-759e5fd95a8f", + "name": "criticalLevel", + "displayName": "Critical battery level", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 10 + } + ], + "stateTypes": [ + { + "id": "d37eed4a-befc-40d4-b435-40a761f99314", + "name": "batteryLevel", + "displayName": "Battery level", + "displayNameEvent": "Battery level changed", + "type": "int", + "unit": "Percentage", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100 + }, + { + "id": "3336f0c2-158b-4353-b74f-f1bb9c4e8447", + "name": "batteryLevelControl", + "displayName": "Battery level control", + "displayNameEvent": "Battery level control changed", + "displayNameAction": "Set battery level", + "type": "double", + "minValue": 0, + "maxValue": 100, + "defaultValue": 0, + "unit": "Percentage", + "writable": true, + "ioType": "analogOutput" + }, + { + "id": "a61c0328-b982-46a5-9cc0-b4fa4d0ab84d", + "name": "charging", + "displayName": "Charging", + "displayNameEvent": "Charging started or stopped", + "displayNameAction": "Set charging", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalOutput" + }, + { + "id": "e95dc037-002d-40a2-8c15-cd5489bd354a", + "name": "batteryCritical", + "displayName": "Battery critical", + "displayNameEvent": "Battery entered or left critical state", + "type": "bool", + "defaultValue": false + } + ] + } + ] + } + ] +} diff --git a/genericenergy/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts b/genericenergy/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts new file mode 100644 index 0000000..8c7a74b --- /dev/null +++ b/genericenergy/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts @@ -0,0 +1,154 @@ + + + + + GenericThings + + + Battery critical + The name of the StateType ({e95dc037-002d-40a2-8c15-cd5489bd354a}) of ThingClass battery + + + + + Battery level + The name of the StateType ({d37eed4a-befc-40d4-b435-40a761f99314}) of ThingClass battery + + + + + + Battery level control + The name of the ParamType (ThingClass: battery, ActionType: batteryLevelControl, ID: {3336f0c2-158b-4353-b74f-f1bb9c4e8447}) +---------- +The name of the StateType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery + + + + + + Charging + The name of the ParamType (ThingClass: battery, ActionType: charging, ID: {a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) +---------- +The name of the StateType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery + + + + + Critical battery level + The name of the ParamType (ThingClass: battery, Type: settings, ID: {8d875cb7-3a14-42d1-bf1b-759e5fd95a8f}) + + + + + Current Power usage + The name of the StateType ({5983d714-5f80-42d8-bee2-9228b6382b3b}) of ThingClass smartMeter + + + + + Energy + The name of the StateType ({5821edb7-e6cb-4e5a-9d0b-3375126d3367}) of ThingClass smartMeter + + + + + Generic Things + The name of the plugin GenericThings ({b3188696-2585-4806-bf98-30ab576ce5c8}) + + + + + Generic battery + The name of the ThingClass ({81418556-cae3-4803-aa0c-9c4b3304a3eb}) + + + + + Generic light + The name of the ThingClass ({c50d3216-f307-4f9f-8190-4391510c385c}) + + + + + Generic power socket + The name of the ThingClass ({4e7261af-a27b-4446-8346-914ea59f7547}) + + + + + Impulse based energy meter + The name of the ThingClass ({c3123967-f741-4fe1-a0d4-9a3e405d7e52}) + + + + + + Impulse input + The name of the ParamType (ThingClass: smartMeter, ActionType: impulseInput, ID: {9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) +---------- +The name of the StateType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter + + + + + Impulse/kWh + The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {c361732b-68eb-447e-a434-e84031231871}) + + + + + + + + Power + The name of the ParamType (ThingClass: light, ActionType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) +---------- +The name of the StateType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light +---------- +The name of the ParamType (ThingClass: socket, ActionType: power, ID: {018038d7-1d02-4b17-8fe3-babca044b087}) +---------- +The name of the StateType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket + + + + + Set battery level + The name of the ActionType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery + + + + + Set charging + The name of the ActionType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery + + + + + Set impulse input + The name of the ActionType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter + + + + + + Set power + The name of the ActionType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light +---------- +The name of the ActionType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket + + + + + Timeframe for power calculation + The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {73c9acc3-8f76-40d7-a79b-a1f08bb308d4}) + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericgarages/README.md b/genericgarages/README.md new file mode 100644 index 0000000..4eab5ee --- /dev/null +++ b/genericgarages/README.md @@ -0,0 +1,35 @@ +# Generic garages + +This plugin allows to create generic garages in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs. + +There are three types of garages supported: + +### Impulse based garages +Those garages are used for garage door drivers that have an impulse input which would toggle +opening/closing every time an impulse is sent to the input. + +### Simple garage doors +Those garages usually have two inputs. One opening the garage, the other closing it. + +## Stateful garage doors +The stateful garage doors thing is made for garages that support more complex interation, for example +via MQTT or a REST api. They can provide the current door position to nymea by setting the percentage +state in the generic stateful garage thing. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin or +the USB relay. When done, set up the desired generic garage and use the things settings to connect +the inputs and/or outputs accordingly. + +### Example: A simple garage on digital output GPIOs + +First, set up two GPIO to control the garage door drivers inputs. Please refer to the documentation of the +according plugin for this. Once the garage door can be controlled by nymea using the raw +GPIO toggle, set up a generic simple garage from this plugin and go to the settings of the +newly added generic simple garage. In there, you'll find a section for Input/Output connections +which can be used to connect the power state of this generic light to the GPIOs that +actually control the garage. The garage can now be used like any other ready-made garage +device in nymea. diff --git a/genericgarages/genericgarages.pro b/genericgarages/genericgarages.pro new file mode 100644 index 0000000..635c0de --- /dev/null +++ b/genericgarages/genericgarages.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericgarages.cpp + +HEADERS += \ + integrationplugingenericgarages.h + + + diff --git a/genericgarages/integrationplugingenericgarages.cpp b/genericgarages/integrationplugingenericgarages.cpp new file mode 100644 index 0000000..0e7b9e0 --- /dev/null +++ b/genericgarages/integrationplugingenericgarages.cpp @@ -0,0 +1,155 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericgarages.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericGarages::IntegrationPluginGenericGarages() +{ + +} + +void IntegrationPluginGenericGarages::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + if (thing->thingClassId() == extendedStatefulGaragedoorThingClassId) { + uint openingDuration = thing->setting(extendedStatefulGaragedoorSettingsOpeningDurationParamTypeId).toUInt(); + QTimer* timer = new QTimer(this); + timer->setInterval(openingDuration/100.00); // closing timer / 100 to update on every percent + m_statefulGaragePercentageTimer.insert(thing, timer); + connect(thing, &Thing::settingChanged, thing, [timer] (const ParamTypeId ¶mTypeId, const QVariant &value) { + if (paramTypeId == extendedStatefulGaragedoorSettingsOpeningDurationParamTypeId) { + timer->setInterval(value.toUInt()/100.00); + } + }); + connect(timer, &QTimer::timeout, this, [thing, timer, this] { + uint currentPercentage = thing->stateValue(extendedStatefulGaragedoorPercentageStateTypeId).toUInt(); + uint targetPercentage = m_statefulGarageTargetPercentage.value(thing); + + if (currentPercentage < targetPercentage) { + currentPercentage++; + thing->setStateValue(extendedStatefulGaragedoorPercentageStateTypeId, currentPercentage); + thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, "closing"); + thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, true); + thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, false); + thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, true); + + } else if (currentPercentage > targetPercentage) { + currentPercentage--; + thing->setStateValue(extendedStatefulGaragedoorPercentageStateTypeId, currentPercentage); + thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, "opening"); + thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, true); + thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, true); + thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, false); + + } + + if (currentPercentage == targetPercentage){ + QString state = currentPercentage == 100 ? "open" : currentPercentage == 0 ? "closed" : "intermediate"; + thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, state); + thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, false); + thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, false); + thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, false); + qCDebug(dcGenericGarages()) << "Stopping garage timer"; + timer->stop(); + } + }); + } + + // Fall trough, if not already finished and returned... + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericGarages::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == impulseGaragedooorThingClassId) { + if (action.actionTypeId() == impulseGaragedooorTriggerImpulseActionTypeId) { + uint duration = thing->setting(impulseGaragedooorSettingsImpulseDurationParamTypeId).toUInt(); + thing->setStateValue(impulseGaragedooorImpulseStateTypeId, true); + QTimer::singleShot(duration, thing, [thing](){ + thing->setStateValue(impulseGaragedooorImpulseStateTypeId, false); + }); + info->finish(Thing::ThingErrorNoError); + return; + } + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } else if (thing->thingClassId() == simpleGaragedoorThingClassId) { + if (action.actionTypeId() == simpleGaragedoorOpenActionTypeId) { + thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, false); + thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, true); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == simpleGaragedoorCloseActionTypeId) { + thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, false); + thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, true); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == simpleGaragedoorStopActionTypeId) { + thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, false); + thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, false); + info->finish(Thing::ThingErrorNoError); + return; + } + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } else if (thing->thingClassId() == extendedStatefulGaragedoorThingClassId) { + if (action.actionTypeId() == extendedStatefulGaragedoorOpenActionTypeId) { + m_statefulGarageTargetPercentage[thing] = 0; + m_statefulGaragePercentageTimer[thing]->start(); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == extendedStatefulGaragedoorCloseActionTypeId) { + m_statefulGarageTargetPercentage[thing] = 100; + m_statefulGaragePercentageTimer[thing]->start(); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == extendedStatefulGaragedoorStopActionTypeId) { + m_statefulGarageTargetPercentage[thing] = thing->stateValue(extendedStatefulGaragedoorPercentageStateTypeId).toUInt(); + info->finish(Thing::ThingErrorNoError); + return; + } + + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} diff --git a/genericgarages/integrationplugingenericgarages.h b/genericgarages/integrationplugingenericgarages.h new file mode 100644 index 0000000..2c1c61f --- /dev/null +++ b/genericgarages/integrationplugingenericgarages.h @@ -0,0 +1,58 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICGARAGES_H +#define INTEGRATIONPLUGINGENERICGARAGES_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericGarages: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericgarages.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericGarages(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; + +private: + QHash m_statefulGaragePercentageTimer; + QHash m_statefulGarageTargetPercentage; + +}; + +#endif // INTEGRATIONPLUGINGENERICGARAGES_H diff --git a/genericgarages/integrationplugingenericgarages.json b/genericgarages/integrationplugingenericgarages.json new file mode 100644 index 0000000..09f4989 --- /dev/null +++ b/genericgarages/integrationplugingenericgarages.json @@ -0,0 +1,175 @@ +{ + "name": "genericGarages", + "displayName": "Generic garages", + "id": "5049e7d8-bed7-43c6-9107-b0c1c558ae35", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "d6699a12-f4a6-4c50-951c-f4f1cd0501dc", + "name": "impulseGaragedooor", + "displayName": "Impulse based garage door", + "createMethods": ["user"], + "interfaces": ["impulsegaragedoor"], + "settingsTypes": [ + { + "id": "962b356c-e975-4d33-b114-10f655eaf74c", + "name": "impulseDuration", + "displayName": "Impulse duration", + "type": "uint", + "defaultValue": "200" + } + ], + "actionTypes": [ + { + "id": "ff5461c6-70fc-435e-8424-96fa59ed321e", + "name": "triggerImpulse", + "displayName": "Operate" + } + ], + "stateTypes": [ + { + "id": "5ccaf0aa-01a4-441f-b6ca-18940da096a5", + "name": "impulse", + "displayName": "Impulse", + "displayNameEvent": "Impulse changed", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput" + } + ] + }, + { + "id": "572403b1-bc22-4620-8170-53147a546033", + "name": "simpleGaragedoor", + "displayName": "Simple garage door", + "createMethods": ["user"], + "interfaces": ["simplegaragedoor"], + "actionTypes": [ + { + "id": "3edb25af-ad51-495b-9ac9-ab97669339b7", + "name": "open", + "displayName": "Open" + }, + { + "id": "1111c0ed-69b6-480c-9fd5-15292600d4f4", + "name": "close", + "displayName": "Close" + }, + { + "id": "f346766f-44ee-452b-bb9c-e89ec0f56016", + "name": "stop", + "displayName": "Stop" + } + ], + "stateTypes": [ + { + "id": "fcd421eb-54f2-4195-bdef-ffa69e9dcc57", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput" + }, + { + "id": "44ef060a-e6fc-4f33-84d2-b24ac7d31ff1", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput" + } + ] + }, + { + "id": "7341e689-4495-4422-851a-3e7c790394b8", + "name": "extendedStatefulGaragedoor", + "displayName": "Garage door with position control", + "createMethods": ["user"], + "interfaces": ["extendedstatefulgaragedoor"], + "settingsTypes": [ + { + "id": "04fb7724-a870-4df9-a79e-fab693931238", + "name": "openingDuration", + "displayName": "Opening duration [ms]", + "type": "uint", + "minValue": 1000, + "defaultValue": 5000 + } + ], + "stateTypes": [ + { + "id": "0cc74edb-7116-47cf-953a-409933f26557", + "name": "state", + "displayName": "State", + "displayNameEvent": "State changed", + "type": "QString", + "possibleValues": ["open", "closed", "opening", "closing", "intermediate"], + "defaultValue": "closed" + }, + { + "id": "963bed3d-2ccb-4dd0-b609-c7e9f25d32d6", + "name": "moving", + "displayName": "Moving", + "displayNameEvent": "Moving changed", + "type": "bool", + "defaultValue": false + }, + { + "id": "f9244c14-0bc9-49ce-90a5-437e66245594", + "name": "percentage", + "displayName": "Open position", + "displayNameEvent": "Open position changed", + "displayNameAction": "Set open position", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 100, + "writable": true + }, + { + "id": "ecc799c7-4d74-4d1f-94e5-2d74e77493ae", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput" + }, + { + "id": "e1c14bcd-6131-494b-8dd1-46738e9c8f5e", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput" + } + ], + "actionTypes": [ + { + "id": "4a3a3b88-47e9-436f-86be-b5955f3fc2f7", + "name": "open", + "displayName": "Open" + }, + { + "id": "2420fcdb-03d3-4edb-aa89-e3b93c7d6d18", + "name": "close", + "displayName": "Close" + }, + { + "id": "109c3eaf-26a0-4121-8be2-1363253178fd", + "name": "stop", + "displayName": "Stop" + } + ] + } + ] + } + ] +} diff --git a/genericgarages/translations/5049e7d8-bed7-43c6-9107-b0c1c558ae35-en_US.ts b/genericgarages/translations/5049e7d8-bed7-43c6-9107-b0c1c558ae35-en_US.ts new file mode 100644 index 0000000..2bc028c --- /dev/null +++ b/genericgarages/translations/5049e7d8-bed7-43c6-9107-b0c1c558ae35-en_US.ts @@ -0,0 +1,199 @@ + + + + + GenericThings + + + + Close + The name of the ActionType ({2420fcdb-03d3-4edb-aa89-e3b93c7d6d18}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the ActionType ({1111c0ed-69b6-480c-9fd5-15292600d4f4}) of ThingClass simpleGaragedoor + + + + + + + + Closing output + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: closingOutput, ID: {e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) +---------- +The name of the StateType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the ParamType (ThingClass: simpleGaragedoor, EventType: closingOutput, ID: {44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) +---------- +The name of the StateType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor + + + + + + Closing output changed + The name of the EventType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the EventType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor + + + + + Garage door with position control + The name of the ThingClass ({7341e689-4495-4422-851a-3e7c790394b8}) + + + + + Generic Things + The name of the plugin GenericThings ({5049e7d8-bed7-43c6-9107-b0c1c558ae35}) + + + + + + Impulse + The name of the ParamType (ThingClass: impulseGaragedooor, EventType: impulse, ID: {5ccaf0aa-01a4-441f-b6ca-18940da096a5}) +---------- +The name of the StateType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor + + + + + Impulse based garage door + The name of the ThingClass ({d6699a12-f4a6-4c50-951c-f4f1cd0501dc}) + + + + + Impulse changed + The name of the EventType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor + + + + + Impulse duration + The name of the ParamType (ThingClass: impulseGaragedooor, Type: settings, ID: {962b356c-e975-4d33-b114-10f655eaf74c}) + + + + + + Moving + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: moving, ID: {963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) +---------- +The name of the StateType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor + + + + + Moving changed + The name of the EventType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor + + + + + + Open + The name of the ActionType ({4a3a3b88-47e9-436f-86be-b5955f3fc2f7}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the ActionType ({3edb25af-ad51-495b-9ac9-ab97669339b7}) of ThingClass simpleGaragedoor + + + + + + + Open position + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, ActionType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) +---------- +The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) +---------- +The name of the StateType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor + + + + + Open position changed + The name of the EventType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor + + + + + Opening duration [ms] + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, Type: settings, ID: {04fb7724-a870-4df9-a79e-fab693931238}) + + + + + + + + Opening output + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: openingOutput, ID: {ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) +---------- +The name of the StateType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the ParamType (ThingClass: simpleGaragedoor, EventType: openingOutput, ID: {fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) +---------- +The name of the StateType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor + + + + + + Opening output changed + The name of the EventType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the EventType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor + + + + + Operate + The name of the ActionType ({ff5461c6-70fc-435e-8424-96fa59ed321e}) of ThingClass impulseGaragedooor + + + + + Set open position + The name of the ActionType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor + + + + + Simple garage door + The name of the ThingClass ({572403b1-bc22-4620-8170-53147a546033}) + + + + + + State + The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: state, ID: {0cc74edb-7116-47cf-953a-409933f26557}) +---------- +The name of the StateType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor + + + + + State changed + The name of the EventType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor + + + + + + Stop + The name of the ActionType ({109c3eaf-26a0-4121-8be2-1363253178fd}) of ThingClass extendedStatefulGaragedoor +---------- +The name of the ActionType ({f346766f-44ee-452b-bb9c-e89ec0f56016}) of ThingClass simpleGaragedoor + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericheatingcooling/README.md b/genericheatingcooling/README.md new file mode 100644 index 0000000..4504dd0 --- /dev/null +++ b/genericheatingcooling/README.md @@ -0,0 +1,21 @@ +# Generic heating & cooling devices + +This plugin allows to create generic heating and cooling devices in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin. +When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs accordingly. + +### Example: A heating rod on a digital output GPIO + +First, set up the GPIO to control the heating rod. Please refer to the documentation of the +according plugin for this. Once the heating rod can be controlled by nymea using the raw +GPIO toggle, set up a generic heating thing from this plugin and go to the settings of the +newly added generic heating thing. In there, you'll find a section for Input/Output connections +which can be used to connect the power state of this generic thing to the GPIO that +actually controls the heating rod. The heating rod can now be used like any other ready-made thing +in nymea. diff --git a/genericheatingcooling/genericheatingcooling.pro b/genericheatingcooling/genericheatingcooling.pro new file mode 100644 index 0000000..5222f25 --- /dev/null +++ b/genericheatingcooling/genericheatingcooling.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericheatingcooling.cpp + +HEADERS += \ + integrationplugingenericheatingcooling.h + + + diff --git a/genericheatingcooling/integrationplugingenericheatingcooling.cpp b/genericheatingcooling/integrationplugingenericheatingcooling.cpp new file mode 100644 index 0000000..8e7e153 --- /dev/null +++ b/genericheatingcooling/integrationplugingenericheatingcooling.cpp @@ -0,0 +1,251 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericheatingcooling.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericHeatingCooling::IntegrationPluginGenericHeatingCooling() +{ + +} + +void IntegrationPluginGenericHeatingCooling::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + if (thing->thingClassId() == thermostatThingClassId) { + thermostatCheckPowerOutputState(thing); // check the initial values + connect(thing, &Thing::settingChanged, thing, [this, thing] (const ParamTypeId ¶mTypeId, const QVariant &value) { + Q_UNUSED(value) + if (paramTypeId == thermostatSettingsTemperatureDifferenceParamTypeId) { + thermostatCheckPowerOutputState(thing); + } + }); + } else if (thing->thingClassId() == sgReadyThingClassId) { + bool relay1 = thing->stateValue(sgReadyRelay1StateTypeId).toBool(); + bool relay2 = thing->stateValue(sgReadyRelay2StateTypeId).toBool(); + QString operatingModeString = sgReadyOperatingMode(relay1, relay2); + thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingModeString); + thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingModeString)); + } + + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericHeatingCooling::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == heatingThingClassId) { + if (action.actionTypeId() == heatingPowerActionTypeId) { + thing->setStateValue(heatingPowerStateTypeId, action.param(heatingPowerActionPowerParamTypeId).value()); + return info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == ventilationThingClassId) { + if (action.actionTypeId() == ventilationPowerActionTypeId) { + thing->setStateValue(ventilationPowerStateTypeId, action.param(ventilationPowerActionPowerParamTypeId).value()); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == ventilationFlowThingClassId) { + if (action.actionTypeId() == ventilationFlowPowerActionTypeId) { + thing->setStateValue(ventilationFlowPowerStateTypeId, action.param(ventilationFlowPowerActionPowerParamTypeId).value()); + info->finish(Thing::ThingErrorNoError); + return; + } else if (action.actionTypeId() == ventilationFlowFlowRateActionTypeId) { + thing->setStateValue(ventilationFlowFlowRateStateTypeId, action.param(ventilationFlowFlowRateActionFlowRateParamTypeId).value()); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + + } else if (thing->thingClassId() == thermostatThingClassId) { + if (action.actionTypeId() == thermostatTemperatureActionTypeId) { + thing->setStateValue(thermostatTemperatureStateTypeId, action.param(thermostatTemperatureActionTemperatureParamTypeId).value()); + } else if (action.actionTypeId() == thermostatTargetTemperatureActionTypeId) { + double minSetting = thing->setting(thermostatSettingsMinTargetTemperatureParamTypeId).toDouble(); + double maxSetting = thing->setting(thermostatSettingsMaxTargetTemperatureParamTypeId).toDouble(); + double newTemp = action.param(thermostatTargetTemperatureActionTargetTemperatureParamTypeId).value().toDouble(); + newTemp = qMax(newTemp, minSetting); + newTemp = qMin(newTemp, maxSetting); + thing->setStateValue(thermostatTargetTemperatureStateTypeId, newTemp); + } else if (action.actionTypeId() == thermostatHeatingOnActionTypeId) { + thing->setStateValue(thermostatHeatingOnStateTypeId, action.param(thermostatHeatingOnActionHeatingOnParamTypeId).value()); + } else if (action.actionTypeId() == thermostatCoolingOnActionTypeId) { + thing->setStateValue(thermostatCoolingOnStateTypeId, action.param(thermostatCoolingOnActionCoolingOnParamTypeId).value()); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + thermostatCheckPowerOutputState(thing); + info->finish(Thing::ThingErrorNoError); + return; + + } else if (thing->thingClassId() == heatingThingClassId) { + if (action.actionTypeId() == heatingPowerActionTypeId) { + thing->setStateValue(heatingPowerStateTypeId, action.paramValue(heatingPowerActionPowerParamTypeId).toBool()); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + info->finish(Thing::ThingErrorNoError); + return; + + } else if (thing->thingClassId() == coolingThingClassId) { + if (action.actionTypeId() == coolingPowerActionTypeId) { + thing->setStateValue(coolingPowerStateTypeId, action.paramValue(coolingPowerActionPowerParamTypeId).toBool()); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + info->finish(Thing::ThingErrorNoError); + return; + + } else if (thing->thingClassId() == sgReadyThingClassId) { + if (action.actionTypeId() == sgReadyRelay1ActionTypeId) { + thing->setStateValue(sgReadyRelay1StateTypeId, action.param(sgReadyRelay1ActionRelay1ParamTypeId).value()); + QString operatingMode = sgReadyOperatingMode(thing->stateValue(sgReadyRelay1StateTypeId).toBool(), thing->stateValue(sgReadyRelay2StateTypeId).toBool()); + thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); + thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == sgReadyRelay2ActionTypeId) { + thing->setStateValue(sgReadyRelay2StateTypeId, action.param(sgReadyRelay2ActionRelay2ParamTypeId).value()); + QString operatingMode = sgReadyOperatingMode(thing->stateValue(sgReadyRelay1StateTypeId).toBool(), thing->stateValue(sgReadyRelay2StateTypeId).toBool()); + thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); + thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == sgReadySgReadyModeActionTypeId) { + QString operatingMode = action.paramValue(sgReadySgReadyModeActionSgReadyModeParamTypeId).toString(); + thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); + thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); + if (operatingMode == "Off") { + thing->setStateValue(sgReadyRelay1StateTypeId, true); + thing->setStateValue(sgReadyRelay2StateTypeId, false); + } else if (operatingMode == "Low") { + thing->setStateValue(sgReadyRelay1StateTypeId, false); + thing->setStateValue(sgReadyRelay2StateTypeId, false); + } else if (operatingMode == "Standard") { + thing->setStateValue(sgReadyRelay1StateTypeId, false); + thing->setStateValue(sgReadyRelay2StateTypeId, true); + } else if (operatingMode == "High") { + thing->setStateValue(sgReadyRelay1StateTypeId, true); + thing->setStateValue(sgReadyRelay2StateTypeId, true); + } + info->finish(Thing::ThingErrorNoError); + return; + } + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } else if (thing->thingClassId() == simpleHeatPumpThingClassId) { + if (action.actionTypeId() == simpleHeatPumpPowerActionTypeId) { + thing->setStateValue(simpleHeatPumpPowerStateTypeId, action.paramValue(simpleHeatPumpPowerActionPowerParamTypeId).toBool()); + info->finish(Thing::ThingErrorNoError); + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} + +void IntegrationPluginGenericHeatingCooling::thermostatCheckPowerOutputState(Thing *thing) +{ + double targetTemperature = thing->stateValue(thermostatTargetTemperatureStateTypeId).toDouble(); + double actualTemperature = thing->stateValue(thermostatTemperatureStateTypeId).toDouble(); + double temperatureDifference = thing->setting(thermostatSettingsTemperatureDifferenceParamTypeId).toDouble(); + if (actualTemperature <= (targetTemperature-temperatureDifference)) { + thing->setStateValue(thermostatHeatingOnStateTypeId, true); + } else if (actualTemperature >= targetTemperature) { + thing->setStateValue(thermostatHeatingOnStateTypeId, false); + } + if (actualTemperature >= (targetTemperature+temperatureDifference)) { + thing->setStateValue(thermostatCoolingOnStateTypeId, true); + } else if (actualTemperature <= targetTemperature) { + thing->setStateValue(thermostatCoolingOnStateTypeId, false); + } +} + +QString IntegrationPluginGenericHeatingCooling::sgReadyOperatingModeDescription(const QString &operatingModeString) +{ + if (operatingModeString == "Off") { + return "Stop heating."; + } else if (operatingModeString == "Low") { + return "Normal mode, with partial heat storage filling."; + } else if (operatingModeString == "Standard") { + return "Increased room and heat storage temperature."; + } else if (operatingModeString == "High") { + return "Start heating."; + } + return QString("Unknown operating mode %1").arg(operatingModeString); +} + +QString IntegrationPluginGenericHeatingCooling::sgReadyOperatingMode(bool relay1, bool relay2) +{ + if (relay1 && !relay2) { + /* + * Operating state 1 (Relay state: 1: 0): + * This operating state is downward compatible with the often fixed times + * activated EVU lock and includes a maximum of 2 hours of "hard" lock time. + */ + return "Off"; + } else if (!relay1 && !relay2) { + /* + * Operating state 2 (Relay state: 0: 0): + * In this circuit, the heat pump runs in energy-efficient normal mode + * with partial heat storage filling for the maximum two-hour EVU lock. + */ + return "Low"; + } else if (!relay1 && relay2) { + /* + * Operating state 3 (Relay state: 0: 1): + * In this operating state, the heat pump within the controller runs in amplified mode + * Operation for space heating and hot water preparation. It's not one + * definitive start-up command, but a switch-on recommendation according to the current increase. + */ + return "Standard"; + } else { + /* + * Operating state 4 (Relay state 1: 1): + * This is a definitive start-up command, insofar as this is possible within the framework of the rule settings. + * For this operating state, different control models must be set on the controller for different tariff and usage models: + * Variant 1: The heat pump (compressor) is actively switched on. + * Variant 2: The heat pump (compressor and electrical auxiliary heating) is actively switched on, optional: higher temperature in the heat storage + */ + return "High"; + } +} diff --git a/genericheatingcooling/integrationplugingenericheatingcooling.h b/genericheatingcooling/integrationplugingenericheatingcooling.h new file mode 100644 index 0000000..3f2d304 --- /dev/null +++ b/genericheatingcooling/integrationplugingenericheatingcooling.h @@ -0,0 +1,59 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICHEATINGCOOLING_H +#define INTEGRATIONPLUGINGENERICHEATINGCOOLING_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericHeatingCooling: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericheatingcooling.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericHeatingCooling(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; + +private: + void thermostatCheckPowerOutputState(Thing *thing); + + QString sgReadyOperatingMode(bool relay1, bool relay2); + QString sgReadyOperatingModeDescription(const QString &operatingModeString); +}; + +#endif // INTEGRATIONPLUGINGENERICHEATINGCOOLING_H diff --git a/genericheatingcooling/integrationplugingenericheatingcooling.json b/genericheatingcooling/integrationplugingenericheatingcooling.json new file mode 100644 index 0000000..b1d16f3 --- /dev/null +++ b/genericheatingcooling/integrationplugingenericheatingcooling.json @@ -0,0 +1,279 @@ +{ + "name": "genericHeatingCooling", + "displayName": "Generic heating & cooling devices", + "id": "0d582885-8295-41bc-99fb-b4bcee4f626c", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "392854c4-3d14-4cf8-96cd-d933526bd197", + "name": "heating", + "displayName": "Generic heating", + "createMethods": ["user"], + "interfaces": ["heating"], + "stateTypes": [ + { + "id": "409b635e-a754-4b5c-b3f0-d1c5a0fb3f03", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Power changed", + "displayNameAction": "Set power", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "24af8dd3-ddf0-47f0-bf09-70fdfd8dceab", + "name": "ventilation", + "displayName": "Generic ventilation", + "createMethods": ["user"], + "interfaces": ["ventilation"], + "stateTypes": [ + { + "id": "846711b7-ea5a-4c66-a267-001c60406509", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Turned on or off", + "displayNameAction": "Turn on or off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "a7eec5f7-3cc3-4edb-baa7-1f6b6f935bf8", + "name": "ventilationFlow", + "displayName": "Generic ventilation with flow control", + "createMethods": ["user"], + "interfaces": ["ventilation"], + "stateTypes": [ + { + "id": "adf9a8dd-da13-4070-a3bd-9d4be26ebcd1", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Turned on or off", + "displayNameAction": "Turn on or off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "5a273bba-0bef-49fb-870a-7f2df8fc14b6", + "name": "flowRate", + "displayName": "Air flow rate", + "displayNameEvent": "Air flow rate changed", + "displayNameAction": "Set air flow rate", + "type": "int", + "minValue": 0, + "maxValue": 100, + "unit": "Percentage", + "writable": true, + "defaultValue": 0, + "ioType": "analogOutput" + } + ] + }, + { + "id": "6a34ba99-e5ec-4fc9-a61f-695ed8573fa1", + "name": "thermostat", + "displayName": "Generic thermostat", + "createMethods": ["user"], + "interfaces": ["thermostat"], + "settingsTypes": [ + { + "id": "64bf308f-a543-4e02-b787-1a1714c1f978", + "name": "temperatureDifference", + "displayName": "Temperature difference", + "type": "double", + "unit": "DegreeCelsius", + "minValue": 0.00, + "defaultValue": 2.00 + }, + { + "id": "67451c97-50e1-4ea6-ac43-4386fbd26698", + "name": "minTargetTemperature", + "displayName": "Minimum temperature", + "type": "double", + "unit": "DegreeCelsius", + "minValue": -20, + "maxValue": 49, + "defaultValue": -20 + }, + { + "id": "85608dd5-7e67-4c98-9e62-b97411681048", + "name": "maxTargetTemperature", + "displayName": "Maximum temperature", + "type": "double", + "unit": "DegreeCelsius", + "minValue": -19, + "maxValue": 50, + "defaultValue": 50 + } + ], + "stateTypes": [ + { + "id": "0f808803-0e63-47df-b024-9685998ba663", + "name": "temperature", + "displayName": "Temperature sensor input", + "displayNameEvent": "Temperature sensor input changed", + "displayNameAction": "Set temperature sensor input", + "type": "double", + "defaultValue": 0, + "minValue": -20, + "maxValue": 50, + "unit": "DegreeCelsius", + "writable": true, + "ioType": "analogOutput" + }, + { + "id": "60169ebf-c1e3-41ed-a1bb-4b858e93ec50", + "name": "targetTemperature", + "displayName": "Target temperature", + "displayNameEvent": "Target temperature changed", + "displayNameAction": "Set target temperature", + "type": "double", + "defaultValue": 21, + "minValue": -20, + "maxValue": 50, + "unit": "DegreeCelsius", + "writable": true, + "ioType": "analogInput" + }, + { + "id": "1f6a0c39-4417-4e31-86db-9926cf81c345", + "name": "heatingOn", + "displayName": "Heating On/off", + "displayNameEvent": "Heating turned on/off", + "displayNameAction": "Turn heating on/off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "cab7d4bd-f612-4d12-b3a4-0649e189810f", + "name": "coolingOn", + "displayName": "Cooling On/off", + "displayNameEvent": "Cooling turned on/off", + "displayNameAction": "Turn cooling on/off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "09edbc07-d382-48a4-9b16-99992014aff9", + "name": "cooling", + "displayName": "Generic cooler", + "createMethods": ["user"], + "interfaces": ["cooling"], + "stateTypes": [ + { + "id": "918cfd2c-6692-4faa-acc6-18ebf93611ec", + "name": "power", + "displayName": "Cooler on/off", + "displayNameEvent": "Cooler turned on/off", + "displayNameAction": "Turn cooler on/off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + }, + { + "id": "83cf138d-02dc-4015-9b03-6360c2f3cfb1", + "name": "sgReady", + "displayName": "SG-Ready", + "createMethods": ["user"], + "interfaces": [ "smartgridheatpump" ], + "settingsTypes": [ + ], + "stateTypes": [ + { + "id": "d080466e-7271-441f-9916-1199a6668545", + "name": "relay1", + "displayName": "Relay 1", + "displayNameEvent": "Relay 1 changed", + "displayNameAction": "Set relay 1", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "caf22937-fdf7-41e1-a87b-d11e66c4f4c6", + "name": "relay2", + "displayName": "Relay 2", + "displayNameEvent": "Relay 2 changed", + "displayNameAction": "Set relay 2", + "type": "bool", + "defaultValue": true, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab", + "name": "sgReadyMode", + "displayName": "Smart grid mode", + "displayNameEvent": "Smart grid mode changed", + "displayNameAction": "Set smart grid mode", + "type": "QString", + "possibleValues": [ + "Off", + "Low", + "Standard", + "High" + ], + "defaultValue": "Standard", + "writable": true, + "cached": true, + "suggestLogging": true + }, + { + "id": "b421d098-f6e9-40e2-b536-58acdb3a49fe", + "name": "operatingModeDescription", + "displayName": "Operating mode description", + "displayNameEvent": "Operating mode description changed", + "type": "QString", + "defaultValue": "" + } + ] + }, + { + "id": "9fdb33bb-8e38-4108-8234-3b1d07bbc801", + "name": "simpleHeatPump", + "displayName": "Generic simple heat pump", + "createMethods": ["user"], + "interfaces": ["simpleheatpump"], + "stateTypes": [ + { + "id": "ac2ac0f9-058c-4586-8871-2d9dbc6e1758", + "name": "power", + "displayName": "Heat pump enabled", + "displayNameEvent": "Heat pump power changed", + "displayNameAction": "Enable/Disable heat pump", + "type": "bool", + "writable": true, + "defaultValue": false, + "cached": true, + "ioType": "digitalInput", + "suggestLogging": true + } + ] + } + ] + } + ] +} diff --git a/genericheatingcooling/translations/0d582885-8295-41bc-99fb-b4bcee4f626c-en_US.ts b/genericheatingcooling/translations/0d582885-8295-41bc-99fb-b4bcee4f626c-en_US.ts new file mode 100644 index 0000000..cb9b1e8 --- /dev/null +++ b/genericheatingcooling/translations/0d582885-8295-41bc-99fb-b4bcee4f626c-en_US.ts @@ -0,0 +1,394 @@ + + + + + GenericThings + + + + + Air flow rate + The name of the ParamType (ThingClass: ventilationFlow, ActionType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) +---------- +The name of the ParamType (ThingClass: ventilationFlow, EventType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) +---------- +The name of the StateType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow + + + + + Air flow rate changed + The name of the EventType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow + + + + + + + Cooler on/off + The name of the ParamType (ThingClass: cooling, ActionType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) +---------- +The name of the ParamType (ThingClass: cooling, EventType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) +---------- +The name of the StateType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling + + + + + Cooler turned on/off + The name of the EventType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling + + + + + + + Cooling On/off + The name of the ParamType (ThingClass: thermostat, ActionType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) +---------- +The name of the ParamType (ThingClass: thermostat, EventType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) +---------- +The name of the StateType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat + + + + + Cooling turned on/off + The name of the EventType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat + + + + + Enable/Disable heat pump + The name of the ActionType ({ac2ac0f9-058c-4586-8871-2d9dbc6e1758}) of ThingClass simpleHeatPump + + + + + Generic Things + The name of the plugin GenericThings ({0d582885-8295-41bc-99fb-b4bcee4f626c}) + + + + + Generic cooler + The name of the ThingClass ({09edbc07-d382-48a4-9b16-99992014aff9}) + + + + + Generic heating + The name of the ThingClass ({392854c4-3d14-4cf8-96cd-d933526bd197}) + + + + + Generic simple heat pump + The name of the ThingClass ({9fdb33bb-8e38-4108-8234-3b1d07bbc801}) + + + + + Generic thermostat + The name of the ThingClass ({6a34ba99-e5ec-4fc9-a61f-695ed8573fa1}) + + + + + Generic ventilation + The name of the ThingClass ({24af8dd3-ddf0-47f0-bf09-70fdfd8dceab}) + + + + + Generic ventilation with flow control + The name of the ThingClass ({a7eec5f7-3cc3-4edb-baa7-1f6b6f935bf8}) + + + + + + + Heat pump enabled + The name of the ParamType (ThingClass: simpleHeatPump, ActionType: power, ID: {ac2ac0f9-058c-4586-8871-2d9dbc6e1758}) +---------- +The name of the ParamType (ThingClass: simpleHeatPump, EventType: power, ID: {ac2ac0f9-058c-4586-8871-2d9dbc6e1758}) +---------- +The name of the StateType ({ac2ac0f9-058c-4586-8871-2d9dbc6e1758}) of ThingClass simpleHeatPump + + + + + Heat pump power changed + The name of the EventType ({ac2ac0f9-058c-4586-8871-2d9dbc6e1758}) of ThingClass simpleHeatPump + + + + + + + Heating On/off + The name of the ParamType (ThingClass: thermostat, ActionType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) +---------- +The name of the ParamType (ThingClass: thermostat, EventType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) +---------- +The name of the StateType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat + + + + + Heating turned on/off + The name of the EventType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat + + + + + Maximum temperature + The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {85608dd5-7e67-4c98-9e62-b97411681048}) + + + + + Minimum temperature + The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {67451c97-50e1-4ea6-ac43-4386fbd26698}) + + + + + + Operating mode description + The name of the ParamType (ThingClass: sgReady, EventType: operatingModeDescription, ID: {b421d098-f6e9-40e2-b536-58acdb3a49fe}) +---------- +The name of the StateType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady + + + + + Operating mode description changed + The name of the EventType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady + + + + + + + + + + + + + Power + The name of the ParamType (ThingClass: ventilationFlow, ActionType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) +---------- +The name of the ParamType (ThingClass: ventilationFlow, EventType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) +---------- +The name of the StateType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow +---------- +The name of the ParamType (ThingClass: ventilation, ActionType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) +---------- +The name of the ParamType (ThingClass: ventilation, EventType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) +---------- +The name of the StateType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation +---------- +The name of the ParamType (ThingClass: heating, ActionType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) +---------- +The name of the ParamType (ThingClass: heating, EventType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) +---------- +The name of the StateType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating + + + + + Power changed + The name of the EventType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating + + + + + + + Relay 1 + The name of the ParamType (ThingClass: sgReady, ActionType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) +---------- +The name of the ParamType (ThingClass: sgReady, EventType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) +---------- +The name of the StateType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady + + + + + Relay 1 changed + The name of the EventType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady + + + + + + + Relay 2 + The name of the ParamType (ThingClass: sgReady, ActionType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) +---------- +The name of the ParamType (ThingClass: sgReady, EventType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) +---------- +The name of the StateType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady + + + + + Relay 2 changed + The name of the EventType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady + + + + + SG-Ready + The name of the ThingClass ({83cf138d-02dc-4015-9b03-6360c2f3cfb1}) + + + + + Set air flow rate + The name of the ActionType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow + + + + + Set power + The name of the ActionType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating + + + + + Set relay 1 + The name of the ActionType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady + + + + + Set relay 2 + The name of the ActionType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady + + + + + Set smart grid mode + The name of the ActionType ({1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab}) of ThingClass sgReady + + + + + Set target temperature + The name of the ActionType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat + + + + + Set temperature sensor input + The name of the ActionType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat + + + + + + + Smart grid mode + The name of the ParamType (ThingClass: sgReady, ActionType: sgReadyMode, ID: {1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab}) +---------- +The name of the ParamType (ThingClass: sgReady, EventType: sgReadyMode, ID: {1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab}) +---------- +The name of the StateType ({1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab}) of ThingClass sgReady + + + + + Smart grid mode changed + The name of the EventType ({1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab}) of ThingClass sgReady + + + + + + + Target temperature + The name of the ParamType (ThingClass: thermostat, ActionType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) +---------- +The name of the ParamType (ThingClass: thermostat, EventType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) +---------- +The name of the StateType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat + + + + + Target temperature changed + The name of the EventType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat + + + + + Temperature difference + The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {64bf308f-a543-4e02-b787-1a1714c1f978}) + + + + + + + Temperature sensor input + The name of the ParamType (ThingClass: thermostat, ActionType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) +---------- +The name of the ParamType (ThingClass: thermostat, EventType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) +---------- +The name of the StateType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat + + + + + Temperature sensor input changed + The name of the EventType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat + + + + + Turn cooler on/off + The name of the ActionType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling + + + + + Turn cooling on/off + The name of the ActionType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat + + + + + Turn heating on/off + The name of the ActionType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat + + + + + + Turn on or off + The name of the ActionType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow +---------- +The name of the ActionType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation + + + + + + Turned on or off + The name of the EventType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow +---------- +The name of the EventType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericinterfaces/genericinterfaces.svg b/genericinterfaces/genericinterfaces.svg deleted file mode 100644 index 6fb8fe8..0000000 --- a/genericinterfaces/genericinterfaces.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/genericinterfaces/meta.json b/genericinterfaces/meta.json deleted file mode 100644 index f0b5bac..0000000 --- a/genericinterfaces/meta.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "Generic Interfaces", - "tagline": "Add generic device types.", - "icon": "genericinterfaces.svg", - "stability": "community", - "offline": true, - "technologies": [ - ], - "categories": [ - "tool" - ] -} diff --git a/genericirrigation/README.md b/genericirrigation/README.md new file mode 100644 index 0000000..e441f7b --- /dev/null +++ b/genericirrigation/README.md @@ -0,0 +1,21 @@ +# Generic irrigation devices + +This plugin allows to create generic irrigation devices in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin. +When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs accordingly. + +### Example: A irrigation valve on a digital output GPIO + +First, set up the GPIO to control the valve. Please refer to the documentation of the +according plugin for this. Once the valve can be controlled by nymea using the raw +GPIO toggle, set up a generic irrigation valve from this plugin and go to the settings of the +newly added generic irrigation. In there, you'll find a section for Input/Output connections +which can be used to connect the power state of this generic irrigation to the GPIO that +actually controls the valve. The valve can now be used like any other ready-made thing in nymea. + diff --git a/genericirrigation/genericirrigation.pro b/genericirrigation/genericirrigation.pro new file mode 100644 index 0000000..4d31f82 --- /dev/null +++ b/genericirrigation/genericirrigation.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericirrigation.cpp + +HEADERS += \ + integrationplugingenericirrigation.h + + + diff --git a/genericirrigation/integrationplugingenericirrigation.cpp b/genericirrigation/integrationplugingenericirrigation.cpp new file mode 100644 index 0000000..8567916 --- /dev/null +++ b/genericirrigation/integrationplugingenericirrigation.cpp @@ -0,0 +1,64 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericirrigation.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericIrrigation::IntegrationPluginGenericIrrigation() +{ + +} + +void IntegrationPluginGenericIrrigation::setupThing(ThingSetupInfo *info) +{ + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericIrrigation::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == irrigationThingClassId) { + if (action.actionTypeId() == irrigationPowerActionTypeId) { + thing->setStateValue(irrigationPowerStateTypeId, action.param(irrigationPowerActionPowerParamTypeId).value()); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} diff --git a/genericirrigation/integrationplugingenericirrigation.h b/genericirrigation/integrationplugingenericirrigation.h new file mode 100644 index 0000000..6bfe46e --- /dev/null +++ b/genericirrigation/integrationplugingenericirrigation.h @@ -0,0 +1,53 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICIRRIGATION_H +#define INTEGRATIONPLUGINGENERICIRRIGATION_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericIrrigation: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericirrigation.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericIrrigation(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; +}; + +#endif // INTEGRATIONPLUGINGENERICIRRIGATION_H diff --git a/genericirrigation/integrationplugingenericirrigation.json b/genericirrigation/integrationplugingenericirrigation.json new file mode 100644 index 0000000..663d1da --- /dev/null +++ b/genericirrigation/integrationplugingenericirrigation.json @@ -0,0 +1,34 @@ +{ + "name": "genericThings", + "displayName": "Generic irrigation devices", + "id": "27869a19-3084-4b48-8b00-63bdd3125c7c", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "d013b980-20d5-4791-9c4f-b411c39241d7", + "name": "irrigation", + "displayName": "Generic irrigation", + "createMethods": ["user"], + "interfaces": ["irrigation"], + "stateTypes": [ + { + "id": "0212a287-c5ae-4644-8803-adfdd8caeb9a", + "name": "power", + "displayName": "Power", + "displayNameEvent": "Turned on or off", + "displayNameAction": "Turn on or off", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + } + ] + } + ] + } + ] +} diff --git a/genericirrigation/translations/27869a19-3084-4b48-8b00-63bdd3125c7c-en_US.ts b/genericirrigation/translations/27869a19-3084-4b48-8b00-63bdd3125c7c-en_US.ts new file mode 100644 index 0000000..e0cf84e --- /dev/null +++ b/genericirrigation/translations/27869a19-3084-4b48-8b00-63bdd3125c7c-en_US.ts @@ -0,0 +1,49 @@ + + + + + GenericThings + + + Generic Things + The name of the plugin GenericThings ({27869a19-3084-4b48-8b00-63bdd3125c7c}) + + + + + Generic irrigation + The name of the ThingClass ({d013b980-20d5-4791-9c4f-b411c39241d7}) + + + + + + + Power + The name of the ParamType (ThingClass: irrigation, ActionType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) +---------- +The name of the ParamType (ThingClass: irrigation, EventType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) +---------- +The name of the StateType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation + + + + + Turn on or off + The name of the ActionType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation + + + + + Turned on or off + The name of the EventType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericthings/README.md b/genericsensors/README.md similarity index 57% rename from genericthings/README.md rename to genericsensors/README.md index 94afb73..1dee656 100644 --- a/genericthings/README.md +++ b/genericsensors/README.md @@ -1,24 +1,14 @@ -# Generic things +# Generic sensors -This plugin allows to create virtual generic things in nymea. Such things don't have any +This plugin allows to create generic sensors in nymea. Such things don't have any functionality on their own, but allow to create a visually appealing experience when -using general purpose input and outputs, such as GPIOs. +using general purpose input and outputs, such as GPIOs or MQTT. ## Set-up -First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin. -When done, set up the desired generic thing and use the things settings to connect -the inputs and/or outputs accordingly. - -### Example: A light switch on a digital output GPIO - -First, set up the GPIO to control the light. Please refer to the documentation of the -according plugin for this. Once the lights can be controlled by nymea using the raw -GPIO toggle, set up a generic light from this plugin and go to the settings of the -newly added generic light. In there, you'll find a section for Input/Output connections -which can be used to connect the power state of this generic light to the GPIO that -actually controls the light. The light can now be used like any other ready-made light -device in nymea. +First, set up a sensor with generic inputs or outputs. For instance from the GPIO plugin +or the MQTT plugin. When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs or use nymea scripts to process MQTT messages and fill in the states accordingly. ### Example: A soil moisture sensor on an analog input GPIO diff --git a/genericsensors/genericsensors.pro b/genericsensors/genericsensors.pro new file mode 100644 index 0000000..10ed2cd --- /dev/null +++ b/genericsensors/genericsensors.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericsensors.cpp + +HEADERS += \ + integrationplugingenericsensors.h + + + diff --git a/genericsensors/integrationplugingenericsensors.cpp b/genericsensors/integrationplugingenericsensors.cpp new file mode 100644 index 0000000..f8af347 --- /dev/null +++ b/genericsensors/integrationplugingenericsensors.cpp @@ -0,0 +1,278 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericsensors.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericSensors::IntegrationPluginGenericSensors() +{ + +} + +void IntegrationPluginGenericSensors::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + if (thing->thingClassId() == waterLevelSensorThingClassId) { + connect(thing, &Thing::settingChanged, thing, [ thing](const ParamTypeId &settingTypeId, const QVariant &value){ + if (settingTypeId == waterLevelSensorSettingsCapacityParamTypeId) { + double capacity = value.toDouble(); + double input = thing->stateValue(waterLevelSensorInputStateTypeId).toDouble(); + double minInputValue = thing->setting(waterLevelSensorSettingsMinInputValueParamTypeId).toDouble(); + double maxInputValue = thing->setting(waterLevelSensorSettingsMaxInputValueParamTypeId).toDouble(); + double normalizedInput = (input - minInputValue) / (maxInputValue - minInputValue); + double waterLevel = normalizedInput * capacity; + thing->setStateMaxValue(waterLevelSensorWaterLevelStateTypeId, capacity); + thing->setStateValue(waterLevelSensorWaterLevelStateTypeId, waterLevel); + } + }); + } + + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericSensors::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == temperatureSensorThingClassId) { + if (action.actionTypeId() == temperatureSensorInputActionTypeId) { + double value = info->action().param(temperatureSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(temperatureSensorInputStateTypeId, value); + double min = info->thing()->setting(temperatureSensorSettingsMinTempParamTypeId).toDouble(); + double max = info->thing()->setting(temperatureSensorSettingsMaxTempParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 1, min, max); + double roundingFactor = qPow(10, info->thing()->setting(temperatureSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(temperatureSensorTemperatureStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == humiditySensorThingClassId) { + if (action.actionTypeId() == humiditySensorInputActionTypeId) { + double value = info->action().param(humiditySensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(humiditySensorInputStateTypeId, value); + double min = info->thing()->setting(humiditySensorSettingsMinHumidityParamTypeId).toDouble(); + double max = info->thing()->setting(humiditySensorSettingsMaxHumidityParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(humiditySensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(humiditySensorHumidityStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == moistureSensorThingClassId) { + if (action.actionTypeId() == moistureSensorInputActionTypeId) { + double value = info->action().param(moistureSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(moistureSensorInputStateTypeId, value); + double min = info->thing()->setting(moistureSensorSettingsMinMoistureParamTypeId).toDouble(); + double max = info->thing()->setting(moistureSensorSettingsMaxMoistureParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(moistureSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(moistureSensorMoistureStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == phSensorThingClassId) { + if (action.actionTypeId() == phSensorInputActionTypeId) { + double value = info->action().paramValue(phSensorInputActionInputParamTypeId).toDouble(); + thing->setStateValue(phSensorInputStateTypeId, value); + double min = info->thing()->setting(phSensorSettingsMinInputParamTypeId).toDouble(); + double max = info->thing()->setting(phSensorSettingsMaxInputParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, min, max, 0, 14); + double roundingFactor = qPow(10, info->thing()->setting(phSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(phSensorPhStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == orpSensorThingClassId) { + if (action.actionTypeId() == orpSensorInputActionTypeId) { + double value = info->action().paramValue(orpSensorInputActionInputParamTypeId).toDouble(); + thing->setStateValue(orpSensorInputStateTypeId, value); + double min = info->thing()->setting(orpSensorSettingsMinORPParamTypeId).toDouble(); + double max = info->thing()->setting(orpSensorSettingsMaxORPParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(orpSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(orpSensorOrpStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == o2SensorThingClassId) { + if (action.actionTypeId() == o2SensorInputActionTypeId) { + double value = info->action().paramValue(o2SensorInputActionInputParamTypeId).toDouble(); + thing->setStateValue(o2SensorInputStateTypeId, value); + double min = info->thing()->setting(o2SensorSettingsMinInputParamTypeId).toDouble(); + double max = info->thing()->setting(o2SensorSettingsMaxInputParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, min, max, 0, 100); + double roundingFactor = qPow(10, info->thing()->setting(o2SensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(o2SensorO2saturationStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == pressureSensorThingClassId) { + if (action.actionTypeId() == pressureSensorInputActionTypeId) { + double value = info->action().param(pressureSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(pressureSensorInputStateTypeId, value); + double min = info->thing()->setting(pressureSensorSettingsMinPressureParamTypeId).toDouble(); + double max = info->thing()->setting(pressureSensorSettingsMaxPressureParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(pressureSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(pressureSensorPressureStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == coSensorThingClassId) { + if (action.actionTypeId() == coSensorInputActionTypeId) { + double value = info->action().param(coSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(coSensorInputStateTypeId, value); + double min = info->thing()->setting(coSensorSettingsMinCOParamTypeId).toDouble(); + double max = info->thing()->setting(coSensorSettingsMaxCOParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(coSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(coSensorCoStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == co2SensorThingClassId) { + if (action.actionTypeId() == co2SensorInputActionTypeId) { + double value = info->action().param(co2SensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(co2SensorInputStateTypeId, value); + double min = info->thing()->setting(co2SensorSettingsMinCO2ParamTypeId).toDouble(); + double max = info->thing()->setting(co2SensorSettingsMaxCO2ParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(co2SensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(co2SensorCo2StateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == gasSensorThingClassId) { + if (action.actionTypeId() == gasSensorInputActionTypeId) { + double value = info->action().param(gasSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(gasSensorInputStateTypeId, value); + double min = info->thing()->setting(gasSensorSettingsMinValueParamTypeId).toDouble(); + double max = info->thing()->setting(gasSensorSettingsMaxValueParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(gasSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(gasSensorGasStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == lightSensorThingClassId) { + if (action.actionTypeId() == lightSensorInputActionTypeId) { + double value = info->action().param(lightSensorInputActionInputParamTypeId).value().toDouble(); + thing->setStateValue(lightSensorInputStateTypeId, value); + double min = info->thing()->setting(lightSensorSettingsMinLuxParamTypeId).toDouble(); + double max = info->thing()->setting(lightSensorSettingsMaxLuxParamTypeId).toDouble(); + double newValue = mapDoubleValue(value, 0, 100, min, max); + double roundingFactor = qPow(10, info->thing()->setting(lightSensorSettingsAccuracyParamTypeId).toInt()); + newValue = qRound(newValue * roundingFactor) / roundingFactor; + thing->setStateValue(lightSensorLightIntensityStateTypeId, newValue); + info->finish(Thing::ThingErrorNoError); + return; + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == doorSensorThingClassId) { + if (action.actionTypeId() == doorSensorClosedActionTypeId) { + bool closed = action.paramValue(doorSensorClosedActionClosedParamTypeId).toBool(); + qCDebug(dcGenericSensors()) << "Door sensor is now" << (closed ? "open" : "closed"); + thing->setStateValue(doorSensorClosedStateTypeId, closed); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == waterSensorThingClassId) { + if (action.actionTypeId() == waterSensorWaterDetectedActionTypeId) { + bool waterDetected = action.paramValue(waterSensorWaterDetectedActionWaterDetectedParamTypeId).toBool(); + qCDebug(dcGenericSensors()).nospace() << "Water sensor is " << (waterDetected ? "" : "not") << "detecting water"; + thing->setStateValue(waterSensorWaterDetectedStateTypeId, waterDetected); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == waterLevelSensorThingClassId) { + if (action.actionTypeId() == waterLevelSensorInputActionTypeId) { + double capacity = thing->setting(waterLevelSensorSettingsCapacityParamTypeId).toDouble(); + double input = action.paramValue(waterLevelSensorInputActionInputParamTypeId).toDouble(); + double minInputValue = thing->setting(waterLevelSensorSettingsMinInputValueParamTypeId).toDouble(); + double maxInputValue = thing->setting(waterLevelSensorSettingsMaxInputValueParamTypeId).toDouble(); + double normalizedInput = (input - minInputValue) / (maxInputValue - minInputValue); + double waterLevel = normalizedInput * capacity; + thing->setStateValue(waterLevelSensorWaterLevelStateTypeId, waterLevel); + info->finish(Thing::ThingErrorNoError); + return; + } + } else if (thing->thingClassId() == presenceSensorThingClassId) { + if (action.actionTypeId() == presenceSensorIsPresentActionTypeId) { + bool isPresent = action.paramValue(presenceSensorIsPresentActionIsPresentParamTypeId).toBool(); + qCDebug(dcGenericSensors()) << "Presence sensor is now" << (isPresent ? "present" : "not present"); + thing->setStateValue(presenceSensorIsPresentStateTypeId, isPresent); + if (isPresent) { + thing->setStateValue(presenceSensorLastSeenTimeStateTypeId, QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000); + } + info->finish(Thing::ThingErrorNoError); + return; + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} + +double IntegrationPluginGenericSensors::mapDoubleValue(double value, double fromMin, double fromMax, double toMin, double toMax) +{ + double percent = (value - fromMin) / (fromMax - fromMin); + double toValue = toMin + (toMax - toMin) * percent; + return toValue; +} diff --git a/genericsensors/integrationplugingenericsensors.h b/genericsensors/integrationplugingenericsensors.h new file mode 100644 index 0000000..1621bff --- /dev/null +++ b/genericsensors/integrationplugingenericsensors.h @@ -0,0 +1,56 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICSENSORS_H +#define INTEGRATIONPLUGINGENERICSENSORS_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericSensors: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericsensors.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericSensors(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; + +private: + double mapDoubleValue(double value, double fromMin, double fromMax, double toMin, double toMax); +}; + +#endif // INTEGRATIONPLUGINGENERICSENSORS_H diff --git a/genericsensors/integrationplugingenericsensors.json b/genericsensors/integrationplugingenericsensors.json new file mode 100644 index 0000000..76d5dad --- /dev/null +++ b/genericsensors/integrationplugingenericsensors.json @@ -0,0 +1,784 @@ +{ + "name": "genericSensors", + "displayName": "Generic sensors", + "id": "ee7b2965-d38f-4f73-aed0-e8887423ff1a", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "cf3d65db-6f68-457b-968c-cfb66cbd5311", + "name": "temperatureSensor", + "displayName": "Generic temperature sensor", + "createMethods": ["user"], + "interfaces": ["temperaturesensor"], + "settingsTypes": [ + { + "id": "c86ae5d3-9335-4b6e-8231-bf3ed6670dff", + "name": "minTemp", + "displayName": "Minimum temperature", + "type": "double", + "defaultValue": -20, + "unit": "DegreeCelsius" + }, + { + "id": "8b5947ab-127f-4995-853b-eeeb628811e3", + "name": "maxTemp", + "displayName": "Maximum temperature", + "type": "double", + "defaultValue": 50, + "unit": "DegreeCelsius" + }, + { + "id": "3b543c3a-1fc0-45b5-8c07-600a6045f82e", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "d0b6c4be-339e-4b0f-a234-0611b7565395", + "name": "temperature", + "displayName": "Temperature", + "displayNameEvent": "Temperature changed", + "type": "double", + "unit": "DegreeCelsius", + "defaultValue": 0 + }, + { + "id": "fed37466-1264-4ac1-84fd-aff3a1f7ff04", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 1, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "d295bc64-773c-42a9-83e2-80db5fa0d1ce", + "name": "humiditySensor", + "displayName": "Generic humidity sensor", + "createMethods": ["user"], + "interfaces": ["humiditysensor"], + "settingsTypes": [ + { + "id": "0218ffa9-3d49-4b25-a59f-c8831f190432", + "name": "minHumidity", + "displayName": "Minimum humidity", + "type": "double", + "defaultValue": 0, + "unit": "Percentage" + }, + { + "id": "10afc387-68d1-47ea-a816-0d1acad47b3c", + "name": "maxHumidity", + "displayName": "Maximum humidity", + "type": "double", + "defaultValue": 100, + "unit": "Percentage" + }, + { + "id": "38064841-6121-4862-a639-08fb0b778511", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "925225d9-2965-444a-9c42-63c2873700fb", + "name": "humidity", + "displayName": "Humidity", + "displayNameEvent": "Humidity changed", + "type": "double", + "unit": "Percentage", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100 + }, + { + "id": "a8223e65-e704-4f84-9bbe-d8fc42597047", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "33e610cf-ff30-481b-9f0b-d6857bcd41a5", + "name": "moistureSensor", + "displayName": "Generic soil moisture sensor", + "createMethods": ["user"], + "interfaces": ["moisturesensor"], + "settingsTypes": [ + { + "id": "32153786-f1ae-4aa4-a84c-b9054102eb92", + "name": "minMoisture", + "displayName": "Minimum moisture", + "type": "double", + "defaultValue": 0, + "unit": "Percentage" + }, + { + "id": "3426817d-065e-4cfc-aa21-bb434de684d6", + "name": "maxMoisture", + "displayName": "Maximum moisture", + "type": "double", + "defaultValue": 100, + "unit": "Percentage" + }, + { + "id": "3c967a68-9951-4c9a-b019-79b913e762b6", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "7a62e1d2-92f2-424c-876c-870478a4b2bd", + "name": "moisture", + "displayName": "Soil moisture", + "displayNameEvent": "Soil moisture changed", + "type": "double", + "unit": "Percentage", + "minValue": 0, + "maxValue": 100, + "defaultValue": 0 + }, + { + "id": "ce64a425-d990-4fc1-966b-be6de445792b", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "e2934fa1-59c3-4de8-82f2-66181136085c", + "name": "phSensor", + "displayName": "PH sensor", + "createMethods": ["user"], + "interfaces": ["phsensor"], + "settingsTypes": [ + { + "id": "a8ff2e16-e06c-4b1e-839a-a06691a12d64", + "name": "minInput", + "displayName": "Minimum input value", + "type": "double", + "defaultValue": 0 + }, + { + "id": "a8889e45-59e5-4cc4-b228-611f8f19f531", + "name": "maxInput", + "displayName": "Maximum input value", + "type": "double", + "defaultValue": 100 + }, + { + "id": "bb41de73-31d0-4b21-8f80-14467120aae4", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "743514b1-8018-4525-b87a-c5f414146ff2", + "name": "ph", + "displayName": "PH", + "displayNameEvent": "PH changed", + "type": "double", + "defaultValue": 7, + "minValue": 0, + "maxValue": 14 + }, + { + "id": "614a039b-9ed9-4b62-9c74-01ba4ac42f16", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "minValue": 0, + "defaultValue": 50, + "maxValue": 100, + "ioType": "analogOutput", + "writable": true + } + ] + }, + { + "id": "3edeec39-ab9d-4697-90cc-0bba089384cf", + "name": "orpSensor", + "displayName": "Generic ORP sensor", + "createMethods": ["user"], + "interfaces": ["orpsensor"], + "settingsTypes": [ + { + "id": "396bf3f9-a3fc-44c3-90f8-b316670116a7", + "name": "minORP", + "displayName": "Minimum input value", + "type": "double", + "defaultValue": -1500 + }, + { + "id": "bd0774c9-1b89-49ce-b0f8-66ff26ca10db", + "name": "maxORP", + "displayName": "Maximum input ORP value", + "type": "double", + "defaultValue": 1500 + }, + { + "id": "1f218ad8-652a-4bda-987d-3e183ff040b2", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 0 + } + ], + "stateTypes": [ + { + "id": "e5ed3535-2e5d-412e-85f8-782cbccd7731", + "name": "orp", + "displayName": "ORP", + "displayNameEvent": "ORP changed", + "type": "double", + "unit": "MilliVolt", + "defaultValue": 0, + "minValue": -1500, + "maxValue": 1500 + }, + { + "id": "020ff04f-a157-4925-9c55-2b45389208fc", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "minValue": 0, + "defaultValue": 0, + "maxValue": 100, + "ioType": "analogOutput", + "writable": true + } + ] + }, + { + "id": "a8cf20ec-132b-4f6f-b5ec-73dc2f873b43", + "name": "o2Sensor", + "displayName": "Generic O2 sensor", + "createMethods": ["user"], + "interfaces": ["o2sensor"], + "settingsTypes": [ + { + "id": "58e84041-d451-44a2-972e-13a79b449b58", + "name": "minInput", + "displayName": "Minimum input value", + "type": "double", + "defaultValue": 0 + }, + { + "id": "198847f6-a188-42b0-9e0b-15587eaabbed", + "name": "maxInput", + "displayName": "Maximum input value", + "type": "double", + "defaultValue": 100 + }, + { + "id": "d79701ac-1619-42d8-b10f-a55e8e2ab3f1", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 0 + } + ], + "stateTypes": [ + { + "id": "a3ff7641-87d9-4b07-b8e5-e6aa92b90088", + "name": "o2saturation", + "displayName": "O2 saturation", + "displayNameEvent": "O2 saturation changed", + "type": "double", + "unit": "Percentage", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100 + }, + { + "id": "7e74fca7-84d0-4f3e-9f26-4232b7b9f507", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "minValue": 0, + "defaultValue": 0, + "maxValue": 100, + "ioType": "analogOutput", + "writable": true + } + ] + }, + { + "id": "9a8d804b-d1dc-450a-8c41-be491e5cdda0", + "name": "pressureSensor", + "displayName": "Generic pressure sensor", + "createMethods": ["user"], + "interfaces": ["pressuresensor"], + "settingsTypes": [ + { + "id": "035e2619-f9c2-4e8f-95dd-f124ad9402d0", + "name": "minPressure", + "displayName": "Minimum pressure", + "type": "double", + "defaultValue": 0, + "unit": "MilliBar" + }, + { + "id": "06e21251-8b4f-44a1-8504-6b51f8526bd0", + "name": "maxPressure", + "displayName": "Maximum pressure", + "type": "double", + "defaultValue": 2000, + "unit": "MilliBar" + }, + { + "id": "021a17d8-9e5e-4dd6-835d-1a3e1ffd6b23", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "e645a979-1465-4592-b8b0-f4c123db0800", + "name": "pressure", + "displayName": "Pressure", + "displayNameEvent": "Pressure changed", + "type": "double", + "unit": "MilliBar", + "defaultValue": 0 + }, + { + "id": "c320577c-371a-442b-ac80-b692ff2064c9", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "unit": "Percentage", + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "262a29b2-b5df-4ee2-822c-e672f50d97b6", + "name": "coSensor", + "displayName": "Generic CO sensor", + "createMethods": ["user"], + "interfaces": ["cosensor"], + "settingsTypes": [ + { + "id": "e850b044-fd70-446c-a943-3c88407425f5", + "name": "minCO", + "displayName": "Minimum CO", + "type": "double", + "defaultValue": 0, + "unit": "PartsPerMillion" + }, + { + "id": "e9def195-1b67-4a1b-8030-cbbc6209d52e", + "name": "maxCO", + "displayName": "Maximum CO", + "type": "double", + "defaultValue": 2000, + "unit": "PartsPerMillion" + }, + { + "id": "9c8a9553-7b68-4b58-a8f1-3c6b591998c0", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "9eebe9d2-b34b-4847-bc25-109e2b8cab24", + "name": "co", + "displayName": "CO level", + "displayNameEvent": "CO level changed", + "type": "double", + "unit": "PartsPerMillion", + "defaultValue": 0 + }, + { + "id": "cf3ec5ec-7098-47c5-9666-b3c52eba1b1d", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "a58a2dae-4148-4a4d-ab34-2a11124454a0", + "name": "co2Sensor", + "displayName": "Generic CO2 sensor", + "createMethods": ["user"], + "interfaces": ["co2sensor"], + "settingsTypes": [ + { + "id": "a0d8a6ec-599a-4ded-ae03-2950561f0b72", + "name": "minCO2", + "displayName": "Minimum CO2", + "type": "double", + "defaultValue": 0, + "unit": "PartsPerMillion" + }, + { + "id": "a3029bee-8b13-4aed-8ebd-eaceb603f8ef", + "name": "maxCO2", + "displayName": "Maximum CO2", + "type": "double", + "defaultValue": 2000, + "unit": "PartsPerMillion" + }, + { + "id": "236831a8-a455-4e38-a9cd-eabbebaa3f67", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "755c4c7f-093e-41dd-a38d-9ee18c9890d6", + "name": "co2", + "displayName": "CO2", + "displayNameEvent": "CO2 changed", + "type": "double", + "unit": "PartsPerMillion", + "defaultValue": 0 + }, + { + "id": "7dc765f8-fa9b-4199-8f21-49ed452f226d", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "25c6725f-5c15-485b-9ec4-cb0e11ab6b32", + "name": "gasSensor", + "displayName": "Generic flammable gas sensor", + "createMethods": ["user"], + "interfaces": ["gassensor"], + "settingsTypes": [ + { + "id": "480945ea-6262-408d-b799-cbff905a40db", + "name": "minValue", + "displayName": "Minimum value", + "type": "double", + "defaultValue": 0, + "unit": "PartsPerMillion" + }, + { + "id": "51f4a830-3ef9-4fa2-b36b-5976f724f8a1", + "name": "maxValue", + "displayName": "Maximum value", + "type": "double", + "defaultValue": 10000, + "unit": "PartsPerMillion" + }, + { + "id": "1c7465b1-490d-43db-bb67-a179a6923a57", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "5135648f-57b7-44b0-b9d0-c5accad09356", + "name": "gas", + "displayName": "Gas level", + "displayNameEvent": "Gas level changed", + "type": "double", + "unit": "PartsPerMillion", + "defaultValue": 0 + }, + { + "id": "e3eb500a-ac00-426c-932a-dee4fd6fbcf5", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "d4d873fd-f0fc-433f-b615-91c1506a1890", + "name": "lightSensor", + "displayName": "Generic light sensor", + "createMethods": ["user"], + "interfaces": ["lightsensor"], + "settingsTypes": [ + { + "id": "6dea7384-b079-443b-8cc2-1479138fa212", + "name": "minLux", + "displayName": "Minimum Lux", + "type": "double", + "defaultValue": 0, + "unit": "Lux" + }, + { + "id": "7fe74404-d7f0-41af-a8d4-dd1bda27f752", + "name": "maxLux", + "displayName": "Maximum Lux", + "type": "double", + "defaultValue": 120000, + "unit": "Lux" + }, + { + "id": "f800988f-1ad5-4ffb-9aa8-70ef17614966", + "name": "accuracy", + "displayName": "Accuracy (decimal places)", + "type": "uint", + "minValue": 0, + "maxValue": 5, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b", + "name": "lightIntensity", + "displayName": "Light intensity", + "displayNameEvent": "Light intensity changed", + "type": "double", + "unit": "Lux", + "defaultValue": 0 + }, + { + "id": "520e5d27-7d15-4d79-94cf-5d01f5a09ea8", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100, + "unit": "Percentage", + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "2d936f56-48ee-4be1-9b3e-28a335ad8085", + "name": "doorSensor", + "displayName": "Generic door or window sensor", + "createMethods": ["user"], + "interfaces": ["closablesensor"], + "stateTypes": [ + { + "id": "7f5fdc2b-7916-4e90-9c24-558162304f71", + "name": "closed", + "displayName": "Closed", + "displayNameEvent": "Opened or closed", + "displayNameAction": "Set open or closed", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalOutput" + } + ] + }, + { + "id": "09b9cb86-f551-4efe-9a7d-2f7624e9510f", + "name": "waterSensor", + "displayName": "Gerneric water sensor", + "createMethods": ["user"], + "interfaces": ["watersensor"], + "stateTypes": [ + { + "id": "b2427b85-1f62-4635-b546-1961191426ef", + "name": "waterDetected", + "displayName": "Water detected", + "displayNameEvent": "Water detected", + "displayNameAction": "Set water detected", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalOutput" + } + ] + }, + { + "id": "f1576df0-fb45-4bf0-89fa-a83c4118c326", + "name": "waterLevelSensor", + "displayName": "Generic water level sensor", + "createMethods": ["user"], + "interfaces": ["waterlevelsensor"], + "settingsTypes": [ + { + "id": "5e98e8d2-d849-46c5-b25a-d54f184ea4c7", + "name": "capacity", + "displayName": "Tank capactity", + "type": "double", + "unit": "Liter", + "minValue": 0, + "defaultValue": 100 + }, + { + "id": "16ea3cf2-46fd-40a3-88bf-21a2bb7cbabe", + "name": "minInputValue", + "displayName": "Minimum input value", + "type": "double", + "defaultValue": 0 + }, + { + "id": "4e228f9b-8631-4643-8375-3d8d76d12e9c", + "name": "maxInputValue", + "displayName": "Maximum input value", + "type": "double", + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "07563165-e42d-4d0f-ac60-31cdd19170f2", + "name": "waterLevel", + "displayName": "Water level", + "displayNameEvent": "Water level changed", + "type": "double", + "unit": "Liter", + "defaultValue": 0, + "minValue": 0, + "maxValue": 100 + }, + { + "id": "d344887d-da5d-4742-83bd-608754b2d0aa", + "name": "input", + "displayName": "Input value", + "displayNameEvent": "Input value changed", + "displayNameAction": "Set input value", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 1, + "writable": true, + "ioType": "analogOutput" + } + ] + }, + { + "id": "339a0c54-4086-404f-8d36-bcf20621b785", + "name": "presenceSensor", + "displayName": "Generic presence sensor", + "createMethods": ["user"], + "interfaces": ["presencesensor"], + "stateTypes": [ + { + "id": "22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c", + "name": "isPresent", + "displayName": "Presence detected", + "displayNameEvent": "Presense changed", + "displayNameAction": "Set presence", + "type": "bool", + "defaultValue": false, + "ioType": "digitalOutput", + "writable": true + }, + { + "id": "be4842cb-140c-425f-9630-8bb19fdb943e", + "name": "lastSeenTime", + "displayName": "Last seen time", + "displayNameEvent": "Last seen time changed", + "type": "int", + "unit": "UnixTime", + "defaultValue": 0 + } + ] + } + ] + } + ] +} diff --git a/genericsensors/translations/ee7b2965-d38f-4f73-aed0-e8887423ff1a-en_US.ts b/genericsensors/translations/ee7b2965-d38f-4f73-aed0-e8887423ff1a-en_US.ts new file mode 100644 index 0000000..ff7f832 --- /dev/null +++ b/genericsensors/translations/ee7b2965-d38f-4f73-aed0-e8887423ff1a-en_US.ts @@ -0,0 +1,733 @@ + + + + + GenericThings + + + + + + + + + + + + + Accuracy (decimal places) + The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {f800988f-1ad5-4ffb-9aa8-70ef17614966}) +---------- +The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {1c7465b1-490d-43db-bb67-a179a6923a57}) +---------- +The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {236831a8-a455-4e38-a9cd-eabbebaa3f67}) +---------- +The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {9c8a9553-7b68-4b58-a8f1-3c6b591998c0}) +---------- +The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {021a17d8-9e5e-4dd6-835d-1a3e1ffd6b23}) +---------- +The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {d79701ac-1619-42d8-b10f-a55e8e2ab3f1}) +---------- +The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {1f218ad8-652a-4bda-987d-3e183ff040b2}) +---------- +The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {bb41de73-31d0-4b21-8f80-14467120aae4}) +---------- +The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3c967a68-9951-4c9a-b019-79b913e762b6}) +---------- +The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {38064841-6121-4862-a639-08fb0b778511}) +---------- +The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {3b543c3a-1fc0-45b5-8c07-600a6045f82e}) + + + + + + CO level + The name of the ParamType (ThingClass: coSensor, EventType: co, ID: {9eebe9d2-b34b-4847-bc25-109e2b8cab24}) +---------- +The name of the StateType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor + + + + + CO level changed + The name of the EventType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor + + + + + + CO2 + The name of the ParamType (ThingClass: co2Sensor, EventType: co2, ID: {755c4c7f-093e-41dd-a38d-9ee18c9890d6}) +---------- +The name of the StateType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor + + + + + CO2 changed + The name of the EventType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor + + + + + + + Closed + The name of the ParamType (ThingClass: doorSensor, ActionType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) +---------- +The name of the ParamType (ThingClass: doorSensor, EventType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) +---------- +The name of the StateType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor + + + + + + Gas level + The name of the ParamType (ThingClass: gasSensor, EventType: gas, ID: {5135648f-57b7-44b0-b9d0-c5accad09356}) +---------- +The name of the StateType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor + + + + + Gas level changed + The name of the EventType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor + + + + + Generic CO sensor + The name of the ThingClass ({262a29b2-b5df-4ee2-822c-e672f50d97b6}) + + + + + Generic CO2 sensor + The name of the ThingClass ({a58a2dae-4148-4a4d-ab34-2a11124454a0}) + + + + + Generic O2 sensor + The name of the ThingClass ({a8cf20ec-132b-4f6f-b5ec-73dc2f873b43}) + + + + + Generic ORP sensor + The name of the ThingClass ({3edeec39-ab9d-4697-90cc-0bba089384cf}) + + + + + Generic Things + The name of the plugin GenericThings ({ee7b2965-d38f-4f73-aed0-e8887423ff1a}) + + + + + Generic door or window sensor + The name of the ThingClass ({2d936f56-48ee-4be1-9b3e-28a335ad8085}) + + + + + Generic flammable gas sensor + The name of the ThingClass ({25c6725f-5c15-485b-9ec4-cb0e11ab6b32}) + + + + + Generic humidity sensor + The name of the ThingClass ({d295bc64-773c-42a9-83e2-80db5fa0d1ce}) + + + + + Generic light sensor + The name of the ThingClass ({d4d873fd-f0fc-433f-b615-91c1506a1890}) + + + + + Generic presence sensor + The name of the ThingClass ({339a0c54-4086-404f-8d36-bcf20621b785}) + + + + + Generic pressure sensor + The name of the ThingClass ({9a8d804b-d1dc-450a-8c41-be491e5cdda0}) + + + + + Generic soil moisture sensor + The name of the ThingClass ({33e610cf-ff30-481b-9f0b-d6857bcd41a5}) + + + + + Generic temperature sensor + The name of the ThingClass ({cf3d65db-6f68-457b-968c-cfb66cbd5311}) + + + + + Generic water level sensor + The name of the ThingClass ({f1576df0-fb45-4bf0-89fa-a83c4118c326}) + + + + + Gerneric water sensor + The name of the ThingClass ({09b9cb86-f551-4efe-9a7d-2f7624e9510f}) + + + + + + Humidity + The name of the ParamType (ThingClass: humiditySensor, EventType: humidity, ID: {925225d9-2965-444a-9c42-63c2873700fb}) +---------- +The name of the StateType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor + + + + + Humidity changed + The name of the EventType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Input value + The name of the ParamType (ThingClass: waterLevelSensor, ActionType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) +---------- +The name of the ParamType (ThingClass: waterLevelSensor, EventType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) +---------- +The name of the StateType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor +---------- +The name of the ParamType (ThingClass: lightSensor, ActionType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) +---------- +The name of the ParamType (ThingClass: lightSensor, EventType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) +---------- +The name of the StateType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor +---------- +The name of the ParamType (ThingClass: gasSensor, ActionType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) +---------- +The name of the ParamType (ThingClass: gasSensor, EventType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) +---------- +The name of the StateType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor +---------- +The name of the ParamType (ThingClass: co2Sensor, ActionType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) +---------- +The name of the ParamType (ThingClass: co2Sensor, EventType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) +---------- +The name of the StateType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor +---------- +The name of the ParamType (ThingClass: coSensor, ActionType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) +---------- +The name of the ParamType (ThingClass: coSensor, EventType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) +---------- +The name of the StateType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor +---------- +The name of the ParamType (ThingClass: pressureSensor, ActionType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) +---------- +The name of the ParamType (ThingClass: pressureSensor, EventType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) +---------- +The name of the StateType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor +---------- +The name of the ParamType (ThingClass: o2Sensor, ActionType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) +---------- +The name of the ParamType (ThingClass: o2Sensor, EventType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) +---------- +The name of the StateType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor +---------- +The name of the ParamType (ThingClass: orpSensor, ActionType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) +---------- +The name of the ParamType (ThingClass: orpSensor, EventType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) +---------- +The name of the StateType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor +---------- +The name of the ParamType (ThingClass: phSensor, ActionType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) +---------- +The name of the ParamType (ThingClass: phSensor, EventType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) +---------- +The name of the StateType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor +---------- +The name of the ParamType (ThingClass: moistureSensor, ActionType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) +---------- +The name of the ParamType (ThingClass: moistureSensor, EventType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) +---------- +The name of the StateType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor +---------- +The name of the ParamType (ThingClass: humiditySensor, ActionType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) +---------- +The name of the ParamType (ThingClass: humiditySensor, EventType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) +---------- +The name of the StateType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor +---------- +The name of the ParamType (ThingClass: temperatureSensor, ActionType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) +---------- +The name of the ParamType (ThingClass: temperatureSensor, EventType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) +---------- +The name of the StateType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor + + + + + + + + + + + + + + + + Input value changed + The name of the EventType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor +---------- +The name of the EventType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor +---------- +The name of the EventType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor +---------- +The name of the EventType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor +---------- +The name of the EventType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor +---------- +The name of the EventType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor +---------- +The name of the EventType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor +---------- +The name of the EventType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor +---------- +The name of the EventType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor +---------- +The name of the EventType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor +---------- +The name of the EventType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor +---------- +The name of the EventType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor + + + + + + Last seen time + The name of the ParamType (ThingClass: presenceSensor, EventType: lastSeenTime, ID: {be4842cb-140c-425f-9630-8bb19fdb943e}) +---------- +The name of the StateType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor + + + + + Last seen time changed + The name of the EventType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor + + + + + + Light intensity + The name of the ParamType (ThingClass: lightSensor, EventType: lightIntensity, ID: {fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) +---------- +The name of the StateType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor + + + + + Light intensity changed + The name of the EventType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor + + + + + Maximum CO + The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e9def195-1b67-4a1b-8030-cbbc6209d52e}) + + + + + Maximum CO2 + The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a3029bee-8b13-4aed-8ebd-eaceb603f8ef}) + + + + + Maximum Lux + The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {7fe74404-d7f0-41af-a8d4-dd1bda27f752}) + + + + + Maximum humidity + The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {10afc387-68d1-47ea-a816-0d1acad47b3c}) + + + + + Maximum input ORP value + The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {bd0774c9-1b89-49ce-b0f8-66ff26ca10db}) + + + + + + + Maximum input value + The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {4e228f9b-8631-4643-8375-3d8d76d12e9c}) +---------- +The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {198847f6-a188-42b0-9e0b-15587eaabbed}) +---------- +The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8889e45-59e5-4cc4-b228-611f8f19f531}) + + + + + Maximum moisture + The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3426817d-065e-4cfc-aa21-bb434de684d6}) + + + + + Maximum pressure + The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {06e21251-8b4f-44a1-8504-6b51f8526bd0}) + + + + + Maximum temperature + The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {8b5947ab-127f-4995-853b-eeeb628811e3}) + + + + + Maximum value + The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {51f4a830-3ef9-4fa2-b36b-5976f724f8a1}) + + + + + Minimum CO + The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e850b044-fd70-446c-a943-3c88407425f5}) + + + + + Minimum CO2 + The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a0d8a6ec-599a-4ded-ae03-2950561f0b72}) + + + + + Minimum Lux + The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {6dea7384-b079-443b-8cc2-1479138fa212}) + + + + + Minimum humidity + The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {0218ffa9-3d49-4b25-a59f-c8831f190432}) + + + + + + + + Minimum input value + The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {16ea3cf2-46fd-40a3-88bf-21a2bb7cbabe}) +---------- +The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {58e84041-d451-44a2-972e-13a79b449b58}) +---------- +The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {396bf3f9-a3fc-44c3-90f8-b316670116a7}) +---------- +The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8ff2e16-e06c-4b1e-839a-a06691a12d64}) + + + + + Minimum moisture + The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {32153786-f1ae-4aa4-a84c-b9054102eb92}) + + + + + Minimum pressure + The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {035e2619-f9c2-4e8f-95dd-f124ad9402d0}) + + + + + Minimum temperature + The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {c86ae5d3-9335-4b6e-8231-bf3ed6670dff}) + + + + + Minimum value + The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {480945ea-6262-408d-b799-cbff905a40db}) + + + + + + O2 saturation + The name of the ParamType (ThingClass: o2Sensor, EventType: o2saturation, ID: {a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) +---------- +The name of the StateType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor + + + + + O2 saturation changed + The name of the EventType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor + + + + + + ORP + The name of the ParamType (ThingClass: orpSensor, EventType: orp, ID: {e5ed3535-2e5d-412e-85f8-782cbccd7731}) +---------- +The name of the StateType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor + + + + + ORP changed + The name of the EventType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor + + + + + Opened or closed + The name of the EventType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor + + + + + + PH + The name of the ParamType (ThingClass: phSensor, EventType: ph, ID: {743514b1-8018-4525-b87a-c5f414146ff2}) +---------- +The name of the StateType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor + + + + + PH changed + The name of the EventType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor + + + + + PH sensor + The name of the ThingClass ({e2934fa1-59c3-4de8-82f2-66181136085c}) + + + + + + + Presence detected + The name of the ParamType (ThingClass: presenceSensor, ActionType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) +---------- +The name of the ParamType (ThingClass: presenceSensor, EventType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) +---------- +The name of the StateType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor + + + + + Presense changed + The name of the EventType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor + + + + + + Pressure + The name of the ParamType (ThingClass: pressureSensor, EventType: pressure, ID: {e645a979-1465-4592-b8b0-f4c123db0800}) +---------- +The name of the StateType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor + + + + + Pressure changed + The name of the EventType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor + + + + + + + + + + + + + + + + Set input value + The name of the ActionType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor +---------- +The name of the ActionType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor +---------- +The name of the ActionType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor +---------- +The name of the ActionType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor +---------- +The name of the ActionType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor +---------- +The name of the ActionType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor +---------- +The name of the ActionType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor +---------- +The name of the ActionType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor +---------- +The name of the ActionType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor +---------- +The name of the ActionType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor +---------- +The name of the ActionType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor +---------- +The name of the ActionType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor + + + + + Set open or closed + The name of the ActionType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor + + + + + Set presence + The name of the ActionType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor + + + + + Set water detected + The name of the ActionType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor + + + + + + Soil moisture + The name of the ParamType (ThingClass: moistureSensor, EventType: moisture, ID: {7a62e1d2-92f2-424c-876c-870478a4b2bd}) +---------- +The name of the StateType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor + + + + + Soil moisture changed + The name of the EventType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor + + + + + Tank capactity + The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {5e98e8d2-d849-46c5-b25a-d54f184ea4c7}) + + + + + + Temperature + The name of the ParamType (ThingClass: temperatureSensor, EventType: temperature, ID: {d0b6c4be-339e-4b0f-a234-0611b7565395}) +---------- +The name of the StateType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor + + + + + Temperature changed + The name of the EventType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor + + + + + + + + Water detected + The name of the ParamType (ThingClass: waterSensor, ActionType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) +---------- +The name of the ParamType (ThingClass: waterSensor, EventType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) +---------- +The name of the EventType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor +---------- +The name of the StateType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor + + + + + + Water level + The name of the ParamType (ThingClass: waterLevelSensor, EventType: waterLevel, ID: {07563165-e42d-4d0f-ac60-31cdd19170f2}) +---------- +The name of the StateType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor + + + + + Water level changed + The name of the EventType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericshading/README.md b/genericshading/README.md new file mode 100644 index 0000000..26e5cbb --- /dev/null +++ b/genericshading/README.md @@ -0,0 +1,21 @@ +# Generic shading devices + +This plugin allows to create generic shading devices in nymea. Such things don't have any +functionality on their own, but allow to create a visually appealing experience when +using general purpose input and outputs, such as GPIOs. + +## Set-up + +First, set up a thing with generic inputs or outputs. For instance from the GPIO plugin. +When done, set up the desired generic thing and use the things settings to connect +the inputs and/or outputs accordingly. + +### Example: A blind on digital output GPIOs + +First, set up the GPIOs to control the blind. Please refer to the documentation of the +according plugin for this. Once the blind can be controlled by nymea using the raw +GPIO toggles, set up a generic blind from this plugin and go to the settings of the +newly added generic blind. In there, you'll find a section for Input/Output connections +which can be used to connect the up/down states of this generic light to the GPIOs that +actually control the blind. The blind can now be used like any other ready-made blind +in nymea. diff --git a/genericshading/genericshading.pro b/genericshading/genericshading.pro new file mode 100644 index 0000000..58f7d2c --- /dev/null +++ b/genericshading/genericshading.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericshading.cpp + +HEADERS += \ + integrationplugingenericshading.h + + + diff --git a/genericshading/integrationplugingenericshading.cpp b/genericshading/integrationplugingenericshading.cpp new file mode 100644 index 0000000..a35319b --- /dev/null +++ b/genericshading/integrationplugingenericshading.cpp @@ -0,0 +1,529 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericshading.h" +#include "plugininfo.h" + +#include + +IntegrationPluginGenericShading::IntegrationPluginGenericShading() +{ + +} + +void IntegrationPluginGenericShading::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + + if (thing->thingClassId() == extendedBlindThingClassId) { + uint closingDuration = thing->setting(extendedBlindSettingsClosingDurationParamTypeId).toUInt(); + QTimer* timer = new QTimer(this); + timer->setInterval(closingDuration/100.00); // closing timer / 100 to update on every percent + m_extendedBlindPercentageTimer.insert(thing, timer); + connect(thing, &Thing::settingChanged, thing, [timer] (const ParamTypeId ¶mTypeId, const QVariant &value) { + if (paramTypeId == extendedBlindSettingsClosingDurationParamTypeId) { + timer->setInterval(value.toUInt()/100.00); + } + }); + connect(timer, &QTimer::timeout, this, [thing, this] { + uint currentPercentage = thing->stateValue(extendedBlindPercentageStateTypeId).toUInt(); + + if (thing->stateValue(extendedBlindStatusStateTypeId).toString() == "Closing") { + + if (currentPercentage == 100) { + setBlindState(BlindStateStopped, thing); + qCDebug(dcGenericShading()) << "Extended blind is closed, stopping timer"; + } else { + currentPercentage++; + thing->setStateValue(extendedBlindPercentageStateTypeId, currentPercentage); + } + } else if (thing->stateValue(extendedBlindStatusStateTypeId).toString() == "Opening") { + + if (currentPercentage == 0) { + setBlindState(BlindStateStopped, thing); + qCDebug(dcGenericShading()) << "Extended blind is opened, stopping timer"; + } else { + currentPercentage--; + thing->setStateValue(extendedBlindPercentageStateTypeId, currentPercentage); + } + } else { + setBlindState(BlindStateStopped, thing); + } + + if (m_extendedBlindPercentageTimer.contains(thing)) { + uint targetPercentage = m_extendedBlindTargetPercentage.value(thing); + if (targetPercentage == currentPercentage) { + qCDebug(dcGenericShading()) << "Extended blind has reached target percentage, stopping timer"; + setBlindState(BlindStateStopped, thing); + } + } + }); + } else if (info->thing()->thingClassId() == venetianBlindThingClassId) { + uint closingTime = thing->setting(venetianBlindSettingsClosingDurationParamTypeId).toUInt(); + uint angleTime = thing->setting(venetianBlindSettingsAngleTimeParamTypeId).toUInt(); + if (closingTime < angleTime) { + return info->finish(Thing::ThingErrorSetupFailed, tr("Invalid closing or angle time")); + } + QTimer* closingTimer = new QTimer(this); + closingTimer->setInterval(closingTime/100.00); // closing timer / 100 to update on every percent + m_extendedBlindPercentageTimer.insert(thing, closingTimer); + + connect(closingTimer, &QTimer::timeout, thing, [thing, this] { + uint currentPercentage = thing->stateValue(venetianBlindPercentageStateTypeId).toUInt(); + + if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Closing") { + + if (currentPercentage == 100) { + setBlindState(BlindStateStopped, thing); + qCDebug(dcGenericShading()) << "Venetian blind is closed, stopping timer"; + } else if (currentPercentage > 100) { + currentPercentage = 100; + setBlindState(BlindStateStopped, thing); + qCWarning(dcGenericShading()) << "Venetian blind overshoot 100 percent"; + } else { + currentPercentage++; + thing->setStateValue(venetianBlindPercentageStateTypeId, currentPercentage); + } + } else if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Opening") { + + if (currentPercentage == 0) { + setBlindState(BlindStateStopped, thing); + qCDebug(dcGenericShading()) << "Venetian blind is opened, stopping timer"; + } else { + currentPercentage--; + thing->setStateValue(venetianBlindPercentageStateTypeId, currentPercentage); + } + } else { + setBlindState(BlindStateStopped, thing); + } + + if (m_extendedBlindPercentageTimer.contains(thing)) { + uint targetPercentage = m_extendedBlindTargetPercentage.value(thing); + if (targetPercentage == currentPercentage) { + qCDebug(dcGenericShading()) << "Venetian blind has reached target percentage, stopping timer"; + setBlindState(BlindStateStopped, thing); + } + } + }); + + QTimer* angleTimer = new QTimer(this); + angleTimer->setInterval(angleTime/180.00); // -90 to 90 degree -> 180 degree total + m_venetianBlindAngleTimer.insert(thing, angleTimer); + connect(thing, &Thing::settingChanged, thing, [closingTimer, angleTimer] (const ParamTypeId ¶mTypeId, const QVariant &value) { + if (paramTypeId == venetianBlindSettingsClosingDurationParamTypeId) { + closingTimer->setInterval(value.toUInt()/100.00); + } else if (paramTypeId == venetianBlindSettingsAngleTimeParamTypeId) { + angleTimer->setInterval(value.toUInt()/180.00); + } + }); + connect(angleTimer, &QTimer::timeout, thing, [thing, this] { + int currentAngle = thing->stateValue(venetianBlindAngleStateTypeId).toInt(); + if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Closing") { + + if (currentAngle < 90) { + currentAngle++; + } else if (currentAngle == 90) { + m_venetianBlindAngleTimer.value(thing)->stop(); + } else if (currentAngle > 90) { + currentAngle = 90; + m_venetianBlindAngleTimer.value(thing)->stop(); + qCWarning(dcGenericShading()) << "Venetian blind overshoot angle boundaries"; + } + thing->setStateValue(venetianBlindAngleStateTypeId, currentAngle); + } else if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Opening") { + + if (currentAngle > -90) { + currentAngle--; + } else if (currentAngle == -90) { + m_venetianBlindAngleTimer.value(thing)->stop(); + } else if (currentAngle < -90) { + currentAngle = -90; + m_venetianBlindAngleTimer.value(thing)->stop(); + qCWarning(dcGenericShading()) << "Venetian blind overshoot angle boundaries"; + } + thing->setStateValue(venetianBlindAngleStateTypeId, currentAngle); + } + + if (m_venetianBlindTargetAngle.contains(thing)) { + int targetAngle = m_venetianBlindTargetAngle.value(thing); + if (targetAngle == currentAngle) { + qCDebug(dcGenericShading()) << "Venetian blind has reached target angle, stopping timer"; + setBlindState(BlindStateStopped, thing); + } + } + }); + } + + // Fall trough, if not already finished and returned... + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericShading::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == awningThingClassId) { + if (action.actionTypeId() == awningOpenActionTypeId) { + thing->setStateValue(awningStatusStateTypeId, "Opening"); + thing->setStateValue(awningClosingOutputStateTypeId, false); + thing->setStateValue(awningOpeningOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == awningStopActionTypeId) { + thing->setStateValue(awningStatusStateTypeId, "Stopped"); + thing->setStateValue(awningOpeningOutputStateTypeId, false); + thing->setStateValue(awningClosingOutputStateTypeId, false); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == awningCloseActionTypeId) { + thing->setStateValue(awningStatusStateTypeId, "Closing"); + thing->setStateValue(awningOpeningOutputStateTypeId, false); + thing->setStateValue(awningClosingOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == awningOpeningOutputActionTypeId) { + bool on = action.param(awningOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); + thing->setStateValue(awningOpeningOutputStateTypeId, on); + if (on) { + thing->setStateValue(awningStatusStateTypeId, "Opening"); + thing->setStateValue(awningClosingOutputStateTypeId, false); + } else { + thing->setStateValue(awningStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == awningClosingOutputActionTypeId) { + bool on = action.param(awningClosingOutputActionClosingOutputParamTypeId).value().toBool(); + thing->setStateValue(awningClosingOutputStateTypeId, on); + if (on) { + thing->setStateValue(awningStatusStateTypeId, "Closing"); + thing->setStateValue(awningOpeningOutputStateTypeId, false); + } else { + thing->setStateValue(awningStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == blindThingClassId ) { + if (action.actionTypeId() == blindOpenActionTypeId) { + thing->setStateValue(blindStatusStateTypeId, "Opening"); + thing->setStateValue(blindClosingOutputStateTypeId, false); + thing->setStateValue(blindOpeningOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == blindStopActionTypeId) { + thing->setStateValue(blindStatusStateTypeId, "Stopped"); + thing->setStateValue(blindOpeningOutputStateTypeId, false); + thing->setStateValue(blindClosingOutputStateTypeId, false); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == blindCloseActionTypeId) { + thing->setStateValue(blindStatusStateTypeId, "Closing"); + thing->setStateValue(blindOpeningOutputStateTypeId, false); + thing->setStateValue(blindClosingOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == blindOpeningOutputActionTypeId) { + bool on = action.param(blindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); + thing->setStateValue(blindOpeningOutputStateTypeId, on); + if (on) { + thing->setStateValue(blindStatusStateTypeId, "Opening"); + thing->setStateValue(blindClosingOutputStateTypeId, false); + } else { + thing->setStateValue(blindStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == blindClosingOutputActionTypeId) { + bool on = action.param(blindClosingOutputActionClosingOutputParamTypeId).value().toBool(); + thing->setStateValue(blindClosingOutputStateTypeId, on); + if (on) { + thing->setStateValue(blindStatusStateTypeId, "Closing"); + thing->setStateValue(blindOpeningOutputStateTypeId, false); + } else { + thing->setStateValue(blindStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == extendedBlindThingClassId) { + + if (action.actionTypeId() == extendedBlindOpenActionTypeId) { + setBlindState(BlindStateOpening, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == extendedBlindStopActionTypeId) { + setBlindState(BlindStateStopped, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == extendedBlindCloseActionTypeId) { + setBlindState(BlindStateClosing, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == extendedBlindOpeningOutputActionTypeId) { + bool on = action.param(extendedBlindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); + thing->setStateValue(extendedBlindOpeningOutputStateTypeId, on); + if (on) { + setBlindState(BlindStateOpening, thing); + } else { + setBlindState(BlindStateStopped, thing); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == extendedBlindClosingOutputActionTypeId) { + bool on = action.param(extendedBlindClosingOutputActionClosingOutputParamTypeId).value().toBool(); + thing->setStateValue(extendedBlindClosingOutputStateTypeId, on); + if (on) { + setBlindState(BlindStateClosing, thing); + } else { + setBlindState(BlindStateStopped, thing); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == extendedBlindPercentageActionTypeId) { + moveBlindToPercentage(action, thing); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == venetianBlindThingClassId) { + if (action.actionTypeId() == venetianBlindOpenActionTypeId) { + setBlindState(BlindStateOpening, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindStopActionTypeId) { + setBlindState(BlindStateStopped, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindCloseActionTypeId) { + setBlindState(BlindStateClosing, thing); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindOpeningOutputActionTypeId) { + bool on = action.param(venetianBlindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); + thing->setStateValue(venetianBlindOpeningOutputStateTypeId, on); + if (on) { + setBlindState(BlindStateOpening, thing); + } else { + setBlindState(BlindStateStopped, thing); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindClosingOutputActionTypeId) { + bool on = action.param(venetianBlindClosingOutputActionClosingOutputParamTypeId).value().toBool(); + thing->setStateValue(venetianBlindClosingOutputStateTypeId, on); + if (on) { + setBlindState(BlindStateClosing, thing); + } else { + setBlindState(BlindStateStopped, thing); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindPercentageActionTypeId) { + moveBlindToPercentage(action, thing); + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == venetianBlindAngleActionTypeId) { + moveBlindToAngle(action, thing); + info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else if (thing->thingClassId() == shutterThingClassId) { + if (action.actionTypeId() == shutterOpenActionTypeId) { + thing->setStateValue(shutterStatusStateTypeId, "Opening"); + thing->setStateValue(shutterClosingOutputStateTypeId, false); + thing->setStateValue(shutterOpeningOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == shutterStopActionTypeId) { + thing->setStateValue(shutterStatusStateTypeId, "Stopped"); + thing->setStateValue(shutterOpeningOutputStateTypeId, false); + thing->setStateValue(shutterClosingOutputStateTypeId, false); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == shutterCloseActionTypeId) { + thing->setStateValue(shutterStatusStateTypeId, "Closing"); + thing->setStateValue(shutterOpeningOutputStateTypeId, false); + thing->setStateValue(shutterClosingOutputStateTypeId, true); + return info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == shutterOpeningOutputActionTypeId) { + bool on = action.param(shutterOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); + thing->setStateValue(shutterOpeningOutputStateTypeId, on); + if (on) { + thing->setStateValue(shutterStatusStateTypeId, "Opening"); + thing->setStateValue(shutterClosingOutputStateTypeId, false); + } else { + thing->setStateValue(shutterStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else if (action.actionTypeId() == shutterClosingOutputActionTypeId) { + bool on = action.param(shutterClosingOutputActionClosingOutputParamTypeId).value().toBool(); + thing->setStateValue(shutterClosingOutputStateTypeId, on); + if (on) { + thing->setStateValue(shutterStatusStateTypeId, "Closing"); + thing->setStateValue(shutterOpeningOutputStateTypeId, false); + } else { + thing->setStateValue(shutterStatusStateTypeId, "Stopped"); + } + info->finish(Thing::ThingErrorNoError); + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} + +void IntegrationPluginGenericShading::thingRemoved(Thing *thing) +{ + if (thing->thingClassId() == extendedBlindThingClassId) { + m_extendedBlindPercentageTimer.take(thing)->deleteLater(); + m_extendedBlindTargetPercentage.remove(thing); + } else if (thing->thingClassId() == venetianBlindThingClassId) { + m_extendedBlindPercentageTimer.take(thing)->deleteLater(); + m_extendedBlindTargetPercentage.remove(thing); + m_venetianBlindAngleTimer.take(thing)->deleteLater(); + m_venetianBlindTargetAngle.remove(thing); + } +} + +double IntegrationPluginGenericShading::mapDoubleValue(double value, double fromMin, double fromMax, double toMin, double toMax) +{ + double percent = (value - fromMin) / (fromMax - fromMin); + double toValue = toMin + (toMax - toMin) * percent; + return toValue; +} + +void IntegrationPluginGenericShading::setBlindState(IntegrationPluginGenericShading::BlindState state, Thing *thing) +{ + //If an ongoing "to percentage" actions is beeing executed, it is now overruled by another action + m_extendedBlindTargetPercentage.remove(thing); + + if (thing->thingClassId() == extendedBlindThingClassId) { + switch (state) { + case BlindStateOpening: + thing->setStateValue(extendedBlindStatusStateTypeId, "Opening"); + thing->setStateValue(extendedBlindClosingOutputStateTypeId, false); + thing->setStateValue(extendedBlindOpeningOutputStateTypeId, true); + thing->setStateValue(extendedBlindMovingStateTypeId, true); + m_extendedBlindPercentageTimer.value(thing)->start(); + break; + case BlindStateClosing: + thing->setStateValue(extendedBlindStatusStateTypeId, "Closing"); + thing->setStateValue(extendedBlindClosingOutputStateTypeId, true); + thing->setStateValue(extendedBlindOpeningOutputStateTypeId, false); + thing->setStateValue(extendedBlindMovingStateTypeId, true); + m_extendedBlindPercentageTimer.value(thing)->start(); + break; + case BlindStateStopped: + thing->setStateValue(extendedBlindStatusStateTypeId, "Stopped"); + thing->setStateValue(extendedBlindClosingOutputStateTypeId, false); + thing->setStateValue(extendedBlindOpeningOutputStateTypeId, false); + thing->setStateValue(extendedBlindMovingStateTypeId, false); + m_extendedBlindPercentageTimer.value(thing)->stop(); + break; + } + } else if (thing->thingClassId() == venetianBlindThingClassId) { + m_venetianBlindTargetAngle.remove(thing); + switch (state) { + case BlindStateOpening: + thing->setStateValue(venetianBlindStatusStateTypeId, "Opening"); + thing->setStateValue(venetianBlindClosingOutputStateTypeId, false); + thing->setStateValue(venetianBlindOpeningOutputStateTypeId, true); + thing->setStateValue(venetianBlindMovingStateTypeId, true); + m_extendedBlindPercentageTimer.value(thing)->start(); + m_venetianBlindAngleTimer.value(thing)->start(); + break; + case BlindStateClosing: + thing->setStateValue(venetianBlindStatusStateTypeId, "Closing"); + thing->setStateValue(venetianBlindClosingOutputStateTypeId, true); + thing->setStateValue(venetianBlindOpeningOutputStateTypeId, false); + thing->setStateValue(venetianBlindMovingStateTypeId, true); + m_extendedBlindPercentageTimer.value(thing)->start(); + m_venetianBlindAngleTimer.value(thing)->start(); + break; + case BlindStateStopped: + thing->setStateValue(venetianBlindStatusStateTypeId, "Stopped"); + thing->setStateValue(venetianBlindClosingOutputStateTypeId, false); + thing->setStateValue(venetianBlindOpeningOutputStateTypeId, false); + thing->setStateValue(venetianBlindMovingStateTypeId, false); + m_extendedBlindPercentageTimer.value(thing)->stop(); + m_venetianBlindAngleTimer.value(thing)->stop(); + break; + } + } +} + +void IntegrationPluginGenericShading::moveBlindToPercentage(Action action, Thing *thing) +{ + if (thing->thingClassId() == extendedBlindThingClassId) { + uint targetPercentage = action.param(extendedBlindPercentageActionPercentageParamTypeId).value().toUInt(); + uint currentPercentage = thing->stateValue(extendedBlindPercentageStateTypeId).toUInt(); + // 100% indicates the device is fully closed + if (targetPercentage == currentPercentage) { + qCDebug(dcGenericShading()) << "Extended blind is already at given percentage" << targetPercentage; + } else if (targetPercentage > currentPercentage) { + setBlindState(BlindStateClosing, thing); + m_extendedBlindTargetPercentage.insert(thing, targetPercentage); + } else if (targetPercentage < currentPercentage) { + setBlindState(BlindStateOpening, thing); + m_extendedBlindTargetPercentage.insert(thing, targetPercentage); + } else { + setBlindState(BlindStateStopped, thing); + } + } else if (thing->thingClassId() == venetianBlindThingClassId) { + uint targetPercentage = action.param(venetianBlindPercentageActionPercentageParamTypeId).value().toUInt(); + uint currentPercentage = thing->stateValue(venetianBlindPercentageStateTypeId).toUInt(); + qCDebug(dcGenericShading()) << "Moving venetian blind to percentage" << targetPercentage << "Current percentage:" << currentPercentage; + // 100% indicates the device is fully closed + if (targetPercentage == currentPercentage) { + qCDebug(dcGenericShading()) << "Extended blind is already at given percentage" << targetPercentage; + } else if (targetPercentage > currentPercentage) { + setBlindState(BlindStateClosing, thing); + m_extendedBlindTargetPercentage.insert(thing, targetPercentage); + } else if (targetPercentage < currentPercentage) { + setBlindState(BlindStateOpening, thing); + m_extendedBlindTargetPercentage.insert(thing, targetPercentage); + } else { + setBlindState(BlindStateStopped, thing); + } + } else { + qCDebug(dcGenericShading()) << "Move to percentage doesn't support this thingClass"; + } +} + +void IntegrationPluginGenericShading::moveBlindToAngle(Action action, Thing *thing) +{ + if (thing->thingClassId() == venetianBlindThingClassId) { + if (action.actionTypeId() == venetianBlindAngleActionTypeId) { + //NOTE moving percentage affects the angle but the angle doesnt affect the percentage + // opening -> -90 + // closing -> +90 + int targetAngle = action.param(venetianBlindAngleActionAngleParamTypeId).value().toInt(); + int currentAngle = thing->stateValue(venetianBlindAngleStateTypeId).toInt(); + if (targetAngle == currentAngle) { + qCDebug(dcGenericShading()) << "Venetian blind is already at given angle" << targetAngle; + } else if (targetAngle > currentAngle) { + setBlindState(BlindStateClosing, thing); + m_venetianBlindTargetAngle.insert(thing, targetAngle); + } else if (targetAngle < currentAngle) { + setBlindState(BlindStateOpening, thing); + m_venetianBlindTargetAngle.insert(thing, targetAngle); + } else { + setBlindState(BlindStateStopped, thing); + } + } + } else { + qCDebug(dcGenericShading()) << "Move to angle doesn't support this thingClass"; + } +} diff --git a/genericthings/integrationplugingenericthings.h b/genericshading/integrationplugingenericshading.h similarity index 82% rename from genericthings/integrationplugingenericthings.h rename to genericshading/integrationplugingenericshading.h index ec42adc..f923735 100644 --- a/genericthings/integrationplugingenericthings.h +++ b/genericshading/integrationplugingenericshading.h @@ -37,31 +37,26 @@ #include -class IntegrationPluginGenericThings: public IntegrationPlugin +class IntegrationPluginGenericShading: public IntegrationPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericthings.json") + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericshading.json") Q_INTERFACES(IntegrationPlugin) public: - explicit IntegrationPluginGenericThings(); + explicit IntegrationPluginGenericShading(); void setupThing(ThingSetupInfo *info) override; void executeAction(ThingActionInfo *info) override; void thingRemoved(Thing *thing) override; private: - QHash m_pulsesPerTimeframe; - double mapDoubleValue(double value, double fromMin, double fromMax, double toMin, double toMax); QHash m_extendedBlindPercentageTimer; QHash m_venetianBlindAngleTimer; - QHash m_smartMeterTimer; QHash m_extendedBlindTargetPercentage; QHash m_venetianBlindTargetAngle; - QHash m_statefulGaragePercentageTimer; - QHash m_statefulGarageTargetPercentage; enum BlindState { BlindStateOpening, @@ -72,10 +67,6 @@ private: void moveBlindToPercentage(Action action, Thing *thing); void moveBlindToAngle(Action action, Thing *thing); - void thermostatCheckPowerOutputState(Thing *thing); - - QString sgReadyOperatingMode(bool relay1, bool relay2); - QString sgReadyOperatingModeDescription(const QString &operatingModeString); }; #endif // INTEGRATIONPLUGINGENERICTHINGS_H diff --git a/genericshading/integrationplugingenericshading.json b/genericshading/integrationplugingenericshading.json new file mode 100644 index 0000000..4c0031f --- /dev/null +++ b/genericshading/integrationplugingenericshading.json @@ -0,0 +1,402 @@ +{ + "name": "genericShading", + "displayName": "Generic shading devices", + "id": "82f10aec-22cf-4fa9-aa46-f2f9d0db32a4", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "9e69585f-90ba-44e4-ad90-5b4bffbe345a", + "name": "awning", + "displayName": "Generic awning", + "createMethods": ["user"], + "interfaces": ["awning"], + "stateTypes": [ + { + "id": "4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "displayNameAction": "Set opening output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "59bfd575-709f-4e43-9726-de26e6d4ca8b", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "displayNameAction": "Set closing output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "ff6f2565-2a2e-4d34-b10f-d3f73b676399", + "name": "status", + "displayName": "Status", + "displayNameEvent": "Status changed", + "type": "QString", + "possibleValues": [ + "Opening", + "Stopped", + "Closing" + ], + "defaultValue": "Stopped" + } + ], + "actionTypes": [ + { + "id": "979e9c51-5a93-4635-85e3-01874306b229", + "name": "open", + "displayName": "Open" + }, + { + "id": "555cafe4-bd12-42c6-bab1-8cd59af6468e", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "53b5ba77-9a34-4cd6-ad24-fb01fc465f98", + "name": "close", + "displayName": "Close" + } + ] + }, + { + "id": "17ee3657-6ad8-4ae2-8959-3cf66cec8d13", + "name": "blind", + "displayName": "Generic blind", + "createMethods": ["user"], + "interfaces": ["blind"], + "stateTypes": [ + { + "id": "b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "displayNameAction": "Set opening output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "9b673430-572d-4a9c-85d3-dafadbe541cd", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "displayNameAction": "Set closing output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "5fdec1e0-51f6-48b9-b743-ba572504b2c1", + "name": "status", + "displayName": "Status", + "displayNameEvent": "Status changed", + "type": "QString", + "possibleValues": [ + "Opening", + "Stopped", + "Closing" + ], + "defaultValue": "Stopped" + } + ], + "actionTypes": [ + { + "id": "120dc265-dbbb-4f19-9d31-c372c23479c0", + "name": "open", + "displayName": "Open" + }, + { + "id": "1a924c9a-5dcb-4b1c-8fd6-ab101098e007", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "86e9cf21-7487-47c4-b4be-4a940d7235fb", + "name": "close", + "displayName": "Close" + } + ] + }, + { + "id": "40aa9f3c-a23c-4f7f-8786-fcf3554f3e19", + "name": "extendedBlind", + "displayName": "Generic blind with position control", + "createMethods": ["user"], + "interfaces": ["extendedblind"], + "settingsTypes": [ + { + "id": "27a95b8d-7f97-441b-a3be-0646c517cb06", + "name": "closingDuration", + "displayName": "Closing duration [ms]", + "type": "uint", + "minValue": 1000, + "defaultValue": 5000 + } + ], + "stateTypes": [ + { + "id": "e559f077-e904-4bbc-8ec3-344b814d2eab", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "displayNameAction": "Set opening output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "1a4a5839-a30d-4239-a124-63bfdc74a8f6", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "displayNameAction": "Set closing output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "c2354d7e-198a-43ae-aa5f-c6710010c7e1", + "name": "status", + "displayName": "Status", + "displayNameEvent": "Status changed", + "type": "QString", + "possibleValues": [ + "Opening", + "Stopped", + "Closing" + ], + "defaultValue": "Stopped" + }, + { + "id": "941d1e1f-8dd7-4493-812f-6cefefd88c2e", + "name": "moving", + "type": "bool", + "displayName": "Moving", + "displayNameEvent": "Moving changed", + "defaultValue": false + }, + { + "id": "181df603-d45f-4d3d-a358-97aa3e4ac0bd", + "name": "percentage", + "displayName": "Percentage", + "displayNameEvent": "Percentage changed", + "displayNameAction": "Set percentage", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 0, + "unit": "Percentage", + "writable": true + } + ], + "actionTypes": [ + { + "id": "5a7599fa-8351-4ed6-9b98-fa2f3be54304", + "name": "open", + "displayName": "Open" + }, + { + "id": "ab67e4bf-c7b6-489b-9b49-3e0a1c7d33ca", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "97d6351d-7440-47f3-bdba-a31bb15368ac", + "name": "close", + "displayName": "Close" + } + ] + }, + { + "id": "e6b96ced-8d50-45da-91c8-792d364d2795", + "name": "venetianBlind", + "displayName": "Venetian blind", + "createMethods": ["user"], + "interfaces": ["venetianblind"], + "settingsTypes": [ + { + "id": "4c0bf07d-aaab-4f67-af65-00ceaefbaa84", + "name": "closingDuration", + "displayName": "Closing duration [ms]", + "minValue": 1000, + "type": "uint", + "defaultValue": 5000 + }, + { + "id": "6c8340bf-7fd3-43e3-a75b-dfa2f6426e11", + "name": "angleTime", + "displayName": "Angle end to end time [ms]", + "minValue": 1, + "type": "uint", + "defaultValue": 1000 + } + ], + "stateTypes": [ + { + "id": "6041dacf-5303-4dc0-ba3c-7ecaa438f2dd", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "displayNameAction": "Set opening output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "84dd2fa1-85fe-47f3-9e32-e6083432d39c", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "displayNameAction": "Set closing output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "6fb7826e-b6d8-42f8-b712-719496046436", + "name": "status", + "displayName": "Status", + "displayNameEvent": "Status changed", + "type": "QString", + "possibleValues": [ + "Opening", + "Stopped", + "Closing" + ], + "defaultValue": "Stopped" + }, + { + "id": "6234c07e-4200-4f2c-8cbd-bff24c38c243", + "name": "moving", + "type": "bool", + "displayName": "Moving", + "displayNameEvent": "Moving changed", + "defaultValue": false + }, + { + "id": "33dc8019-336d-4d50-8d60-dff8508338ca", + "name": "percentage", + "displayName": "Percentage", + "displayNameEvent": "Percentage changed", + "displayNameAction": "Set percentage", + "type": "int", + "minValue": 0, + "maxValue": 100, + "defaultValue": 0, + "unit": "Percentage", + "writable": true + }, + { + "id": "fcb700c4-5da8-4385-85b0-6616e807974e", + "name": "angle", + "displayName": "Angle", + "displayNameEvent": "Angle changed", + "displayNameAction": "Set angle", + "type": "int", + "unit": "Degree", + "minValue": -90, + "maxValue": 90, + "defaultValue": 0, + "writable": true + } + ], + "actionTypes": [ + { + "id": "3e728e50-3d45-4035-b215-1e604cf3159b", + "name": "open", + "displayName": "Open" + }, + { + "id": "6e3eeb5d-d7ed-4175-9795-e76451e0a00b", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "1c71f050-f6cb-4929-9c9d-7c262f77c143", + "name": "close", + "displayName": "Close" + } + ] + }, + { + "id": "7917c2e7-d7d2-4c47-a38d-41f7dd7693d9", + "name": "shutter", + "displayName": "Generic shutter", + "createMethods": ["user"], + "interfaces": ["shutter"], + "stateTypes": [ + { + "id": "cc547728-b309-4695-b355-49748ef2521c", + "name": "openingOutput", + "displayName": "Opening output", + "displayNameEvent": "Opening output changed", + "displayNameAction": "Set opening output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "1c35df0e-4c41-455f-893a-0145377952a0", + "name": "closingOutput", + "displayName": "Closing output", + "displayNameEvent": "Closing output changed", + "displayNameAction": "Set closing output", + "type": "bool", + "defaultValue": false, + "ioType": "digitalInput", + "writable": true + }, + { + "id": "6d6e72dc-4d2b-4ec1-82c2-54405a682711", + "name": "status", + "displayName": "Status", + "displayNameEvent": "Status changed", + "type": "QString", + "possibleValues": [ + "Opening", + "Stopped", + "Closing" + ], + "defaultValue": "Stopped" + } + ], + "actionTypes": [ + { + "id": "9deb662d-2378-4345-a898-8742d41e43c1", + "name": "open", + "displayName": "Open" + }, + { + "id": "db5f3332-1f4e-4f9e-84d2-93c5d7de315c", + "name": "stop", + "displayName": "Stop" + }, + { + "id": "cf5303f1-67c7-4cef-b11c-eb9de6fc8a87", + "name": "close", + "displayName": "Close" + } + ] + } + ] + } + ] +} diff --git a/genericshading/translations/82f10aec-22cf-4fa9-aa46-f2f9d0db32a4-en_US.ts b/genericshading/translations/82f10aec-22cf-4fa9-aa46-f2f9d0db32a4-en_US.ts new file mode 100644 index 0000000..e47550e --- /dev/null +++ b/genericshading/translations/82f10aec-22cf-4fa9-aa46-f2f9d0db32a4-en_US.ts @@ -0,0 +1,294 @@ + + + + + GenericShading + + + + Angle + The name of the ParamType (ThingClass: venetianBlind, ActionType: angle, ID: {fcb700c4-5da8-4385-85b0-6616e807974e}) +---------- +The name of the StateType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind + + + + + Angle end to end time [ms] + The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {6c8340bf-7fd3-43e3-a75b-dfa2f6426e11}) + + + + + + + + + Close + The name of the ActionType ({cf5303f1-67c7-4cef-b11c-eb9de6fc8a87}) of ThingClass shutter +---------- +The name of the ActionType ({1c71f050-f6cb-4929-9c9d-7c262f77c143}) of ThingClass venetianBlind +---------- +The name of the ActionType ({97d6351d-7440-47f3-bdba-a31bb15368ac}) of ThingClass extendedBlind +---------- +The name of the ActionType ({86e9cf21-7487-47c4-b4be-4a940d7235fb}) of ThingClass blind +---------- +The name of the ActionType ({53b5ba77-9a34-4cd6-ad24-fb01fc465f98}) of ThingClass awning + + + + + + Closing duration [ms] + The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {4c0bf07d-aaab-4f67-af65-00ceaefbaa84}) +---------- +The name of the ParamType (ThingClass: extendedBlind, Type: settings, ID: {27a95b8d-7f97-441b-a3be-0646c517cb06}) + + + + + + + + + + + + + + Closing output + The name of the ParamType (ThingClass: shutter, ActionType: closingOutput, ID: {1c35df0e-4c41-455f-893a-0145377952a0}) +---------- +The name of the StateType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter +---------- +The name of the ParamType (ThingClass: venetianBlind, ActionType: closingOutput, ID: {84dd2fa1-85fe-47f3-9e32-e6083432d39c}) +---------- +The name of the StateType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind +---------- +The name of the ParamType (ThingClass: extendedBlind, ActionType: closingOutput, ID: {1a4a5839-a30d-4239-a124-63bfdc74a8f6}) +---------- +The name of the StateType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind +---------- +The name of the ParamType (ThingClass: blind, ActionType: closingOutput, ID: {9b673430-572d-4a9c-85d3-dafadbe541cd}) +---------- +The name of the StateType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind +---------- +The name of the ParamType (ThingClass: awning, ActionType: closingOutput, ID: {59bfd575-709f-4e43-9726-de26e6d4ca8b}) +---------- +The name of the StateType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning + + + + + Generic Shading Things + The name of the plugin GenericShading ({82f10aec-22cf-4fa9-aa46-f2f9d0db32a4}) + + + + + Generic awning + The name of the ThingClass ({9e69585f-90ba-44e4-ad90-5b4bffbe345a}) + + + + + Generic blind + The name of the ThingClass ({17ee3657-6ad8-4ae2-8959-3cf66cec8d13}) + + + + + Generic blind with position control + The name of the ThingClass ({40aa9f3c-a23c-4f7f-8786-fcf3554f3e19}) + + + + + Generic shutter + The name of the ThingClass ({7917c2e7-d7d2-4c47-a38d-41f7dd7693d9}) + + + + + + Moving + The name of the StateType ({6234c07e-4200-4f2c-8cbd-bff24c38c243}) of ThingClass venetianBlind +---------- +The name of the StateType ({941d1e1f-8dd7-4493-812f-6cefefd88c2e}) of ThingClass extendedBlind + + + + + + + + + Open + The name of the ActionType ({9deb662d-2378-4345-a898-8742d41e43c1}) of ThingClass shutter +---------- +The name of the ActionType ({3e728e50-3d45-4035-b215-1e604cf3159b}) of ThingClass venetianBlind +---------- +The name of the ActionType ({5a7599fa-8351-4ed6-9b98-fa2f3be54304}) of ThingClass extendedBlind +---------- +The name of the ActionType ({120dc265-dbbb-4f19-9d31-c372c23479c0}) of ThingClass blind +---------- +The name of the ActionType ({979e9c51-5a93-4635-85e3-01874306b229}) of ThingClass awning + + + + + + + + + + + + + + Opening output + The name of the ParamType (ThingClass: shutter, ActionType: openingOutput, ID: {cc547728-b309-4695-b355-49748ef2521c}) +---------- +The name of the StateType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter +---------- +The name of the ParamType (ThingClass: venetianBlind, ActionType: openingOutput, ID: {6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) +---------- +The name of the StateType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind +---------- +The name of the ParamType (ThingClass: extendedBlind, ActionType: openingOutput, ID: {e559f077-e904-4bbc-8ec3-344b814d2eab}) +---------- +The name of the StateType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind +---------- +The name of the ParamType (ThingClass: blind, ActionType: openingOutput, ID: {b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) +---------- +The name of the StateType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind +---------- +The name of the ParamType (ThingClass: awning, ActionType: openingOutput, ID: {4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) +---------- +The name of the StateType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning + + + + + + + + Percentage + The name of the ParamType (ThingClass: venetianBlind, ActionType: percentage, ID: {33dc8019-336d-4d50-8d60-dff8508338ca}) +---------- +The name of the StateType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind +---------- +The name of the ParamType (ThingClass: extendedBlind, ActionType: percentage, ID: {181df603-d45f-4d3d-a358-97aa3e4ac0bd}) +---------- +The name of the StateType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind + + + + + Set angle + The name of the ActionType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind + + + + + + + + + Set closing output + The name of the ActionType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter +---------- +The name of the ActionType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind +---------- +The name of the ActionType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind +---------- +The name of the ActionType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind +---------- +The name of the ActionType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning + + + + + + + + + Set opening output + The name of the ActionType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter +---------- +The name of the ActionType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind +---------- +The name of the ActionType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind +---------- +The name of the ActionType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind +---------- +The name of the ActionType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning + + + + + + Set percentage + The name of the ActionType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind +---------- +The name of the ActionType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind + + + + + + + + + Status + The name of the StateType ({6d6e72dc-4d2b-4ec1-82c2-54405a682711}) of ThingClass shutter +---------- +The name of the StateType ({6fb7826e-b6d8-42f8-b712-719496046436}) of ThingClass venetianBlind +---------- +The name of the StateType ({c2354d7e-198a-43ae-aa5f-c6710010c7e1}) of ThingClass extendedBlind +---------- +The name of the StateType ({5fdec1e0-51f6-48b9-b743-ba572504b2c1}) of ThingClass blind +---------- +The name of the StateType ({ff6f2565-2a2e-4d34-b10f-d3f73b676399}) of ThingClass awning + + + + + + + + + Stop + The name of the ActionType ({db5f3332-1f4e-4f9e-84d2-93c5d7de315c}) of ThingClass shutter +---------- +The name of the ActionType ({6e3eeb5d-d7ed-4175-9795-e76451e0a00b}) of ThingClass venetianBlind +---------- +The name of the ActionType ({ab67e4bf-c7b6-489b-9b49-3e0a1c7d33ca}) of ThingClass extendedBlind +---------- +The name of the ActionType ({1a924c9a-5dcb-4b1c-8fd6-ab101098e007}) of ThingClass blind +---------- +The name of the ActionType ({555cafe4-bd12-42c6-bab1-8cd59af6468e}) of ThingClass awning + + + + + Venetian blind + The name of the ThingClass ({e6b96ced-8d50-45da-91c8-792d364d2795}) + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + + IntegrationPluginGenericShading + + + Invalid closing or angle time + + + + diff --git a/genericthing/README.md b/genericthing/README.md new file mode 100644 index 0000000..03627b0 --- /dev/null +++ b/genericthing/README.md @@ -0,0 +1,11 @@ +# Generic thing + +This plugin allows to create generic things in nymea. Such things don't have any +functionality on their own, but allow to create a general purpose thing to hold +various data obtained from other general purpose inputs and outputs, such as GPIOs +or MQTT. + +## Set-up + +Set up a generic thing and use the things settings to connect the inputs or outputs or +use nymea scripts to fill in data in the generic thing. diff --git a/genericthing/genericthing.pro b/genericthing/genericthing.pro new file mode 100644 index 0000000..3f699bc --- /dev/null +++ b/genericthing/genericthing.pro @@ -0,0 +1,10 @@ +include(../plugins.pri) + +SOURCES += \ + integrationplugingenericthing.cpp + +HEADERS += \ + integrationplugingenericthing.h + + + diff --git a/genericthing/integrationplugingenericthing.cpp b/genericthing/integrationplugingenericthing.cpp new file mode 100644 index 0000000..f7c8daf --- /dev/null +++ b/genericthing/integrationplugingenericthing.cpp @@ -0,0 +1,82 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io + +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "integrationplugingenericthing.h" +#include "plugininfo.h" + +#include +#include + +IntegrationPluginGenericThing::IntegrationPluginGenericThing() +{ + +} + +void IntegrationPluginGenericThing::setupThing(ThingSetupInfo *info) +{ + info->finish(Thing::ThingErrorNoError); +} + +void IntegrationPluginGenericThing::executeAction(ThingActionInfo *info) +{ + Thing *thing = info->thing(); + Action action = info->action(); + + if (thing->thingClassId() == genericThingClassId) { + if (action.actionTypeId() == genericAnalogInputActionTypeId) { + thing->setStateValue(genericAnalogInputStateTypeId, action.paramValue(genericAnalogInputActionAnalogInputParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == genericAnalogOutputActionTypeId) { + thing->setStateValue(genericAnalogOutputStateTypeId, action.paramValue(genericAnalogOutputActionAnalogOutputParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == genericDigitalInputActionTypeId) { + thing->setStateValue(genericDigitalInputStateTypeId, action.paramValue(genericDigitalInputActionDigitalInputParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == genericDigitalOutputActionTypeId) { + thing->setStateValue(genericDigitalOutputStateTypeId, action.paramValue(genericDigitalOutputActionDigitalOutputParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + if (action.actionTypeId() == genericStringStateActionTypeId) { + thing->setStateValue(genericStringStateStateTypeId, action.paramValue(genericStringStateActionStringStateParamTypeId)); + info->finish(Thing::ThingErrorNoError); + return; + } + } else { + Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); + } +} diff --git a/genericthing/integrationplugingenericthing.h b/genericthing/integrationplugingenericthing.h new file mode 100644 index 0000000..3607121 --- /dev/null +++ b/genericthing/integrationplugingenericthing.h @@ -0,0 +1,53 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef INTEGRATIONPLUGINGENERICTHING_H +#define INTEGRATIONPLUGINGENERICTHING_H + +#include "integrations/integrationplugin.h" +#include "plugintimer.h" +#include "extern-plugininfo.h" + +#include + +class IntegrationPluginGenericThing: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingenericthing.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginGenericThing(); + void setupThing(ThingSetupInfo *info) override; + void executeAction(ThingActionInfo *info) override; +}; + +#endif // INTEGRATIONPLUGINGENERICTHING_H diff --git a/genericthing/integrationplugingenericthing.json b/genericthing/integrationplugingenericthing.json new file mode 100644 index 0000000..88b9bb2 --- /dev/null +++ b/genericthing/integrationplugingenericthing.json @@ -0,0 +1,80 @@ +{ + "name": "genericThing", + "displayName": "Generic thing", + "id": "3c7bb595-b72a-4c3c-8414-1b2ac26bc021", + "vendors": [ + { + "name": "nymea", + "displayName": "nymea", + "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", + "thingClasses": [ + { + "id": "f5c02d35-b06e-4950-8238-847d50cabfdf", + "name": "generic", + "displayName": "Generic thing", + "createMethods": ["user"], + "stateTypes": [ + { + "id": "f477e227-0d2d-4d88-a545-7dedf36266d5", + "name": "stringState", + "displayName": "String state", + "displayNameEvent": "String state changed", + "displayNameAction": "Set string state", + "type": "QString", + "defaultValue": "", + "writable": true + }, + { + "id": "3cf5eb01-dae8-49cd-8c5f-b0224be0044f", + "name": "digitalInput", + "displayName": "Digital input", + "displayNameEvent": "Digital input changed", + "displayNameAction": "Set digital input", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalInput" + }, + { + "id": "605b4d8e-71a7-441e-900a-e07c305acd93", + "name": "digitalOutput", + "displayName": "Digital output", + "displayNameEvent": "Digital output changed", + "displayNameAction": "Set digital output", + "type": "bool", + "defaultValue": false, + "writable": true, + "ioType": "digitalOutput" + }, + { + "id": "810fcd3c-7854-4bb1-82f6-1403ba54875e", + "name": "analogInput", + "displayName": "Analog input", + "displayNameEvent": "Analog input changed", + "displayNameAction": "Set analog input", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 1, + "ioType": "analogInput", + "writable": true + }, + { + "id": "de8ec1b1-8026-4fd8-aefb-dedc07616aa4", + "name": "analogOutput", + "displayName": "Analog output", + "displayNameEvent": "Analog output changed", + "displayNameAction": "Set analog output", + "type": "double", + "defaultValue": 0, + "minValue": 0, + "maxValue": 1, + "ioType": "analogOutput", + "writable": true + } + ] + } + ] + } + ] +} diff --git a/genericthing/translations/3c7bb595-b72a-4c3c-8414-1b2ac26bc021-en_US.ts b/genericthing/translations/3c7bb595-b72a-4c3c-8414-1b2ac26bc021-en_US.ts new file mode 100644 index 0000000..2b1fcfd --- /dev/null +++ b/genericthing/translations/3c7bb595-b72a-4c3c-8414-1b2ac26bc021-en_US.ts @@ -0,0 +1,100 @@ + + + + + GenericThing + + + + Analog input + The name of the ParamType (ThingClass: generic, ActionType: analogInput, ID: {810fcd3c-7854-4bb1-82f6-1403ba54875e}) +---------- +The name of the StateType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic + + + + + + Analog output + The name of the ParamType (ThingClass: generic, ActionType: analogOutput, ID: {de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) +---------- +The name of the StateType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic + + + + + + Digital input + The name of the ParamType (ThingClass: generic, ActionType: digitalInput, ID: {3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) +---------- +The name of the StateType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic + + + + + + Digital output + The name of the ParamType (ThingClass: generic, ActionType: digitalOutput, ID: {605b4d8e-71a7-441e-900a-e07c305acd93}) +---------- +The name of the StateType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic + + + + + Generic Thing + The name of the plugin GenericThing ({3c7bb595-b72a-4c3c-8414-1b2ac26bc021}) + + + + + Generic thing + The name of the ThingClass ({f5c02d35-b06e-4950-8238-847d50cabfdf}) + + + + + Set analog input + The name of the ActionType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic + + + + + Set analog output + The name of the ActionType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic + + + + + Set digital input + The name of the ActionType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic + + + + + Set digital output + The name of the ActionType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic + + + + + Set string state + The name of the ActionType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic + + + + + + String state + The name of the ParamType (ThingClass: generic, ActionType: stringState, ID: {f477e227-0d2d-4d88-a545-7dedf36266d5}) +---------- +The name of the StateType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic + + + + + nymea + The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) + + + + diff --git a/genericthings/genericthings.pro b/genericthings/genericthings.pro deleted file mode 100644 index 91b2c27..0000000 --- a/genericthings/genericthings.pro +++ /dev/null @@ -1,10 +0,0 @@ -include(../plugins.pri) - -SOURCES += \ - integrationplugingenericthings.cpp - -HEADERS += \ - integrationplugingenericthings.h - - - diff --git a/genericthings/integrationplugingenericthings.cpp b/genericthings/integrationplugingenericthings.cpp deleted file mode 100644 index 67429a0..0000000 --- a/genericthings/integrationplugingenericthings.cpp +++ /dev/null @@ -1,1169 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io - -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "integrationplugingenericthings.h" -#include "plugininfo.h" - -#include -#include - -IntegrationPluginGenericThings::IntegrationPluginGenericThings() -{ - -} - -void IntegrationPluginGenericThings::setupThing(ThingSetupInfo *info) -{ - Thing *thing = info->thing(); - - if (thing->thingClassId() == extendedBlindThingClassId) { - uint closingDuration = thing->setting(extendedBlindSettingsClosingDurationParamTypeId).toUInt(); - QTimer* timer = new QTimer(this); - timer->setInterval(closingDuration/100.00); // closing timer / 100 to update on every percent - m_extendedBlindPercentageTimer.insert(thing, timer); - connect(thing, &Thing::settingChanged, thing, [timer] (const ParamTypeId ¶mTypeId, const QVariant &value) { - if (paramTypeId == extendedBlindSettingsClosingDurationParamTypeId) { - timer->setInterval(value.toUInt()/100.00); - } - }); - connect(timer, &QTimer::timeout, this, [thing, this] { - uint currentPercentage = thing->stateValue(extendedBlindPercentageStateTypeId).toUInt(); - - if (thing->stateValue(extendedBlindStatusStateTypeId).toString() == "Closing") { - - if (currentPercentage == 100) { - setBlindState(BlindStateStopped, thing); - qCDebug(dcGenericThings()) << "Extended blind is closed, stopping timer"; - } else { - currentPercentage++; - thing->setStateValue(extendedBlindPercentageStateTypeId, currentPercentage); - } - } else if (thing->stateValue(extendedBlindStatusStateTypeId).toString() == "Opening") { - - if (currentPercentage == 0) { - setBlindState(BlindStateStopped, thing); - qCDebug(dcGenericThings()) << "Extended blind is opened, stopping timer"; - } else { - currentPercentage--; - thing->setStateValue(extendedBlindPercentageStateTypeId, currentPercentage); - } - } else { - setBlindState(BlindStateStopped, thing); - } - - if (m_extendedBlindPercentageTimer.contains(thing)) { - uint targetPercentage = m_extendedBlindTargetPercentage.value(thing); - if (targetPercentage == currentPercentage) { - qCDebug(dcGenericThings()) << "Extended blind has reached target percentage, stopping timer"; - setBlindState(BlindStateStopped, thing); - } - } - }); - } else if (info->thing()->thingClassId() == venetianBlindThingClassId) { - uint closingTime = thing->setting(venetianBlindSettingsClosingDurationParamTypeId).toUInt(); - uint angleTime = thing->setting(venetianBlindSettingsAngleTimeParamTypeId).toUInt(); - if (closingTime < angleTime) { - return info->finish(Thing::ThingErrorSetupFailed, tr("Invalid closing or angle time")); - } - QTimer* closingTimer = new QTimer(this); - closingTimer->setInterval(closingTime/100.00); // closing timer / 100 to update on every percent - m_extendedBlindPercentageTimer.insert(thing, closingTimer); - - connect(closingTimer, &QTimer::timeout, thing, [thing, this] { - uint currentPercentage = thing->stateValue(venetianBlindPercentageStateTypeId).toUInt(); - - if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Closing") { - - if (currentPercentage == 100) { - setBlindState(BlindStateStopped, thing); - qCDebug(dcGenericThings()) << "Venetian blind is closed, stopping timer"; - } else if (currentPercentage > 100) { - currentPercentage = 100; - setBlindState(BlindStateStopped, thing); - qCWarning(dcGenericThings()) << "Venetian blind overshoot 100 percent"; - } else { - currentPercentage++; - thing->setStateValue(venetianBlindPercentageStateTypeId, currentPercentage); - } - } else if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Opening") { - - if (currentPercentage == 0) { - setBlindState(BlindStateStopped, thing); - qCDebug(dcGenericThings()) << "Venetian blind is opened, stopping timer"; - } else { - currentPercentage--; - thing->setStateValue(venetianBlindPercentageStateTypeId, currentPercentage); - } - } else { - setBlindState(BlindStateStopped, thing); - } - - if (m_extendedBlindPercentageTimer.contains(thing)) { - uint targetPercentage = m_extendedBlindTargetPercentage.value(thing); - if (targetPercentage == currentPercentage) { - qCDebug(dcGenericThings()) << "Venetian blind has reached target percentage, stopping timer"; - setBlindState(BlindStateStopped, thing); - } - } - }); - - QTimer* angleTimer = new QTimer(this); - angleTimer->setInterval(angleTime/180.00); // -90 to 90 degree -> 180 degree total - m_venetianBlindAngleTimer.insert(thing, angleTimer); - connect(thing, &Thing::settingChanged, thing, [closingTimer, angleTimer] (const ParamTypeId ¶mTypeId, const QVariant &value) { - if (paramTypeId == venetianBlindSettingsClosingDurationParamTypeId) { - closingTimer->setInterval(value.toUInt()/100.00); - } else if (paramTypeId == venetianBlindSettingsAngleTimeParamTypeId) { - angleTimer->setInterval(value.toUInt()/180.00); - } - }); - connect(angleTimer, &QTimer::timeout, thing, [thing, this] { - int currentAngle = thing->stateValue(venetianBlindAngleStateTypeId).toInt(); - if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Closing") { - - if (currentAngle < 90) { - currentAngle++; - } else if (currentAngle == 90) { - m_venetianBlindAngleTimer.value(thing)->stop(); - } else if (currentAngle > 90) { - currentAngle = 90; - m_venetianBlindAngleTimer.value(thing)->stop(); - qCWarning(dcGenericThings()) << "Venetian blind overshoot angle boundaries"; - } - thing->setStateValue(venetianBlindAngleStateTypeId, currentAngle); - } else if (thing->stateValue(venetianBlindStatusStateTypeId).toString() == "Opening") { - - if (currentAngle > -90) { - currentAngle--; - } else if (currentAngle == -90) { - m_venetianBlindAngleTimer.value(thing)->stop(); - } else if (currentAngle < -90) { - currentAngle = -90; - m_venetianBlindAngleTimer.value(thing)->stop(); - qCWarning(dcGenericThings()) << "Venetian blind overshoot angle boundaries"; - } - thing->setStateValue(venetianBlindAngleStateTypeId, currentAngle); - } - - if (m_venetianBlindTargetAngle.contains(thing)) { - int targetAngle = m_venetianBlindTargetAngle.value(thing); - if (targetAngle == currentAngle) { - qCDebug(dcGenericThings()) << "Venetian blind has reached target angle, stopping timer"; - setBlindState(BlindStateStopped, thing); - } - } - }); - } else if (thing->thingClassId() == smartMeterThingClassId) { - - QTimer* smartMeterTimer = new QTimer(this); - int timeframe = thing->setting(smartMeterSettingsImpulseTimeframeParamTypeId).toInt(); - smartMeterTimer->setInterval(timeframe * 1000); - m_smartMeterTimer.insert(thing, smartMeterTimer); - smartMeterTimer->start(); - connect(thing, &Thing::settingChanged, smartMeterTimer, [smartMeterTimer] (const ParamTypeId ¶mTypeId, const QVariant &value) { - if (paramTypeId == smartMeterSettingsImpulseTimeframeParamTypeId) { - smartMeterTimer->setInterval(value.toInt() * 1000); - } - }); - - connect(smartMeterTimer, &QTimer::timeout, thing, [this, smartMeterTimer, thing] { - double impulsePerKwh = thing->setting(smartMeterSettingsImpulsePerKwhParamTypeId).toDouble(); - int interval = smartMeterTimer->interval()/1000; - double power = (m_pulsesPerTimeframe.value(thing)/impulsePerKwh)/(interval/3600.00); // Power = Energy/Time; Energy = Impulses/ImpPerkWh - thing->setStateValue(smartMeterCurrentPowerStateTypeId, power*1000); - m_pulsesPerTimeframe.insert(thing, 0); - }); - } else if (thing->thingClassId() == extendedStatefulGaragedoorThingClassId) { - uint openingDuration = thing->setting(extendedStatefulGaragedoorSettingsOpeningDurationParamTypeId).toUInt(); - QTimer* timer = new QTimer(this); - timer->setInterval(openingDuration/100.00); // closing timer / 100 to update on every percent - m_statefulGaragePercentageTimer.insert(thing, timer); - connect(thing, &Thing::settingChanged, thing, [timer] (const ParamTypeId ¶mTypeId, const QVariant &value) { - if (paramTypeId == extendedStatefulGaragedoorSettingsOpeningDurationParamTypeId) { - timer->setInterval(value.toUInt()/100.00); - } - }); - connect(timer, &QTimer::timeout, this, [thing, timer, this] { - uint currentPercentage = thing->stateValue(extendedStatefulGaragedoorPercentageStateTypeId).toUInt(); - uint targetPercentage = m_statefulGarageTargetPercentage.value(thing); - - if (currentPercentage < targetPercentage) { - currentPercentage++; - thing->setStateValue(extendedStatefulGaragedoorPercentageStateTypeId, currentPercentage); - thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, "closing"); - thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, true); - thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, false); - thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, true); - - } else if (currentPercentage > targetPercentage) { - currentPercentage--; - thing->setStateValue(extendedStatefulGaragedoorPercentageStateTypeId, currentPercentage); - thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, "opening"); - thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, true); - thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, true); - thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, false); - - } - - if (currentPercentage == targetPercentage){ - QString state = currentPercentage == 100 ? "open" : currentPercentage == 0 ? "closed" : "intermediate"; - thing->setStateValue(extendedStatefulGaragedoorStateStateTypeId, state); - thing->setStateValue(extendedStatefulGaragedoorMovingStateTypeId, false); - thing->setStateValue(extendedStatefulGaragedoorOpeningOutputStateTypeId, false); - thing->setStateValue(extendedStatefulGaragedoorClosingOutputStateTypeId, false); - qCDebug(dcGenericThings()) << "Stopping garage timer"; - timer->stop(); - } - }); - } else if (thing->thingClassId() == thermostatThingClassId) { - thermostatCheckPowerOutputState(thing); // check the initial values - connect(thing, &Thing::settingChanged, thing, [this, thing] (const ParamTypeId ¶mTypeId, const QVariant &value) { - Q_UNUSED(value) - if (paramTypeId == thermostatSettingsTemperatureDifferenceParamTypeId) { - thermostatCheckPowerOutputState(thing); - } - }); - } else if (thing->thingClassId() == waterLevelSensorThingClassId) { - connect(thing, &Thing::settingChanged, thing, [ thing](const ParamTypeId &settingTypeId, const QVariant &value){ - if (settingTypeId == waterLevelSensorSettingsCapacityParamTypeId) { - double capacity = value.toDouble(); - double input = thing->stateValue(waterLevelSensorInputStateTypeId).toDouble(); - double minInputValue = thing->setting(waterLevelSensorSettingsMinInputValueParamTypeId).toDouble(); - double maxInputValue = thing->setting(waterLevelSensorSettingsMaxInputValueParamTypeId).toDouble(); - double normalizedInput = (input - minInputValue) / (maxInputValue - minInputValue); - double waterLevel = normalizedInput * capacity; - thing->setStateMaxValue(waterLevelSensorWaterLevelStateTypeId, capacity); - thing->setStateValue(waterLevelSensorWaterLevelStateTypeId, waterLevel); - } - }); - } else if (thing->thingClassId() == sgReadyThingClassId) { - bool relay1 = thing->stateValue(sgReadyRelay1StateTypeId).toBool(); - bool relay2 = thing->stateValue(sgReadyRelay2StateTypeId).toBool(); - QString operatingModeString = sgReadyOperatingMode(relay1, relay2); - thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingModeString); - thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingModeString)); - } else if (thing->thingClassId() == batteryThingClassId) { - connect(thing, &Thing::settingChanged, [thing](const ParamTypeId &settingTypeId, const QVariant &value){ - if (settingTypeId == batterySettingsCriticalLevelParamTypeId) { - int currentBatteryLevel = thing->stateValue(batteryBatteryLevelStateTypeId).toInt(); - thing->setStateValue(batteryBatteryCriticalStateTypeId, currentBatteryLevel <= value.toInt()); - } - }); - } else if (thing->thingClassId() == carThingClassId) { - // Set the min charging current state if the settings value changed - connect(thing, &Thing::settingChanged, this, [thing](const ParamTypeId ¶mTypeId, const QVariant &value){ - if (paramTypeId == carSettingsMinChargingCurrentParamTypeId) { - qCDebug(dcGenericThings()) << "Car minimum charging current settings changed" << value.toUInt() << "A"; - thing->setStateValue(carMinChargingCurrentStateTypeId, value); - } - }); - - // Finish the setup - info->finish(Thing::ThingErrorNoError); - - // Set the inital state value - thing->setStateValue(carMinChargingCurrentStateTypeId, thing->setting(carSettingsMinChargingCurrentParamTypeId)); - return; - } - - // Fall trough, if not already finished and returned... - info->finish(Thing::ThingErrorNoError); -} - -void IntegrationPluginGenericThings::executeAction(ThingActionInfo *info) -{ - Thing *thing = info->thing(); - Action action = info->action(); - - if (thing->thingClassId() == genericThingClassId) { - if (action.actionTypeId() == genericAnalogInputActionTypeId) { - thing->setStateValue(genericAnalogInputStateTypeId, action.paramValue(genericAnalogInputActionAnalogInputParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == genericAnalogOutputActionTypeId) { - thing->setStateValue(genericAnalogOutputStateTypeId, action.paramValue(genericAnalogOutputActionAnalogOutputParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == genericDigitalInputActionTypeId) { - thing->setStateValue(genericDigitalInputStateTypeId, action.paramValue(genericDigitalInputActionDigitalInputParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == genericDigitalOutputActionTypeId) { - thing->setStateValue(genericDigitalOutputStateTypeId, action.paramValue(genericDigitalOutputActionDigitalOutputParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == genericStringStateActionTypeId) { - thing->setStateValue(genericStringStateStateTypeId, action.paramValue(genericStringStateActionStringStateParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - } - - if (thing->thingClassId() == awningThingClassId) { - if (action.actionTypeId() == awningOpenActionTypeId) { - thing->setStateValue(awningStatusStateTypeId, "Opening"); - thing->setStateValue(awningClosingOutputStateTypeId, false); - thing->setStateValue(awningOpeningOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == awningStopActionTypeId) { - thing->setStateValue(awningStatusStateTypeId, "Stopped"); - thing->setStateValue(awningOpeningOutputStateTypeId, false); - thing->setStateValue(awningClosingOutputStateTypeId, false); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == awningCloseActionTypeId) { - thing->setStateValue(awningStatusStateTypeId, "Closing"); - thing->setStateValue(awningOpeningOutputStateTypeId, false); - thing->setStateValue(awningClosingOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == awningOpeningOutputActionTypeId) { - bool on = action.param(awningOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); - thing->setStateValue(awningOpeningOutputStateTypeId, on); - if (on) { - thing->setStateValue(awningStatusStateTypeId, "Opening"); - thing->setStateValue(awningClosingOutputStateTypeId, false); - } else { - thing->setStateValue(awningStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == awningClosingOutputActionTypeId) { - bool on = action.param(awningClosingOutputActionClosingOutputParamTypeId).value().toBool(); - thing->setStateValue(awningClosingOutputStateTypeId, on); - if (on) { - thing->setStateValue(awningStatusStateTypeId, "Closing"); - thing->setStateValue(awningOpeningOutputStateTypeId, false); - } else { - thing->setStateValue(awningStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == blindThingClassId ) { - if (action.actionTypeId() == blindOpenActionTypeId) { - thing->setStateValue(blindStatusStateTypeId, "Opening"); - thing->setStateValue(blindClosingOutputStateTypeId, false); - thing->setStateValue(blindOpeningOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == blindStopActionTypeId) { - thing->setStateValue(blindStatusStateTypeId, "Stopped"); - thing->setStateValue(blindOpeningOutputStateTypeId, false); - thing->setStateValue(blindClosingOutputStateTypeId, false); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == blindCloseActionTypeId) { - thing->setStateValue(blindStatusStateTypeId, "Closing"); - thing->setStateValue(blindOpeningOutputStateTypeId, false); - thing->setStateValue(blindClosingOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == blindOpeningOutputActionTypeId) { - bool on = action.param(blindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); - thing->setStateValue(blindOpeningOutputStateTypeId, on); - if (on) { - thing->setStateValue(blindStatusStateTypeId, "Opening"); - thing->setStateValue(blindClosingOutputStateTypeId, false); - } else { - thing->setStateValue(blindStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == blindClosingOutputActionTypeId) { - bool on = action.param(blindClosingOutputActionClosingOutputParamTypeId).value().toBool(); - thing->setStateValue(blindClosingOutputStateTypeId, on); - if (on) { - thing->setStateValue(blindStatusStateTypeId, "Closing"); - thing->setStateValue(blindOpeningOutputStateTypeId, false); - } else { - thing->setStateValue(blindStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == extendedBlindThingClassId) { - - if (action.actionTypeId() == extendedBlindOpenActionTypeId) { - setBlindState(BlindStateOpening, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == extendedBlindStopActionTypeId) { - setBlindState(BlindStateStopped, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == extendedBlindCloseActionTypeId) { - setBlindState(BlindStateClosing, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == extendedBlindOpeningOutputActionTypeId) { - bool on = action.param(extendedBlindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); - thing->setStateValue(extendedBlindOpeningOutputStateTypeId, on); - if (on) { - setBlindState(BlindStateOpening, thing); - } else { - setBlindState(BlindStateStopped, thing); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == extendedBlindClosingOutputActionTypeId) { - bool on = action.param(extendedBlindClosingOutputActionClosingOutputParamTypeId).value().toBool(); - thing->setStateValue(extendedBlindClosingOutputStateTypeId, on); - if (on) { - setBlindState(BlindStateClosing, thing); - } else { - setBlindState(BlindStateStopped, thing); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == extendedBlindPercentageActionTypeId) { - moveBlindToPercentage(action, thing); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == venetianBlindThingClassId) { - if (action.actionTypeId() == venetianBlindOpenActionTypeId) { - setBlindState(BlindStateOpening, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindStopActionTypeId) { - setBlindState(BlindStateStopped, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindCloseActionTypeId) { - setBlindState(BlindStateClosing, thing); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindOpeningOutputActionTypeId) { - bool on = action.param(venetianBlindOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); - thing->setStateValue(venetianBlindOpeningOutputStateTypeId, on); - if (on) { - setBlindState(BlindStateOpening, thing); - } else { - setBlindState(BlindStateStopped, thing); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindClosingOutputActionTypeId) { - bool on = action.param(venetianBlindClosingOutputActionClosingOutputParamTypeId).value().toBool(); - thing->setStateValue(venetianBlindClosingOutputStateTypeId, on); - if (on) { - setBlindState(BlindStateClosing, thing); - } else { - setBlindState(BlindStateStopped, thing); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindPercentageActionTypeId) { - moveBlindToPercentage(action, thing); - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == venetianBlindAngleActionTypeId) { - moveBlindToAngle(action, thing); - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == shutterThingClassId) { - if (action.actionTypeId() == shutterOpenActionTypeId) { - thing->setStateValue(shutterStatusStateTypeId, "Opening"); - thing->setStateValue(shutterClosingOutputStateTypeId, false); - thing->setStateValue(shutterOpeningOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == shutterStopActionTypeId) { - thing->setStateValue(shutterStatusStateTypeId, "Stopped"); - thing->setStateValue(shutterOpeningOutputStateTypeId, false); - thing->setStateValue(shutterClosingOutputStateTypeId, false); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == shutterCloseActionTypeId) { - thing->setStateValue(shutterStatusStateTypeId, "Closing"); - thing->setStateValue(shutterOpeningOutputStateTypeId, false); - thing->setStateValue(shutterClosingOutputStateTypeId, true); - return info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == shutterOpeningOutputActionTypeId) { - bool on = action.param(shutterOpeningOutputActionOpeningOutputParamTypeId).value().toBool(); - thing->setStateValue(shutterOpeningOutputStateTypeId, on); - if (on) { - thing->setStateValue(shutterStatusStateTypeId, "Opening"); - thing->setStateValue(shutterClosingOutputStateTypeId, false); - } else { - thing->setStateValue(shutterStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == shutterClosingOutputActionTypeId) { - bool on = action.param(shutterClosingOutputActionClosingOutputParamTypeId).value().toBool(); - thing->setStateValue(shutterClosingOutputStateTypeId, on); - if (on) { - thing->setStateValue(shutterStatusStateTypeId, "Closing"); - thing->setStateValue(shutterOpeningOutputStateTypeId, false); - } else { - thing->setStateValue(shutterStatusStateTypeId, "Stopped"); - } - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == socketThingClassId) { - if (action.actionTypeId() == socketPowerActionTypeId) { - thing->setStateValue(socketPowerStateTypeId, action.param(socketPowerActionPowerParamTypeId).value()); - return info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == lightThingClassId) { - if (action.actionTypeId() == lightPowerActionTypeId) { - thing->setStateValue(lightPowerStateTypeId, action.param(lightPowerActionPowerParamTypeId).value()); - return info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == heatingThingClassId) { - if (action.actionTypeId() == heatingPowerActionTypeId) { - thing->setStateValue(heatingPowerStateTypeId, action.param(heatingPowerActionPowerParamTypeId).value()); - return info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == powerSwitchThingClassId) { - if (action.actionTypeId() == powerSwitchPowerActionTypeId) { - thing->setStateValue(powerSwitchPowerStateTypeId, action.param(powerSwitchPowerActionPowerParamTypeId).value()); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == irrigationThingClassId) { - if (action.actionTypeId() == irrigationPowerActionTypeId) { - thing->setStateValue(irrigationPowerStateTypeId, action.param(irrigationPowerActionPowerParamTypeId).value()); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == ventilationThingClassId) { - if (action.actionTypeId() == ventilationPowerActionTypeId) { - thing->setStateValue(ventilationPowerStateTypeId, action.param(ventilationPowerActionPowerParamTypeId).value()); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == ventilationFlowThingClassId) { - if (action.actionTypeId() == ventilationFlowPowerActionTypeId) { - thing->setStateValue(ventilationFlowPowerStateTypeId, action.param(ventilationFlowPowerActionPowerParamTypeId).value()); - info->finish(Thing::ThingErrorNoError); - return; - } else if (action.actionTypeId() == ventilationFlowFlowRateActionTypeId) { - thing->setStateValue(ventilationFlowFlowRateStateTypeId, action.param(ventilationFlowFlowRateActionFlowRateParamTypeId).value()); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == temperatureSensorThingClassId) { - if (action.actionTypeId() == temperatureSensorInputActionTypeId) { - double value = info->action().param(temperatureSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(temperatureSensorInputStateTypeId, value); - double min = info->thing()->setting(temperatureSensorSettingsMinTempParamTypeId).toDouble(); - double max = info->thing()->setting(temperatureSensorSettingsMaxTempParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 1, min, max); - double roundingFactor = qPow(10, info->thing()->setting(temperatureSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(temperatureSensorTemperatureStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == humiditySensorThingClassId) { - if (action.actionTypeId() == humiditySensorInputActionTypeId) { - double value = info->action().param(humiditySensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(humiditySensorInputStateTypeId, value); - double min = info->thing()->setting(humiditySensorSettingsMinHumidityParamTypeId).toDouble(); - double max = info->thing()->setting(humiditySensorSettingsMaxHumidityParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(humiditySensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(humiditySensorHumidityStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == moistureSensorThingClassId) { - if (action.actionTypeId() == moistureSensorInputActionTypeId) { - double value = info->action().param(moistureSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(moistureSensorInputStateTypeId, value); - double min = info->thing()->setting(moistureSensorSettingsMinMoistureParamTypeId).toDouble(); - double max = info->thing()->setting(moistureSensorSettingsMaxMoistureParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(moistureSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(moistureSensorMoistureStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == phSensorThingClassId) { - if (action.actionTypeId() == phSensorInputActionTypeId) { - double value = info->action().paramValue(phSensorInputActionInputParamTypeId).toDouble(); - thing->setStateValue(phSensorInputStateTypeId, value); - double min = info->thing()->setting(phSensorSettingsMinInputParamTypeId).toDouble(); - double max = info->thing()->setting(phSensorSettingsMaxInputParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, min, max, 0, 14); - double roundingFactor = qPow(10, info->thing()->setting(phSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(phSensorPhStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == orpSensorThingClassId) { - if (action.actionTypeId() == orpSensorInputActionTypeId) { - double value = info->action().paramValue(orpSensorInputActionInputParamTypeId).toDouble(); - thing->setStateValue(orpSensorInputStateTypeId, value); - double min = info->thing()->setting(orpSensorSettingsMinORPParamTypeId).toDouble(); - double max = info->thing()->setting(orpSensorSettingsMaxORPParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(orpSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(orpSensorOrpStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == o2SensorThingClassId) { - if (action.actionTypeId() == o2SensorInputActionTypeId) { - double value = info->action().paramValue(o2SensorInputActionInputParamTypeId).toDouble(); - thing->setStateValue(o2SensorInputStateTypeId, value); - double min = info->thing()->setting(o2SensorSettingsMinInputParamTypeId).toDouble(); - double max = info->thing()->setting(o2SensorSettingsMaxInputParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, min, max, 0, 100); - double roundingFactor = qPow(10, info->thing()->setting(o2SensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(o2SensorO2saturationStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == pressureSensorThingClassId) { - if (action.actionTypeId() == pressureSensorInputActionTypeId) { - double value = info->action().param(pressureSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(pressureSensorInputStateTypeId, value); - double min = info->thing()->setting(pressureSensorSettingsMinPressureParamTypeId).toDouble(); - double max = info->thing()->setting(pressureSensorSettingsMaxPressureParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(pressureSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(pressureSensorPressureStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == coSensorThingClassId) { - if (action.actionTypeId() == coSensorInputActionTypeId) { - double value = info->action().param(coSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(coSensorInputStateTypeId, value); - double min = info->thing()->setting(coSensorSettingsMinCOParamTypeId).toDouble(); - double max = info->thing()->setting(coSensorSettingsMaxCOParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(coSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(coSensorCoStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == co2SensorThingClassId) { - if (action.actionTypeId() == co2SensorInputActionTypeId) { - double value = info->action().param(co2SensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(co2SensorInputStateTypeId, value); - double min = info->thing()->setting(co2SensorSettingsMinCO2ParamTypeId).toDouble(); - double max = info->thing()->setting(co2SensorSettingsMaxCO2ParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(co2SensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(co2SensorCo2StateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == gasSensorThingClassId) { - if (action.actionTypeId() == gasSensorInputActionTypeId) { - double value = info->action().param(gasSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(gasSensorInputStateTypeId, value); - double min = info->thing()->setting(gasSensorSettingsMinValueParamTypeId).toDouble(); - double max = info->thing()->setting(gasSensorSettingsMaxValueParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(gasSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(gasSensorGasStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == lightSensorThingClassId) { - if (action.actionTypeId() == lightSensorInputActionTypeId) { - double value = info->action().param(lightSensorInputActionInputParamTypeId).value().toDouble(); - thing->setStateValue(lightSensorInputStateTypeId, value); - double min = info->thing()->setting(lightSensorSettingsMinLuxParamTypeId).toDouble(); - double max = info->thing()->setting(lightSensorSettingsMaxLuxParamTypeId).toDouble(); - double newValue = mapDoubleValue(value, 0, 100, min, max); - double roundingFactor = qPow(10, info->thing()->setting(lightSensorSettingsAccuracyParamTypeId).toInt()); - newValue = qRound(newValue * roundingFactor) / roundingFactor; - thing->setStateValue(lightSensorLightIntensityStateTypeId, newValue); - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == smartMeterThingClassId) { - if (action.actionTypeId() == smartMeterImpulseInputActionTypeId) { - bool value = info->action().param(smartMeterImpulseInputActionImpulseInputParamTypeId).value().toBool(); - thing->setStateValue(smartMeterImpulseInputStateTypeId, value); - int impulsePerKwh = info->thing()->setting(smartMeterSettingsImpulsePerKwhParamTypeId).toInt(); - if (value) { - double currentEnergy = thing->stateValue(smartMeterTotalEnergyConsumedStateTypeId).toDouble(); - thing->setStateValue(smartMeterTotalEnergyConsumedStateTypeId ,currentEnergy + (1.00/impulsePerKwh)); - m_pulsesPerTimeframe[thing]++; - } - info->finish(Thing::ThingErrorNoError); - return; - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == impulseGaragedooorThingClassId) { - if (action.actionTypeId() == impulseGaragedooorTriggerImpulseActionTypeId) { - uint duration = thing->setting(impulseGaragedooorSettingsImpulseDurationParamTypeId).toUInt(); - thing->setStateValue(impulseGaragedooorImpulseStateTypeId, true); - QTimer::singleShot(duration, thing, [thing](){ - thing->setStateValue(impulseGaragedooorImpulseStateTypeId, false); - }); - info->finish(Thing::ThingErrorNoError); - return; - } - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } else if (thing->thingClassId() == simpleGaragedoorThingClassId) { - if (action.actionTypeId() == simpleGaragedoorOpenActionTypeId) { - thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, false); - thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, true); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == simpleGaragedoorCloseActionTypeId) { - thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, false); - thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, true); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == simpleGaragedoorStopActionTypeId) { - thing->setStateValue(simpleGaragedoorClosingOutputStateTypeId, false); - thing->setStateValue(simpleGaragedoorOpeningOutputStateTypeId, false); - info->finish(Thing::ThingErrorNoError); - return; - } - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } else if (thing->thingClassId() == extendedStatefulGaragedoorThingClassId) { - if (action.actionTypeId() == extendedStatefulGaragedoorOpenActionTypeId) { - m_statefulGarageTargetPercentage[thing] = 0; - m_statefulGaragePercentageTimer[thing]->start(); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == extendedStatefulGaragedoorCloseActionTypeId) { - m_statefulGarageTargetPercentage[thing] = 100; - m_statefulGaragePercentageTimer[thing]->start(); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == extendedStatefulGaragedoorStopActionTypeId) { - m_statefulGarageTargetPercentage[thing] = thing->stateValue(extendedStatefulGaragedoorPercentageStateTypeId).toUInt(); - info->finish(Thing::ThingErrorNoError); - return; - } - - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - - } else if (thing->thingClassId() == thermostatThingClassId) { - if (action.actionTypeId() == thermostatTemperatureActionTypeId) { - thing->setStateValue(thermostatTemperatureStateTypeId, action.param(thermostatTemperatureActionTemperatureParamTypeId).value()); - } else if (action.actionTypeId() == thermostatTargetTemperatureActionTypeId) { - double minSetting = thing->setting(thermostatSettingsMinTargetTemperatureParamTypeId).toDouble(); - double maxSetting = thing->setting(thermostatSettingsMaxTargetTemperatureParamTypeId).toDouble(); - double newTemp = action.param(thermostatTargetTemperatureActionTargetTemperatureParamTypeId).value().toDouble(); - newTemp = qMax(newTemp, minSetting); - newTemp = qMin(newTemp, maxSetting); - thing->setStateValue(thermostatTargetTemperatureStateTypeId, newTemp); - } else if (action.actionTypeId() == thermostatHeatingOnActionTypeId) { - thing->setStateValue(thermostatHeatingOnStateTypeId, action.param(thermostatHeatingOnActionHeatingOnParamTypeId).value()); - } else if (action.actionTypeId() == thermostatCoolingOnActionTypeId) { - thing->setStateValue(thermostatCoolingOnStateTypeId, action.param(thermostatCoolingOnActionCoolingOnParamTypeId).value()); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - thermostatCheckPowerOutputState(thing); - info->finish(Thing::ThingErrorNoError); - return; - - } else if (thing->thingClassId() == heatingThingClassId) { - if (action.actionTypeId() == heatingPowerActionTypeId) { - thing->setStateValue(heatingPowerStateTypeId, action.paramValue(heatingPowerActionPowerParamTypeId).toBool()); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - info->finish(Thing::ThingErrorNoError); - return; - - } else if (thing->thingClassId() == coolingThingClassId) { - if (action.actionTypeId() == coolingPowerActionTypeId) { - thing->setStateValue(coolingPowerStateTypeId, action.paramValue(coolingPowerActionPowerParamTypeId).toBool()); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - info->finish(Thing::ThingErrorNoError); - return; - - } else if (thing->thingClassId() == sgReadyThingClassId) { - if (action.actionTypeId() == sgReadyRelay1ActionTypeId) { - thing->setStateValue(sgReadyRelay1StateTypeId, action.param(sgReadyRelay1ActionRelay1ParamTypeId).value()); - QString operatingMode = sgReadyOperatingMode(thing->stateValue(sgReadyRelay1StateTypeId).toBool(), thing->stateValue(sgReadyRelay2StateTypeId).toBool()); - thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); - thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == sgReadyRelay2ActionTypeId) { - thing->setStateValue(sgReadyRelay2StateTypeId, action.param(sgReadyRelay2ActionRelay2ParamTypeId).value()); - QString operatingMode = sgReadyOperatingMode(thing->stateValue(sgReadyRelay1StateTypeId).toBool(), thing->stateValue(sgReadyRelay2StateTypeId).toBool()); - thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); - thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); - info->finish(Thing::ThingErrorNoError); - return; - } - if (action.actionTypeId() == sgReadySgReadyModeActionTypeId) { - QString operatingMode = action.paramValue(sgReadySgReadyModeActionSgReadyModeParamTypeId).toString(); - thing->setStateValue(sgReadySgReadyModeStateTypeId, operatingMode); - thing->setStateValue(sgReadyOperatingModeDescriptionStateTypeId, sgReadyOperatingModeDescription(operatingMode)); - if (operatingMode == "Off") { - thing->setStateValue(sgReadyRelay1StateTypeId, true); - thing->setStateValue(sgReadyRelay2StateTypeId, false); - } else if (operatingMode == "Low") { - thing->setStateValue(sgReadyRelay1StateTypeId, false); - thing->setStateValue(sgReadyRelay2StateTypeId, false); - } else if (operatingMode == "Standard") { - thing->setStateValue(sgReadyRelay1StateTypeId, false); - thing->setStateValue(sgReadyRelay2StateTypeId, true); - } else if (operatingMode == "High") { - thing->setStateValue(sgReadyRelay1StateTypeId, true); - thing->setStateValue(sgReadyRelay2StateTypeId, true); - } - info->finish(Thing::ThingErrorNoError); - return; - } - Q_ASSERT_X(false, "executeAction", QString("Unhandled actionTypeId: %1").arg(action.actionTypeId().toString()).toUtf8()); - } else if (thing->thingClassId() == doorSensorThingClassId) { - if (action.actionTypeId() == doorSensorClosedActionTypeId) { - bool closed = action.paramValue(doorSensorClosedActionClosedParamTypeId).toBool(); - qCDebug(dcGenericThings()) << "Door sensor is now" << (closed ? "open" : "closed"); - thing->setStateValue(doorSensorClosedStateTypeId, closed); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == waterSensorThingClassId) { - if (action.actionTypeId() == waterSensorWaterDetectedActionTypeId) { - bool waterDetected = action.paramValue(waterSensorWaterDetectedActionWaterDetectedParamTypeId).toBool(); - qCDebug(dcGenericThings()).nospace() << "Water sensor is " << (waterDetected ? "" : "not") << "detecting water"; - thing->setStateValue(waterSensorWaterDetectedStateTypeId, waterDetected); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == waterLevelSensorThingClassId) { - if (action.actionTypeId() == waterLevelSensorInputActionTypeId) { - double capacity = thing->setting(waterLevelSensorSettingsCapacityParamTypeId).toDouble(); - double input = action.paramValue(waterLevelSensorInputActionInputParamTypeId).toDouble(); - double minInputValue = thing->setting(waterLevelSensorSettingsMinInputValueParamTypeId).toDouble(); - double maxInputValue = thing->setting(waterLevelSensorSettingsMaxInputValueParamTypeId).toDouble(); - double normalizedInput = (input - minInputValue) / (maxInputValue - minInputValue); - double waterLevel = normalizedInput * capacity; - thing->setStateValue(waterLevelSensorWaterLevelStateTypeId, waterLevel); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == presenceSensorThingClassId) { - if (action.actionTypeId() == presenceSensorIsPresentActionTypeId) { - bool isPresent = action.paramValue(presenceSensorIsPresentActionIsPresentParamTypeId).toBool(); - qCDebug(dcGenericThings()) << "Presence sensor is now" << (isPresent ? "present" : "not present"); - thing->setStateValue(presenceSensorIsPresentStateTypeId, isPresent); - if (isPresent) { - thing->setStateValue(presenceSensorLastSeenTimeStateTypeId, QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000); - } - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == batteryThingClassId) { - if (action.actionTypeId() == batteryBatteryLevelControlActionTypeId) { - int value = action.paramValue(batteryBatteryLevelControlActionBatteryLevelControlParamTypeId).toInt(); - thing->setStateValue(batteryBatteryLevelStateTypeId, value); - thing->setStateValue(batteryBatteryLevelControlStateTypeId, value); - int criticalValue = thing->setting(batterySettingsCriticalLevelParamTypeId).toInt(); - thing->setStateValue(batteryBatteryCriticalStateTypeId, value <= criticalValue); - info->finish(Thing::ThingErrorNoError); - return; - } else if (action.actionTypeId() == batteryChargingActionTypeId) { - thing->setStateValue(batteryChargingStateTypeId, action.paramValue(batteryChargingActionChargingParamTypeId)); - info->finish(Thing::ThingErrorNoError); - return; - } - } else if (thing->thingClassId() == carThingClassId) { - if (action.actionTypeId() == carCapacityActionTypeId) { - thing->setStateValue(carCapacityStateTypeId, action.paramValue(carCapacityActionCapacityParamTypeId)); - info->finish(Thing::ThingErrorNoError); - } else if (action.actionTypeId() == carBatteryLevelActionTypeId) { - thing->setStateValue(carBatteryLevelStateTypeId, action.paramValue(carBatteryLevelActionBatteryLevelParamTypeId)); - thing->setStateValue(carBatteryCriticalStateTypeId, action.paramValue(carBatteryLevelActionBatteryLevelParamTypeId).toInt() < 10); - info->finish(Thing::ThingErrorNoError); - } - } else if (thing->thingClassId() == simpleHeatPumpThingClassId) { - if (action.actionTypeId() == simpleHeatPumpPowerActionTypeId) { - thing->setStateValue(simpleHeatPumpPowerStateTypeId, action.paramValue(simpleHeatPumpPowerActionPowerParamTypeId).toBool()); - info->finish(Thing::ThingErrorNoError); - } - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - } -} - -void IntegrationPluginGenericThings::thingRemoved(Thing *thing) -{ - if (thing->thingClassId() == extendedBlindThingClassId) { - m_extendedBlindPercentageTimer.take(thing)->deleteLater(); - m_extendedBlindTargetPercentage.remove(thing); - } else if (thing->thingClassId() == venetianBlindThingClassId) { - m_extendedBlindPercentageTimer.take(thing)->deleteLater(); - m_extendedBlindTargetPercentage.remove(thing); - m_venetianBlindAngleTimer.take(thing)->deleteLater(); - m_venetianBlindTargetAngle.remove(thing); - } else if (thing->thingClassId() == smartMeterThingClassId) { - m_pulsesPerTimeframe.remove(thing); - } else if (thing->thingClassId() == smartMeterThingClassId) { - m_smartMeterTimer.take(thing)->deleteLater(); - m_pulsesPerTimeframe.remove(thing); - } -} - -double IntegrationPluginGenericThings::mapDoubleValue(double value, double fromMin, double fromMax, double toMin, double toMax) -{ - double percent = (value - fromMin) / (fromMax - fromMin); - double toValue = toMin + (toMax - toMin) * percent; - return toValue; -} - -void IntegrationPluginGenericThings::setBlindState(IntegrationPluginGenericThings::BlindState state, Thing *thing) -{ - //If an ongoing "to percentage" actions is beeing executed, it is now overruled by another action - m_extendedBlindTargetPercentage.remove(thing); - - if (thing->thingClassId() == extendedBlindThingClassId) { - switch (state) { - case BlindStateOpening: - thing->setStateValue(extendedBlindStatusStateTypeId, "Opening"); - thing->setStateValue(extendedBlindClosingOutputStateTypeId, false); - thing->setStateValue(extendedBlindOpeningOutputStateTypeId, true); - thing->setStateValue(extendedBlindMovingStateTypeId, true); - m_extendedBlindPercentageTimer.value(thing)->start(); - break; - case BlindStateClosing: - thing->setStateValue(extendedBlindStatusStateTypeId, "Closing"); - thing->setStateValue(extendedBlindClosingOutputStateTypeId, true); - thing->setStateValue(extendedBlindOpeningOutputStateTypeId, false); - thing->setStateValue(extendedBlindMovingStateTypeId, true); - m_extendedBlindPercentageTimer.value(thing)->start(); - break; - case BlindStateStopped: - thing->setStateValue(extendedBlindStatusStateTypeId, "Stopped"); - thing->setStateValue(extendedBlindClosingOutputStateTypeId, false); - thing->setStateValue(extendedBlindOpeningOutputStateTypeId, false); - thing->setStateValue(extendedBlindMovingStateTypeId, false); - m_extendedBlindPercentageTimer.value(thing)->stop(); - break; - } - } else if (thing->thingClassId() == venetianBlindThingClassId) { - m_venetianBlindTargetAngle.remove(thing); - switch (state) { - case BlindStateOpening: - thing->setStateValue(venetianBlindStatusStateTypeId, "Opening"); - thing->setStateValue(venetianBlindClosingOutputStateTypeId, false); - thing->setStateValue(venetianBlindOpeningOutputStateTypeId, true); - thing->setStateValue(venetianBlindMovingStateTypeId, true); - m_extendedBlindPercentageTimer.value(thing)->start(); - m_venetianBlindAngleTimer.value(thing)->start(); - break; - case BlindStateClosing: - thing->setStateValue(venetianBlindStatusStateTypeId, "Closing"); - thing->setStateValue(venetianBlindClosingOutputStateTypeId, true); - thing->setStateValue(venetianBlindOpeningOutputStateTypeId, false); - thing->setStateValue(venetianBlindMovingStateTypeId, true); - m_extendedBlindPercentageTimer.value(thing)->start(); - m_venetianBlindAngleTimer.value(thing)->start(); - break; - case BlindStateStopped: - thing->setStateValue(venetianBlindStatusStateTypeId, "Stopped"); - thing->setStateValue(venetianBlindClosingOutputStateTypeId, false); - thing->setStateValue(venetianBlindOpeningOutputStateTypeId, false); - thing->setStateValue(venetianBlindMovingStateTypeId, false); - m_extendedBlindPercentageTimer.value(thing)->stop(); - m_venetianBlindAngleTimer.value(thing)->stop(); - break; - } - } -} - -void IntegrationPluginGenericThings::moveBlindToPercentage(Action action, Thing *thing) -{ - if (thing->thingClassId() == extendedBlindThingClassId) { - uint targetPercentage = action.param(extendedBlindPercentageActionPercentageParamTypeId).value().toUInt(); - uint currentPercentage = thing->stateValue(extendedBlindPercentageStateTypeId).toUInt(); - // 100% indicates the device is fully closed - if (targetPercentage == currentPercentage) { - qCDebug(dcGenericThings()) << "Extended blind is already at given percentage" << targetPercentage; - } else if (targetPercentage > currentPercentage) { - setBlindState(BlindStateClosing, thing); - m_extendedBlindTargetPercentage.insert(thing, targetPercentage); - } else if (targetPercentage < currentPercentage) { - setBlindState(BlindStateOpening, thing); - m_extendedBlindTargetPercentage.insert(thing, targetPercentage); - } else { - setBlindState(BlindStateStopped, thing); - } - } else if (thing->thingClassId() == venetianBlindThingClassId) { - uint targetPercentage = action.param(venetianBlindPercentageActionPercentageParamTypeId).value().toUInt(); - uint currentPercentage = thing->stateValue(venetianBlindPercentageStateTypeId).toUInt(); - qCDebug(dcGenericThings()) << "Moving venetian blind to percentage" << targetPercentage << "Current percentage:" << currentPercentage; - // 100% indicates the device is fully closed - if (targetPercentage == currentPercentage) { - qCDebug(dcGenericThings()) << "Extended blind is already at given percentage" << targetPercentage; - } else if (targetPercentage > currentPercentage) { - setBlindState(BlindStateClosing, thing); - m_extendedBlindTargetPercentage.insert(thing, targetPercentage); - } else if (targetPercentage < currentPercentage) { - setBlindState(BlindStateOpening, thing); - m_extendedBlindTargetPercentage.insert(thing, targetPercentage); - } else { - setBlindState(BlindStateStopped, thing); - } - } else { - qCDebug(dcGenericThings()) << "Move to percentage doesn't support this thingClass"; - } -} - -void IntegrationPluginGenericThings::moveBlindToAngle(Action action, Thing *thing) -{ - if (thing->thingClassId() == venetianBlindThingClassId) { - if (action.actionTypeId() == venetianBlindAngleActionTypeId) { - //NOTE moving percentage affects the angle but the angle doesnt affect the percentage - // opening -> -90 - // closing -> +90 - int targetAngle = action.param(venetianBlindAngleActionAngleParamTypeId).value().toInt(); - int currentAngle = thing->stateValue(venetianBlindAngleStateTypeId).toInt(); - if (targetAngle == currentAngle) { - qCDebug(dcGenericThings()) << "Venetian blind is already at given angle" << targetAngle; - } else if (targetAngle > currentAngle) { - setBlindState(BlindStateClosing, thing); - m_venetianBlindTargetAngle.insert(thing, targetAngle); - } else if (targetAngle < currentAngle) { - setBlindState(BlindStateOpening, thing); - m_venetianBlindTargetAngle.insert(thing, targetAngle); - } else { - setBlindState(BlindStateStopped, thing); - } - } - } else { - qCDebug(dcGenericThings()) << "Move to angle doesn't support this thingClass"; - } -} - - -void IntegrationPluginGenericThings::thermostatCheckPowerOutputState(Thing *thing) -{ - double targetTemperature = thing->stateValue(thermostatTargetTemperatureStateTypeId).toDouble(); - double actualTemperature = thing->stateValue(thermostatTemperatureStateTypeId).toDouble(); - double temperatureDifference = thing->setting(thermostatSettingsTemperatureDifferenceParamTypeId).toDouble(); - if (actualTemperature <= (targetTemperature-temperatureDifference)) { - thing->setStateValue(thermostatHeatingOnStateTypeId, true); - } else if (actualTemperature >= targetTemperature) { - thing->setStateValue(thermostatHeatingOnStateTypeId, false); - } - if (actualTemperature >= (targetTemperature+temperatureDifference)) { - thing->setStateValue(thermostatCoolingOnStateTypeId, true); - } else if (actualTemperature <= targetTemperature) { - thing->setStateValue(thermostatCoolingOnStateTypeId, false); - } -} - -QString IntegrationPluginGenericThings::sgReadyOperatingModeDescription(const QString &operatingModeString) -{ - if (operatingModeString == "Off") { - return "Stop heating."; - } else if (operatingModeString == "Low") { - return "Normal mode, with partial heat storage filling."; - } else if (operatingModeString == "Standard") { - return "Increased room and heat storage temperature."; - } else if (operatingModeString == "High") { - return "Start heating."; - } - return QString("Unknown operating mode %1").arg(operatingModeString); -} - -QString IntegrationPluginGenericThings::sgReadyOperatingMode(bool relay1, bool relay2) -{ - if (relay1 && !relay2) { - /* - * Operating state 1 (Relay state: 1: 0): - * This operating state is downward compatible with the often fixed times - * activated EVU lock and includes a maximum of 2 hours of "hard" lock time. - */ - return "Off"; - } else if (!relay1 && !relay2) { - /* - * Operating state 2 (Relay state: 0: 0): - * In this circuit, the heat pump runs in energy-efficient normal mode - * with partial heat storage filling for the maximum two-hour EVU lock. - */ - return "Low"; - } else if (!relay1 && relay2) { - /* - * Operating state 3 (Relay state: 0: 1): - * In this operating state, the heat pump within the controller runs in amplified mode - * Operation for space heating and hot water preparation. It's not one - * definitive start-up command, but a switch-on recommendation according to the current increase. - */ - return "Standard"; - } else { - /* - * Operating state 4 (Relay state 1: 1): - * This is a definitive start-up command, insofar as this is possible within the framework of the rule settings. - * For this operating state, different control models must be set on the controller for different tariff and usage models: - * Variant 1: The heat pump (compressor) is actively switched on. - * Variant 2: The heat pump (compressor and electrical auxiliary heating) is actively switched on, optional: higher temperature in the heat storage - */ - return "High"; - } -} diff --git a/genericthings/integrationplugingenericthings.json b/genericthings/integrationplugingenericthings.json deleted file mode 100644 index 102b2df..0000000 --- a/genericthings/integrationplugingenericthings.json +++ /dev/null @@ -1,1931 +0,0 @@ -{ - "name": "GenericThings", - "displayName": "Generic Things", - "id": "b3188696-2585-4806-bf98-30ab576ce5c8", - "vendors": [ - { - "name": "nymea", - "displayName": "nymea", - "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6", - "thingClasses": [ - { - "id": "f5c02d35-b06e-4950-8238-847d50cabfdf", - "name": "generic", - "displayName": "Generic thing", - "createMethods": ["user"], - "stateTypes": [ - { - "id": "f477e227-0d2d-4d88-a545-7dedf36266d5", - "name": "stringState", - "displayName": "String state", - "displayNameEvent": "String state changed", - "displayNameAction": "Set string state", - "type": "QString", - "defaultValue": "", - "writable": true - }, - { - "id": "3cf5eb01-dae8-49cd-8c5f-b0224be0044f", - "name": "digitalInput", - "displayName": "Digital input", - "displayNameEvent": "Digital input changed", - "displayNameAction": "Set digital input", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - }, - { - "id": "605b4d8e-71a7-441e-900a-e07c305acd93", - "name": "digitalOutput", - "displayName": "Digital output", - "displayNameEvent": "Digital output changed", - "displayNameAction": "Set digital output", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - }, - { - "id": "810fcd3c-7854-4bb1-82f6-1403ba54875e", - "name": "analogInput", - "displayName": "Analog input", - "displayNameEvent": "Analog input changed", - "displayNameAction": "Set analog input", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 1, - "ioType": "analogInput", - "writable": true - }, - { - "id": "de8ec1b1-8026-4fd8-aefb-dedc07616aa4", - "name": "analogOutput", - "displayName": "Analog output", - "displayNameEvent": "Analog output changed", - "displayNameAction": "Set analog output", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 1, - "ioType": "analogOutput", - "writable": true - } - ] - }, - { - "id": "9e69585f-90ba-44e4-ad90-5b4bffbe345a", - "name": "awning", - "displayName": "Generic awning", - "createMethods": ["user"], - "interfaces": ["awning"], - "stateTypes": [ - { - "id": "4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "displayNameAction": "Set opening output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "59bfd575-709f-4e43-9726-de26e6d4ca8b", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "displayNameAction": "Set closing output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "ff6f2565-2a2e-4d34-b10f-d3f73b676399", - "name": "status", - "displayName": "Status", - "displayNameEvent": "Status changed", - "type": "QString", - "possibleValues": [ - "Opening", - "Stopped", - "Closing" - ], - "defaultValue": "Stopped" - } - ], - "actionTypes": [ - { - "id": "979e9c51-5a93-4635-85e3-01874306b229", - "name": "open", - "displayName": "Open" - }, - { - "id": "555cafe4-bd12-42c6-bab1-8cd59af6468e", - "name": "stop", - "displayName": "Stop" - }, - { - "id": "53b5ba77-9a34-4cd6-ad24-fb01fc465f98", - "name": "close", - "displayName": "Close" - } - ] - }, - { - "id": "17ee3657-6ad8-4ae2-8959-3cf66cec8d13", - "name": "blind", - "displayName": "Generic blind", - "createMethods": ["user"], - "interfaces": ["blind"], - "stateTypes": [ - { - "id": "b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "displayNameAction": "Set opening output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "9b673430-572d-4a9c-85d3-dafadbe541cd", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "displayNameAction": "Set closing output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "5fdec1e0-51f6-48b9-b743-ba572504b2c1", - "name": "status", - "displayName": "Status", - "displayNameEvent": "Status changed", - "type": "QString", - "possibleValues": [ - "Opening", - "Stopped", - "Closing" - ], - "defaultValue": "Stopped" - } - ], - "actionTypes": [ - { - "id": "120dc265-dbbb-4f19-9d31-c372c23479c0", - "name": "open", - "displayName": "Open" - }, - { - "id": "1a924c9a-5dcb-4b1c-8fd6-ab101098e007", - "name": "stop", - "displayName": "Stop" - }, - { - "id": "86e9cf21-7487-47c4-b4be-4a940d7235fb", - "name": "close", - "displayName": "Close" - } - ] - }, - { - "id": "40aa9f3c-a23c-4f7f-8786-fcf3554f3e19", - "name": "extendedBlind", - "displayName": "Generic blind with position control", - "createMethods": ["user"], - "interfaces": ["extendedblind"], - "settingsTypes": [ - { - "id": "27a95b8d-7f97-441b-a3be-0646c517cb06", - "name": "closingDuration", - "displayName": "Closing duration [ms]", - "type": "uint", - "minValue": 1000, - "defaultValue": 5000 - } - ], - "stateTypes": [ - { - "id": "e559f077-e904-4bbc-8ec3-344b814d2eab", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "displayNameAction": "Set opening output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "1a4a5839-a30d-4239-a124-63bfdc74a8f6", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "displayNameAction": "Set closing output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "c2354d7e-198a-43ae-aa5f-c6710010c7e1", - "name": "status", - "displayName": "Status", - "displayNameEvent": "Status changed", - "type": "QString", - "possibleValues": [ - "Opening", - "Stopped", - "Closing" - ], - "defaultValue": "Stopped" - }, - { - "id": "941d1e1f-8dd7-4493-812f-6cefefd88c2e", - "name": "moving", - "type": "bool", - "displayName": "Moving", - "displayNameEvent": "Moving changed", - "defaultValue": false - }, - { - "id": "181df603-d45f-4d3d-a358-97aa3e4ac0bd", - "name": "percentage", - "displayName": "Percentage", - "displayNameEvent": "Percentage changed", - "displayNameAction": "Set percentage", - "type": "int", - "minValue": 0, - "maxValue": 100, - "defaultValue": 0, - "unit": "Percentage", - "writable": true - } - ], - "actionTypes": [ - { - "id": "5a7599fa-8351-4ed6-9b98-fa2f3be54304", - "name": "open", - "displayName": "Open" - }, - { - "id": "ab67e4bf-c7b6-489b-9b49-3e0a1c7d33ca", - "name": "stop", - "displayName": "Stop" - }, - { - "id": "97d6351d-7440-47f3-bdba-a31bb15368ac", - "name": "close", - "displayName": "Close" - } - ] - }, - { - "id": "e6b96ced-8d50-45da-91c8-792d364d2795", - "name": "venetianBlind", - "displayName": "Venetian blind", - "createMethods": ["user"], - "interfaces": ["venetianblind"], - "settingsTypes": [ - { - "id": "4c0bf07d-aaab-4f67-af65-00ceaefbaa84", - "name": "closingDuration", - "displayName": "Closing duration [ms]", - "minValue": 1000, - "type": "uint", - "defaultValue": 5000 - }, - { - "id": "6c8340bf-7fd3-43e3-a75b-dfa2f6426e11", - "name": "angleTime", - "displayName": "Angle end to end time [ms]", - "minValue": 1, - "type": "uint", - "defaultValue": 1000 - } - ], - "stateTypes": [ - { - "id": "6041dacf-5303-4dc0-ba3c-7ecaa438f2dd", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "displayNameAction": "Set opening output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "84dd2fa1-85fe-47f3-9e32-e6083432d39c", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "displayNameAction": "Set closing output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "6fb7826e-b6d8-42f8-b712-719496046436", - "name": "status", - "displayName": "Status", - "displayNameEvent": "Status changed", - "type": "QString", - "possibleValues": [ - "Opening", - "Stopped", - "Closing" - ], - "defaultValue": "Stopped" - }, - { - "id": "6234c07e-4200-4f2c-8cbd-bff24c38c243", - "name": "moving", - "type": "bool", - "displayName": "Moving", - "displayNameEvent": "Moving changed", - "defaultValue": false - }, - { - "id": "33dc8019-336d-4d50-8d60-dff8508338ca", - "name": "percentage", - "displayName": "Percentage", - "displayNameEvent": "Percentage changed", - "displayNameAction": "Set percentage", - "type": "int", - "minValue": 0, - "maxValue": 100, - "defaultValue": 0, - "unit": "Percentage", - "writable": true - }, - { - "id": "fcb700c4-5da8-4385-85b0-6616e807974e", - "name": "angle", - "displayName": "Angle", - "displayNameEvent": "Angle changed", - "displayNameAction": "Set angle", - "type": "int", - "unit": "Degree", - "minValue": -90, - "maxValue": 90, - "defaultValue": 0, - "writable": true - } - ], - "actionTypes": [ - { - "id": "3e728e50-3d45-4035-b215-1e604cf3159b", - "name": "open", - "displayName": "Open" - }, - { - "id": "6e3eeb5d-d7ed-4175-9795-e76451e0a00b", - "name": "stop", - "displayName": "Stop" - }, - { - "id": "1c71f050-f6cb-4929-9c9d-7c262f77c143", - "name": "close", - "displayName": "Close" - } - ] - }, - { - "id": "7917c2e7-d7d2-4c47-a38d-41f7dd7693d9", - "name": "shutter", - "displayName": "Generic shutter", - "createMethods": ["user"], - "interfaces": ["shutter"], - "stateTypes": [ - { - "id": "cc547728-b309-4695-b355-49748ef2521c", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "displayNameAction": "Set opening output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "1c35df0e-4c41-455f-893a-0145377952a0", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "displayNameAction": "Set closing output", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "6d6e72dc-4d2b-4ec1-82c2-54405a682711", - "name": "status", - "displayName": "Status", - "displayNameEvent": "Status changed", - "type": "QString", - "possibleValues": [ - "Opening", - "Stopped", - "Closing" - ], - "defaultValue": "Stopped" - } - ], - "actionTypes": [ - { - "id": "9deb662d-2378-4345-a898-8742d41e43c1", - "name": "open", - "displayName": "Open" - }, - { - "id": "db5f3332-1f4e-4f9e-84d2-93c5d7de315c", - "name": "stop", - "displayName": "Stop" - }, - { - "id": "cf5303f1-67c7-4cef-b11c-eb9de6fc8a87", - "name": "close", - "displayName": "Close" - } - ] - }, - { - "id": "d6699a12-f4a6-4c50-951c-f4f1cd0501dc", - "name": "impulseGaragedooor", - "displayName": "Impulse based garage door", - "createMethods": ["user"], - "interfaces": ["impulsegaragedoor"], - "settingsTypes": [ - { - "id": "962b356c-e975-4d33-b114-10f655eaf74c", - "name": "impulseDuration", - "displayName": "Impulse duration", - "type": "uint", - "defaultValue": "200" - } - ], - "actionTypes": [ - { - "id": "ff5461c6-70fc-435e-8424-96fa59ed321e", - "name": "triggerImpulse", - "displayName": "Operate" - } - ], - "stateTypes": [ - { - "id": "5ccaf0aa-01a4-441f-b6ca-18940da096a5", - "name": "impulse", - "displayName": "Impulse", - "displayNameEvent": "Impulse changed", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput" - } - ] - }, - { - "id": "572403b1-bc22-4620-8170-53147a546033", - "name": "simpleGaragedoor", - "displayName": "Simple garage door", - "createMethods": ["user"], - "interfaces": ["simplegaragedoor"], - "actionTypes": [ - { - "id": "3edb25af-ad51-495b-9ac9-ab97669339b7", - "name": "open", - "displayName": "Open" - }, - { - "id": "1111c0ed-69b6-480c-9fd5-15292600d4f4", - "name": "close", - "displayName": "Close" - }, - { - "id": "f346766f-44ee-452b-bb9c-e89ec0f56016", - "name": "stop", - "displayName": "Stop" - } - ], - "stateTypes": [ - { - "id": "fcd421eb-54f2-4195-bdef-ffa69e9dcc57", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput" - }, - { - "id": "44ef060a-e6fc-4f33-84d2-b24ac7d31ff1", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput" - } - ] - }, - { - "id": "7341e689-4495-4422-851a-3e7c790394b8", - "name": "extendedStatefulGaragedoor", - "displayName": "Garage door with position control", - "createMethods": ["user"], - "interfaces": ["extendedstatefulgaragedoor"], - "settingsTypes": [ - { - "id": "04fb7724-a870-4df9-a79e-fab693931238", - "name": "openingDuration", - "displayName": "Opening duration [ms]", - "type": "uint", - "minValue": 1000, - "defaultValue": 5000 - } - ], - "stateTypes": [ - { - "id": "0cc74edb-7116-47cf-953a-409933f26557", - "name": "state", - "displayName": "State", - "displayNameEvent": "State changed", - "type": "QString", - "possibleValues": ["open", "closed", "opening", "closing", "intermediate"], - "defaultValue": "closed" - }, - { - "id": "963bed3d-2ccb-4dd0-b609-c7e9f25d32d6", - "name": "moving", - "displayName": "Moving", - "displayNameEvent": "Moving changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "f9244c14-0bc9-49ce-90a5-437e66245594", - "name": "percentage", - "displayName": "Open position", - "displayNameEvent": "Open position changed", - "displayNameAction": "Set open position", - "type": "int", - "minValue": 0, - "maxValue": 100, - "defaultValue": 100, - "writable": true - }, - { - "id": "ecc799c7-4d74-4d1f-94e5-2d74e77493ae", - "name": "openingOutput", - "displayName": "Opening output", - "displayNameEvent": "Opening output changed", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput" - }, - { - "id": "e1c14bcd-6131-494b-8dd1-46738e9c8f5e", - "name": "closingOutput", - "displayName": "Closing output", - "displayNameEvent": "Closing output changed", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput" - } - ], - "actionTypes": [ - { - "id": "4a3a3b88-47e9-436f-86be-b5955f3fc2f7", - "name": "open", - "displayName": "Open" - }, - { - "id": "2420fcdb-03d3-4edb-aa89-e3b93c7d6d18", - "name": "close", - "displayName": "Close" - }, - { - "id": "109c3eaf-26a0-4121-8be2-1363253178fd", - "name": "stop", - "displayName": "Stop" - } - ] - }, - { - "id": "4e7261af-a27b-4446-8346-914ea59f7547", - "name": "socket", - "displayName": "Generic power socket", - "createMethods": ["user"], - "interfaces": ["powersocket"], - "stateTypes": [ - { - "id": "018038d7-1d02-4b17-8fe3-babca044b087", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Power changed", - "displayNameAction": "Set power", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "c50d3216-f307-4f9f-8190-4391510c385c", - "name": "light", - "displayName": "Generic light", - "createMethods": ["user"], - "interfaces": ["light"], - "stateTypes": [ - { - "id": "8b6e4a67-6522-408b-b676-8d2f09ed2d54", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Power changed", - "displayNameAction": "Set power", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "392854c4-3d14-4cf8-96cd-d933526bd197", - "name": "heating", - "displayName": "Generic heating", - "createMethods": ["user"], - "interfaces": ["heating"], - "stateTypes": [ - { - "id": "409b635e-a754-4b5c-b3f0-d1c5a0fb3f03", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Power changed", - "displayNameAction": "Set power", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "57daa147-dd6f-4673-a757-d8f01a2054c7", - "name": "powerSwitch", - "displayName": "Generic power switch", - "createMethods": ["user"], - "interfaces": ["power"], - "stateTypes": [ - { - "id": "08087af6-6a3b-4e4a-ac6d-56f23ce63edf", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Powered on/off", - "displayNameAction": "Power on/off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "d013b980-20d5-4791-9c4f-b411c39241d7", - "name": "irrigation", - "displayName": "Generic irrigation", - "createMethods": ["user"], - "interfaces": ["irrigation"], - "stateTypes": [ - { - "id": "0212a287-c5ae-4644-8803-adfdd8caeb9a", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Turned on or off", - "displayNameAction": "Turn on or off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "24af8dd3-ddf0-47f0-bf09-70fdfd8dceab", - "name": "ventilation", - "displayName": "Generic ventilation", - "createMethods": ["user"], - "interfaces": ["ventilation"], - "stateTypes": [ - { - "id": "846711b7-ea5a-4c66-a267-001c60406509", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Turned on or off", - "displayNameAction": "Turn on or off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "a7eec5f7-3cc3-4edb-baa7-1f6b6f935bf8", - "name": "ventilationFlow", - "displayName": "Generic ventilation with flow control", - "createMethods": ["user"], - "interfaces": ["ventilation"], - "stateTypes": [ - { - "id": "adf9a8dd-da13-4070-a3bd-9d4be26ebcd1", - "name": "power", - "displayName": "Power", - "displayNameEvent": "Turned on or off", - "displayNameAction": "Turn on or off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - }, - { - "id": "5a273bba-0bef-49fb-870a-7f2df8fc14b6", - "name": "flowRate", - "displayName": "Air flow rate", - "displayNameEvent": "Air flow rate changed", - "displayNameAction": "Set air flow rate", - "type": "int", - "minValue": 0, - "maxValue": 100, - "unit": "Percentage", - "writable": true, - "defaultValue": 0, - "ioType": "analogOutput" - } - ] - }, - { - "id": "cf3d65db-6f68-457b-968c-cfb66cbd5311", - "name": "temperatureSensor", - "displayName": "Generic temperature sensor", - "createMethods": ["user"], - "interfaces": ["temperaturesensor"], - "settingsTypes": [ - { - "id": "c86ae5d3-9335-4b6e-8231-bf3ed6670dff", - "name": "minTemp", - "displayName": "Minimum temperature", - "type": "double", - "defaultValue": -20, - "unit": "DegreeCelsius" - }, - { - "id": "8b5947ab-127f-4995-853b-eeeb628811e3", - "name": "maxTemp", - "displayName": "Maximum temperature", - "type": "double", - "defaultValue": 50, - "unit": "DegreeCelsius" - }, - { - "id": "3b543c3a-1fc0-45b5-8c07-600a6045f82e", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "d0b6c4be-339e-4b0f-a234-0611b7565395", - "name": "temperature", - "displayName": "Temperature", - "displayNameEvent": "Temperature changed", - "type": "double", - "unit": "DegreeCelsius", - "defaultValue": 0 - }, - { - "id": "fed37466-1264-4ac1-84fd-aff3a1f7ff04", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 1, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "d295bc64-773c-42a9-83e2-80db5fa0d1ce", - "name": "humiditySensor", - "displayName": "Generic humidity sensor", - "createMethods": ["user"], - "interfaces": ["humiditysensor"], - "settingsTypes": [ - { - "id": "0218ffa9-3d49-4b25-a59f-c8831f190432", - "name": "minHumidity", - "displayName": "Minimum humidity", - "type": "double", - "defaultValue": 0, - "unit": "Percentage" - }, - { - "id": "10afc387-68d1-47ea-a816-0d1acad47b3c", - "name": "maxHumidity", - "displayName": "Maximum humidity", - "type": "double", - "defaultValue": 100, - "unit": "Percentage" - }, - { - "id": "38064841-6121-4862-a639-08fb0b778511", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "925225d9-2965-444a-9c42-63c2873700fb", - "name": "humidity", - "displayName": "Humidity", - "displayNameEvent": "Humidity changed", - "type": "double", - "unit": "Percentage", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100 - }, - { - "id": "a8223e65-e704-4f84-9bbe-d8fc42597047", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "33e610cf-ff30-481b-9f0b-d6857bcd41a5", - "name": "moistureSensor", - "displayName": "Generic soil moisture sensor", - "createMethods": ["user"], - "interfaces": ["moisturesensor"], - "settingsTypes": [ - { - "id": "32153786-f1ae-4aa4-a84c-b9054102eb92", - "name": "minMoisture", - "displayName": "Minimum moisture", - "type": "double", - "defaultValue": 0, - "unit": "Percentage" - }, - { - "id": "3426817d-065e-4cfc-aa21-bb434de684d6", - "name": "maxMoisture", - "displayName": "Maximum moisture", - "type": "double", - "defaultValue": 100, - "unit": "Percentage" - }, - { - "id": "3c967a68-9951-4c9a-b019-79b913e762b6", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "7a62e1d2-92f2-424c-876c-870478a4b2bd", - "name": "moisture", - "displayName": "Soil moisture", - "displayNameEvent": "Soil moisture changed", - "type": "double", - "unit": "Percentage", - "minValue": 0, - "maxValue": 100, - "defaultValue": 0 - }, - { - "id": "ce64a425-d990-4fc1-966b-be6de445792b", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "e2934fa1-59c3-4de8-82f2-66181136085c", - "name": "phSensor", - "displayName": "PH sensor", - "createMethods": ["user"], - "interfaces": ["phsensor"], - "settingsTypes": [ - { - "id": "a8ff2e16-e06c-4b1e-839a-a06691a12d64", - "name": "minInput", - "displayName": "Minimum input value", - "type": "double", - "defaultValue": 0 - }, - { - "id": "a8889e45-59e5-4cc4-b228-611f8f19f531", - "name": "maxInput", - "displayName": "Maximum input value", - "type": "double", - "defaultValue": 100 - }, - { - "id": "bb41de73-31d0-4b21-8f80-14467120aae4", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "743514b1-8018-4525-b87a-c5f414146ff2", - "name": "ph", - "displayName": "PH", - "displayNameEvent": "PH changed", - "type": "double", - "defaultValue": 7, - "minValue": 0, - "maxValue": 14 - }, - { - "id": "614a039b-9ed9-4b62-9c74-01ba4ac42f16", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "minValue": 0, - "defaultValue": 50, - "maxValue": 100, - "ioType": "analogOutput", - "writable": true - } - ] - }, - { - "id": "3edeec39-ab9d-4697-90cc-0bba089384cf", - "name": "orpSensor", - "displayName": "Generic ORP sensor", - "createMethods": ["user"], - "interfaces": ["orpsensor"], - "settingsTypes": [ - { - "id": "396bf3f9-a3fc-44c3-90f8-b316670116a7", - "name": "minORP", - "displayName": "Minimum input value", - "type": "double", - "defaultValue": -1500 - }, - { - "id": "bd0774c9-1b89-49ce-b0f8-66ff26ca10db", - "name": "maxORP", - "displayName": "Maximum input ORP value", - "type": "double", - "defaultValue": 1500 - }, - { - "id": "1f218ad8-652a-4bda-987d-3e183ff040b2", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 0 - } - ], - "stateTypes": [ - { - "id": "e5ed3535-2e5d-412e-85f8-782cbccd7731", - "name": "orp", - "displayName": "ORP", - "displayNameEvent": "ORP changed", - "type": "double", - "unit": "MilliVolt", - "defaultValue": 0, - "minValue": -1500, - "maxValue": 1500 - }, - { - "id": "020ff04f-a157-4925-9c55-2b45389208fc", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "minValue": 0, - "defaultValue": 0, - "maxValue": 100, - "ioType": "analogOutput", - "writable": true - } - ] - }, - { - "id": "a8cf20ec-132b-4f6f-b5ec-73dc2f873b43", - "name": "o2Sensor", - "displayName": "Generic O2 sensor", - "createMethods": ["user"], - "interfaces": ["o2sensor"], - "settingsTypes": [ - { - "id": "58e84041-d451-44a2-972e-13a79b449b58", - "name": "minInput", - "displayName": "Minimum input value", - "type": "double", - "defaultValue": 0 - }, - { - "id": "198847f6-a188-42b0-9e0b-15587eaabbed", - "name": "maxInput", - "displayName": "Maximum input value", - "type": "double", - "defaultValue": 100 - }, - { - "id": "d79701ac-1619-42d8-b10f-a55e8e2ab3f1", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 0 - } - ], - "stateTypes": [ - { - "id": "a3ff7641-87d9-4b07-b8e5-e6aa92b90088", - "name": "o2saturation", - "displayName": "O2 saturation", - "displayNameEvent": "O2 saturation changed", - "type": "double", - "unit": "Percentage", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100 - }, - { - "id": "7e74fca7-84d0-4f3e-9f26-4232b7b9f507", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "minValue": 0, - "defaultValue": 0, - "maxValue": 100, - "ioType": "analogOutput", - "writable": true - } - ] - }, - { - "id": "9a8d804b-d1dc-450a-8c41-be491e5cdda0", - "name": "pressureSensor", - "displayName": "Generic pressure sensor", - "createMethods": ["user"], - "interfaces": ["pressuresensor"], - "settingsTypes": [ - { - "id": "035e2619-f9c2-4e8f-95dd-f124ad9402d0", - "name": "minPressure", - "displayName": "Minimum pressure", - "type": "double", - "defaultValue": 0, - "unit": "MilliBar" - }, - { - "id": "06e21251-8b4f-44a1-8504-6b51f8526bd0", - "name": "maxPressure", - "displayName": "Maximum pressure", - "type": "double", - "defaultValue": 2000, - "unit": "MilliBar" - }, - { - "id": "021a17d8-9e5e-4dd6-835d-1a3e1ffd6b23", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "e645a979-1465-4592-b8b0-f4c123db0800", - "name": "pressure", - "displayName": "Pressure", - "displayNameEvent": "Pressure changed", - "type": "double", - "unit": "MilliBar", - "defaultValue": 0 - }, - { - "id": "c320577c-371a-442b-ac80-b692ff2064c9", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "unit": "Percentage", - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "262a29b2-b5df-4ee2-822c-e672f50d97b6", - "name": "coSensor", - "displayName": "Generic CO sensor", - "createMethods": ["user"], - "interfaces": ["cosensor"], - "settingsTypes": [ - { - "id": "e850b044-fd70-446c-a943-3c88407425f5", - "name": "minCO", - "displayName": "Minimum CO", - "type": "double", - "defaultValue": 0, - "unit": "PartsPerMillion" - }, - { - "id": "e9def195-1b67-4a1b-8030-cbbc6209d52e", - "name": "maxCO", - "displayName": "Maximum CO", - "type": "double", - "defaultValue": 2000, - "unit": "PartsPerMillion" - }, - { - "id": "9c8a9553-7b68-4b58-a8f1-3c6b591998c0", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "9eebe9d2-b34b-4847-bc25-109e2b8cab24", - "name": "co", - "displayName": "CO level", - "displayNameEvent": "CO level changed", - "type": "double", - "unit": "PartsPerMillion", - "defaultValue": 0 - }, - { - "id": "cf3ec5ec-7098-47c5-9666-b3c52eba1b1d", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "a58a2dae-4148-4a4d-ab34-2a11124454a0", - "name": "co2Sensor", - "displayName": "Generic CO2 sensor", - "createMethods": ["user"], - "interfaces": ["co2sensor"], - "settingsTypes": [ - { - "id": "a0d8a6ec-599a-4ded-ae03-2950561f0b72", - "name": "minCO2", - "displayName": "Minimum CO2", - "type": "double", - "defaultValue": 0, - "unit": "PartsPerMillion" - }, - { - "id": "a3029bee-8b13-4aed-8ebd-eaceb603f8ef", - "name": "maxCO2", - "displayName": "Maximum CO2", - "type": "double", - "defaultValue": 2000, - "unit": "PartsPerMillion" - }, - { - "id": "236831a8-a455-4e38-a9cd-eabbebaa3f67", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "755c4c7f-093e-41dd-a38d-9ee18c9890d6", - "name": "co2", - "displayName": "CO2", - "displayNameEvent": "CO2 changed", - "type": "double", - "unit": "PartsPerMillion", - "defaultValue": 0 - }, - { - "id": "7dc765f8-fa9b-4199-8f21-49ed452f226d", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "25c6725f-5c15-485b-9ec4-cb0e11ab6b32", - "name": "gasSensor", - "displayName": "Generic flammable gas sensor", - "createMethods": ["user"], - "interfaces": ["gassensor"], - "settingsTypes": [ - { - "id": "480945ea-6262-408d-b799-cbff905a40db", - "name": "minValue", - "displayName": "Minimum value", - "type": "double", - "defaultValue": 0, - "unit": "PartsPerMillion" - }, - { - "id": "51f4a830-3ef9-4fa2-b36b-5976f724f8a1", - "name": "maxValue", - "displayName": "Maximum value", - "type": "double", - "defaultValue": 10000, - "unit": "PartsPerMillion" - }, - { - "id": "1c7465b1-490d-43db-bb67-a179a6923a57", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "5135648f-57b7-44b0-b9d0-c5accad09356", - "name": "gas", - "displayName": "Gas level", - "displayNameEvent": "Gas level changed", - "type": "double", - "unit": "PartsPerMillion", - "defaultValue": 0 - }, - { - "id": "e3eb500a-ac00-426c-932a-dee4fd6fbcf5", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "d4d873fd-f0fc-433f-b615-91c1506a1890", - "name": "lightSensor", - "displayName": "Generic light sensor", - "createMethods": ["user"], - "interfaces": ["lightsensor"], - "settingsTypes": [ - { - "id": "6dea7384-b079-443b-8cc2-1479138fa212", - "name": "minLux", - "displayName": "Minimum Lux", - "type": "double", - "defaultValue": 0, - "unit": "Lux" - }, - { - "id": "7fe74404-d7f0-41af-a8d4-dd1bda27f752", - "name": "maxLux", - "displayName": "Maximum Lux", - "type": "double", - "defaultValue": 120000, - "unit": "Lux" - }, - { - "id": "f800988f-1ad5-4ffb-9aa8-70ef17614966", - "name": "accuracy", - "displayName": "Accuracy (decimal places)", - "type": "uint", - "minValue": 0, - "maxValue": 5, - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b", - "name": "lightIntensity", - "displayName": "Light intensity", - "displayNameEvent": "Light intensity changed", - "type": "double", - "unit": "Lux", - "defaultValue": 0 - }, - { - "id": "520e5d27-7d15-4d79-94cf-5d01f5a09ea8", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100, - "unit": "Percentage", - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "c3123967-f741-4fe1-a0d4-9a3e405d7e52", - "name": "smartMeter", - "displayName": "Impulse based energy meter", - "createMethods": ["user"], - "interfaces": ["smartmeterconsumer"], - "settingsTypes": [ - { - "id": "c361732b-68eb-447e-a434-e84031231871", - "name": "impulsePerKwh", - "displayName": "Impulse/kWh", - "type": "int", - "minValue": 1, - "maxValue": 1000000, - "defaultValue": 1000 - }, - { - "id": "73c9acc3-8f76-40d7-a79b-a1f08bb308d4", - "name": "impulseTimeframe", - "displayName": "Timeframe for power calculation", - "type": "int", - "unit": "Seconds", - "minValue": 1, - "maxValue": 600, - "defaultValue": 10 - } - ], - "stateTypes": [ - { - "id": "5983d714-5f80-42d8-bee2-9228b6382b3b", - "name": "currentPower", - "displayName": "Current Power usage", - "displayNameEvent": "Current Power usage changed", - "type": "double", - "defaultValue": 0.00, - "unit": "Watt" - }, - { - "id": "5821edb7-e6cb-4e5a-9d0b-3375126d3367", - "name": "totalEnergyConsumed", - "displayName": "Energy", - "displayNameEvent": "Energy changed", - "type": "double", - "defaultValue": 0.00, - "unit": "KiloWattHour" - }, - { - "id": "9cd7e5ca-f8f8-48d5-9785-911ae75158c3", - "name": "impulseInput", - "displayName": "Impulse input", - "displayNameEvent": "Impulse input changed", - "displayNameAction": "Set impulse input", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - } - ] - }, - { - "id": "6a34ba99-e5ec-4fc9-a61f-695ed8573fa1", - "name": "thermostat", - "displayName": "Generic thermostat", - "createMethods": ["user"], - "interfaces": ["thermostat"], - "settingsTypes": [ - { - "id": "64bf308f-a543-4e02-b787-1a1714c1f978", - "name": "temperatureDifference", - "displayName": "Temperature difference", - "type": "double", - "unit": "DegreeCelsius", - "minValue": 0.00, - "defaultValue": 2.00 - }, - { - "id": "67451c97-50e1-4ea6-ac43-4386fbd26698", - "name": "minTargetTemperature", - "displayName": "Minimum temperature", - "type": "double", - "unit": "DegreeCelsius", - "minValue": -20, - "maxValue": 49, - "defaultValue": -20 - }, - { - "id": "85608dd5-7e67-4c98-9e62-b97411681048", - "name": "maxTargetTemperature", - "displayName": "Maximum temperature", - "type": "double", - "unit": "DegreeCelsius", - "minValue": -19, - "maxValue": 50, - "defaultValue": 50 - } - ], - "stateTypes": [ - { - "id": "0f808803-0e63-47df-b024-9685998ba663", - "name": "temperature", - "displayName": "Temperature sensor input", - "displayNameEvent": "Temperature sensor input changed", - "displayNameAction": "Set temperature sensor input", - "type": "double", - "defaultValue": 0, - "minValue": -20, - "maxValue": 50, - "unit": "DegreeCelsius", - "writable": true, - "ioType": "analogOutput" - }, - { - "id": "60169ebf-c1e3-41ed-a1bb-4b858e93ec50", - "name": "targetTemperature", - "displayName": "Target temperature", - "displayNameEvent": "Target temperature changed", - "displayNameAction": "Set target temperature", - "type": "double", - "defaultValue": 21, - "minValue": -20, - "maxValue": 50, - "unit": "DegreeCelsius", - "writable": true, - "ioType": "analogInput" - }, - { - "id": "1f6a0c39-4417-4e31-86db-9926cf81c345", - "name": "heatingOn", - "displayName": "Heating On/off", - "displayNameEvent": "Heating turned on/off", - "displayNameAction": "Turn heating on/off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - }, - { - "id": "cab7d4bd-f612-4d12-b3a4-0649e189810f", - "name": "coolingOn", - "displayName": "Cooling On/off", - "displayNameEvent": "Cooling turned on/off", - "displayNameAction": "Turn cooling on/off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "09edbc07-d382-48a4-9b16-99992014aff9", - "name": "cooling", - "displayName": "Generic cooler", - "createMethods": ["user"], - "interfaces": ["cooling"], - "stateTypes": [ - { - "id": "918cfd2c-6692-4faa-acc6-18ebf93611ec", - "name": "power", - "displayName": "Cooler on/off", - "displayNameEvent": "Cooler turned on/off", - "displayNameAction": "Turn cooler on/off", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalInput" - } - ] - }, - { - "id": "83cf138d-02dc-4015-9b03-6360c2f3cfb1", - "name": "sgReady", - "displayName": "SG-Ready", - "createMethods": ["user"], - "interfaces": [ "smartgridheatpump" ], - "settingsTypes": [ - ], - "stateTypes": [ - { - "id": "d080466e-7271-441f-9916-1199a6668545", - "name": "relay1", - "displayName": "Relay 1", - "displayNameEvent": "Relay 1 changed", - "displayNameAction": "Set relay 1", - "type": "bool", - "defaultValue": false, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "caf22937-fdf7-41e1-a87b-d11e66c4f4c6", - "name": "relay2", - "displayName": "Relay 2", - "displayNameEvent": "Relay 2 changed", - "displayNameAction": "Set relay 2", - "type": "bool", - "defaultValue": true, - "ioType": "digitalInput", - "writable": true - }, - { - "id": "1e694bc2-12e1-4e1d-a0ec-70af2c7b16ab", - "name": "sgReadyMode", - "displayName": "Smart grid mode", - "displayNameEvent": "Smart grid mode changed", - "displayNameAction": "Set smart grid mode", - "type": "QString", - "possibleValues": [ - "Off", - "Low", - "Standard", - "High" - ], - "defaultValue": "Standard", - "writable": true, - "cached": true, - "suggestLogging": true - }, - { - "id": "b421d098-f6e9-40e2-b536-58acdb3a49fe", - "name": "operatingModeDescription", - "displayName": "Operating mode description", - "displayNameEvent": "Operating mode description changed", - "type": "QString", - "defaultValue": "" - } - ] - }, - { - "id": "2d936f56-48ee-4be1-9b3e-28a335ad8085", - "name": "doorSensor", - "displayName": "Generic door or window sensor", - "createMethods": ["user"], - "interfaces": ["closablesensor"], - "stateTypes": [ - { - "id": "7f5fdc2b-7916-4e90-9c24-558162304f71", - "name": "closed", - "displayName": "Closed", - "displayNameEvent": "Opened or closed", - "displayNameAction": "Set open or closed", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - } - ] - }, - { - "id": "09b9cb86-f551-4efe-9a7d-2f7624e9510f", - "name": "waterSensor", - "displayName": "Gerneric water sensor", - "createMethods": ["user"], - "interfaces": ["watersensor"], - "stateTypes": [ - { - "id": "b2427b85-1f62-4635-b546-1961191426ef", - "name": "waterDetected", - "displayName": "Water detected", - "displayNameEvent": "Water detected", - "displayNameAction": "Set water detected", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - } - ] - }, - { - "id": "f1576df0-fb45-4bf0-89fa-a83c4118c326", - "name": "waterLevelSensor", - "displayName": "Generic water level sensor", - "createMethods": ["user"], - "interfaces": ["waterlevelsensor"], - "settingsTypes": [ - { - "id": "5e98e8d2-d849-46c5-b25a-d54f184ea4c7", - "name": "capacity", - "displayName": "Tank capactity", - "type": "double", - "unit": "Liter", - "minValue": 0, - "defaultValue": 100 - }, - { - "id": "16ea3cf2-46fd-40a3-88bf-21a2bb7cbabe", - "name": "minInputValue", - "displayName": "Minimum input value", - "type": "double", - "defaultValue": 0 - }, - { - "id": "4e228f9b-8631-4643-8375-3d8d76d12e9c", - "name": "maxInputValue", - "displayName": "Maximum input value", - "type": "double", - "defaultValue": 1 - } - ], - "stateTypes": [ - { - "id": "07563165-e42d-4d0f-ac60-31cdd19170f2", - "name": "waterLevel", - "displayName": "Water level", - "displayNameEvent": "Water level changed", - "type": "double", - "unit": "Liter", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100 - }, - { - "id": "d344887d-da5d-4742-83bd-608754b2d0aa", - "name": "input", - "displayName": "Input value", - "displayNameEvent": "Input value changed", - "displayNameAction": "Set input value", - "type": "double", - "defaultValue": 0, - "minValue": 0, - "maxValue": 1, - "writable": true, - "ioType": "analogOutput" - } - ] - }, - { - "id": "339a0c54-4086-404f-8d36-bcf20621b785", - "name": "presenceSensor", - "displayName": "Generic presence sensor", - "createMethods": ["user"], - "interfaces": ["presencesensor"], - "stateTypes": [ - { - "id": "22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c", - "name": "isPresent", - "displayName": "Presence detected", - "displayNameEvent": "Presense changed", - "displayNameAction": "Set presence", - "type": "bool", - "defaultValue": false, - "ioType": "digitalOutput", - "writable": true - }, - { - "id": "be4842cb-140c-425f-9630-8bb19fdb943e", - "name": "lastSeenTime", - "displayName": "Last seen time", - "displayNameEvent": "Last seen time changed", - "type": "int", - "unit": "UnixTime", - "defaultValue": 0 - } - ] - }, - { - "id": "81418556-cae3-4803-aa0c-9c4b3304a3eb", - "name": "battery", - "displayName": "Generic battery", - "createMethods": ["user"], - "interfaces": ["battery"], - "settingsTypes": [ - { - "id": "8d875cb7-3a14-42d1-bf1b-759e5fd95a8f", - "name": "criticalLevel", - "displayName": "Critical battery level", - "type": "int", - "minValue": 0, - "maxValue": 100, - "defaultValue": 10 - } - ], - "stateTypes": [ - { - "id": "d37eed4a-befc-40d4-b435-40a761f99314", - "name": "batteryLevel", - "displayName": "Battery level", - "displayNameEvent": "Battery level changed", - "type": "int", - "unit": "Percentage", - "defaultValue": 0, - "minValue": 0, - "maxValue": 100 - }, - { - "id": "3336f0c2-158b-4353-b74f-f1bb9c4e8447", - "name": "batteryLevelControl", - "displayName": "Battery level control", - "displayNameEvent": "Battery level control changed", - "displayNameAction": "Set battery level", - "type": "double", - "minValue": 0, - "maxValue": 100, - "defaultValue": 0, - "unit": "Percentage", - "writable": true, - "ioType": "analogOutput" - }, - { - "id": "a61c0328-b982-46a5-9cc0-b4fa4d0ab84d", - "name": "charging", - "displayName": "Charging", - "displayNameEvent": "Charging started or stopped", - "displayNameAction": "Set charging", - "type": "bool", - "defaultValue": false, - "writable": true, - "ioType": "digitalOutput" - }, - { - "id": "e95dc037-002d-40a2-8c15-cd5489bd354a", - "name": "batteryCritical", - "displayName": "Battery critical", - "displayNameEvent": "Battery entered or left critical state", - "type": "bool", - "defaultValue": false - } - ] - }, - { - "id": "dbe0a9ff-94ba-4a94-ae52-51da3f05c717", - "name": "car", - "displayName": "Generic electric car", - "createMethods": ["user"], - "interfaces": ["electricvehicle"], - "settingsTypes": [ - { - "id": "0c55516d-4285-4d02-8926-1dae03649e18", - "name": "minChargingCurrent", - "displayName": "Minimum charging current", - "type": "uint", - "unit": "Ampere", - "minValue": 6, - "maxValue": 16, - "defaultValue": 6 - } - ], - "stateTypes": [ - { - "id": "363a2a39-61b6-4109-9cd9-aca7367d12c7", - "name": "capacity", - "displayName": "Capacity", - "displayNameEvent": "Capacity changed", - "displayNameAction": "Set capacity", - "type": "double", - "unit": "KiloWattHour", - "defaultValue": 50, - "writable": true - }, - { - "id": "d33982d6-6467-4281-b448-68c1b1db088d", - "name": "batteryCritical", - "displayName": "Battery level critical", - "displayNameEvent": "Battery entered or left critical state", - "type": "bool", - "defaultValue": false - }, - { - "id": "3f1cca10-8988-4ec6-b937-0775653cde12", - "name": "batteryLevel", - "displayName": "Battery level", - "displayNameEvent": "Battery level changed", - "displayNameAction": "Set battery level", - "type": "int", - "unit": "Percentage", - "writable": true, - "minValue": 0, - "maxValue": 100, - "defaultValue": 100 - }, - { - "id": "20faf2b8-2b40-4bee-b228-97dbaf0cdffc", - "name": "minChargingCurrent", - "displayName": "Minimum charging current", - "displayNameEvent": "Minimum charging current changed", - "type": "uint", - "unit": "Ampere", - "minValue": 6, - "maxValue": 16, - "defaultValue": 6 - } - ] - }, - { - "id": "9fdb33bb-8e38-4108-8234-3b1d07bbc801", - "name": "simpleHeatPump", - "displayName": "Generic simple heat pump", - "createMethods": ["user"], - "interfaces": ["simpleheatpump"], - "stateTypes": [ - { - "id": "ac2ac0f9-058c-4586-8871-2d9dbc6e1758", - "name": "power", - "displayName": "Heat pump enabled", - "displayNameEvent": "Heat pump power changed", - "displayNameAction": "Enable/Disable heat pump", - "type": "bool", - "writable": true, - "defaultValue": false, - "cached": true, - "ioType": "digitalInput", - "suggestLogging": true - } - ] - } - ] - } - ] -} diff --git a/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-de.ts b/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-de.ts deleted file mode 100644 index 3c7229b..0000000 --- a/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-de.ts +++ /dev/null @@ -1,1590 +0,0 @@ - - - - - GenericThings - - Accuracy (decimal places) - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {f800988f-1ad5-4ffb-9aa8-70ef17614966}) ----------- -The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {1c7465b1-490d-43db-bb67-a179a6923a57}) ----------- -The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {236831a8-a455-4e38-a9cd-eabbebaa3f67}) ----------- -The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {9c8a9553-7b68-4b58-a8f1-3c6b591998c0}) ----------- -The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {021a17d8-9e5e-4dd6-835d-1a3e1ffd6b23}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {d79701ac-1619-42d8-b10f-a55e8e2ab3f1}) ----------- -The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {1f218ad8-652a-4bda-987d-3e183ff040b2}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {bb41de73-31d0-4b21-8f80-14467120aae4}) ----------- -The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3c967a68-9951-4c9a-b019-79b913e762b6}) ----------- -The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {38064841-6121-4862-a639-08fb0b778511}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {3b543c3a-1fc0-45b5-8c07-600a6045f82e}) - Genauigkeit - - - Angle - The name of the ParamType (ThingClass: venetianBlind, ActionType: angle, ID: {fcb700c4-5da8-4385-85b0-6616e807974e}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: angle, ID: {fcb700c4-5da8-4385-85b0-6616e807974e}) ----------- -The name of the StateType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - Winkel - - - Angle changed - The name of the EventType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - Winkel geändert - - - Close - The name of the ActionType ({2420fcdb-03d3-4edb-aa89-e3b93c7d6d18}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({1111c0ed-69b6-480c-9fd5-15292600d4f4}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({cf5303f1-67c7-4cef-b11c-eb9de6fc8a87}) of ThingClass shutter ----------- -The name of the ActionType ({1c71f050-f6cb-4929-9c9d-7c262f77c143}) of ThingClass venetianBlind ----------- -The name of the ActionType ({97d6351d-7440-47f3-bdba-a31bb15368ac}) of ThingClass extendedBlind ----------- -The name of the ActionType ({86e9cf21-7487-47c4-b4be-4a940d7235fb}) of ThingClass blind ----------- -The name of the ActionType ({53b5ba77-9a34-4cd6-ad24-fb01fc465f98}) of ThingClass awning - Schließen - - - Closing output - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: closingOutput, ID: {e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) ----------- -The name of the StateType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: simpleGaragedoor, EventType: closingOutput, ID: {44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) ----------- -The name of the StateType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor ----------- -The name of the ParamType (ThingClass: shutter, ActionType: closingOutput, ID: {1c35df0e-4c41-455f-893a-0145377952a0}) ----------- -The name of the ParamType (ThingClass: shutter, EventType: closingOutput, ID: {1c35df0e-4c41-455f-893a-0145377952a0}) ----------- -The name of the StateType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, ActionType: closingOutput, ID: {84dd2fa1-85fe-47f3-9e32-e6083432d39c}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: closingOutput, ID: {84dd2fa1-85fe-47f3-9e32-e6083432d39c}) ----------- -The name of the StateType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: closingOutput, ID: {1a4a5839-a30d-4239-a124-63bfdc74a8f6}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: closingOutput, ID: {1a4a5839-a30d-4239-a124-63bfdc74a8f6}) ----------- -The name of the StateType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, ActionType: closingOutput, ID: {9b673430-572d-4a9c-85d3-dafadbe541cd}) ----------- -The name of the ParamType (ThingClass: blind, EventType: closingOutput, ID: {9b673430-572d-4a9c-85d3-dafadbe541cd}) ----------- -The name of the StateType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, ActionType: closingOutput, ID: {59bfd575-709f-4e43-9726-de26e6d4ca8b}) ----------- -The name of the ParamType (ThingClass: awning, EventType: closingOutput, ID: {59bfd575-709f-4e43-9726-de26e6d4ca8b}) ----------- -The name of the StateType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - Ausgang Schließen - - - Closing output changed - The name of the EventType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor ----------- -The name of the EventType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the EventType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the EventType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the EventType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the EventType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - Ausgang Schließen geändert - - - Generic Things - The name of the plugin GenericThings ({b3188696-2585-4806-bf98-30ab576ce5c8}) - Generische Dinge - - - Generic awning - The name of the ThingClass ({9e69585f-90ba-44e4-ad90-5b4bffbe345a}) - Generische Markise - - - Generic blind - The name of the ThingClass ({17ee3657-6ad8-4ae2-8959-3cf66cec8d13}) - Generische Beschattung - - - Generic heating - The name of the ThingClass ({392854c4-3d14-4cf8-96cd-d933526bd197}) - Generische Heizung - - - Generic humidity sensor - The name of the ThingClass ({d295bc64-773c-42a9-83e2-80db5fa0d1ce}) - Generischer Luftfeuchtigkeitssensor - - - Generic irrigation - The name of the ThingClass ({d013b980-20d5-4791-9c4f-b411c39241d7}) - Generische Bewässerung - - - Generic light - The name of the ThingClass ({c50d3216-f307-4f9f-8190-4391510c385c}) - Generisches Licht - - - Generic power socket - The name of the ThingClass ({4e7261af-a27b-4446-8346-914ea59f7547}) - Generische Steckdose - - - Generic power switch - The name of the ThingClass ({57daa147-dd6f-4673-a757-d8f01a2054c7}) - Generischer Schalter - - - Generic shutter - The name of the ThingClass ({7917c2e7-d7d2-4c47-a38d-41f7dd7693d9}) - Gnerische Rollos - - - Generic soil moisture sensor - The name of the ThingClass ({33e610cf-ff30-481b-9f0b-d6857bcd41a5}) - Gnerischer Erdbodenfeuchtesensor - - - Generic temperature sensor - The name of the ThingClass ({cf3d65db-6f68-457b-968c-cfb66cbd5311}) - Gnerischer Temperaturesensor - - - Generic ventilation - The name of the ThingClass ({24af8dd3-ddf0-47f0-bf09-70fdfd8dceab}) - Generische Lüftung - - - Humidity - The name of the ParamType (ThingClass: humiditySensor, EventType: humidity, ID: {925225d9-2965-444a-9c42-63c2873700fb}) ----------- -The name of the StateType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor - Luftfeuchte - - - Humidity changed - The name of the EventType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor - Luftfeuchte geändert - - - Input value - The name of the ParamType (ThingClass: waterLevelSensor, ActionType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) ----------- -The name of the ParamType (ThingClass: waterLevelSensor, EventType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) ----------- -The name of the StateType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the ParamType (ThingClass: lightSensor, ActionType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) ----------- -The name of the ParamType (ThingClass: lightSensor, EventType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) ----------- -The name of the StateType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the ParamType (ThingClass: gasSensor, ActionType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) ----------- -The name of the ParamType (ThingClass: gasSensor, EventType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) ----------- -The name of the StateType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the ParamType (ThingClass: co2Sensor, ActionType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) ----------- -The name of the ParamType (ThingClass: co2Sensor, EventType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) ----------- -The name of the StateType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the ParamType (ThingClass: coSensor, ActionType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) ----------- -The name of the ParamType (ThingClass: coSensor, EventType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) ----------- -The name of the StateType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the ParamType (ThingClass: pressureSensor, ActionType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) ----------- -The name of the ParamType (ThingClass: pressureSensor, EventType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) ----------- -The name of the StateType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the ParamType (ThingClass: o2Sensor, ActionType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) ----------- -The name of the ParamType (ThingClass: o2Sensor, EventType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) ----------- -The name of the StateType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the ParamType (ThingClass: orpSensor, ActionType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) ----------- -The name of the ParamType (ThingClass: orpSensor, EventType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) ----------- -The name of the StateType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the ParamType (ThingClass: phSensor, ActionType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) ----------- -The name of the ParamType (ThingClass: phSensor, EventType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) ----------- -The name of the StateType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the ParamType (ThingClass: moistureSensor, ActionType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) ----------- -The name of the ParamType (ThingClass: moistureSensor, EventType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) ----------- -The name of the StateType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the ParamType (ThingClass: humiditySensor, ActionType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) ----------- -The name of the ParamType (ThingClass: humiditySensor, EventType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) ----------- -The name of the StateType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the ParamType (ThingClass: temperatureSensor, ActionType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, EventType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) ----------- -The name of the StateType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - Eingangswert - - - Input value changed - The name of the EventType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the EventType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the EventType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the EventType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the EventType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the EventType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the EventType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the EventType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the EventType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the EventType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the EventType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the EventType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - Eingangswert geändert - - - Maximum humidity - The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {10afc387-68d1-47ea-a816-0d1acad47b3c}) - Maximale Luftfeuchte - - - Maximum moisture - The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3426817d-065e-4cfc-aa21-bb434de684d6}) - Maximale Erdbodenfeuchte - - - Maximum temperature - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {85608dd5-7e67-4c98-9e62-b97411681048}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {8b5947ab-127f-4995-853b-eeeb628811e3}) - Maximale Temperatur - - - Minimum humidity - The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {0218ffa9-3d49-4b25-a59f-c8831f190432}) - Minimale Luftfeuchtigkeit - - - Minimum moisture - The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {32153786-f1ae-4aa4-a84c-b9054102eb92}) - Minimale Erdbodenfeuchte - - - Minimum temperature - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {67451c97-50e1-4ea6-ac43-4386fbd26698}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {c86ae5d3-9335-4b6e-8231-bf3ed6670dff}) - Minimale Temperatur - - - Moving - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: moving, ID: {963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) ----------- -The name of the StateType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: moving, ID: {6234c07e-4200-4f2c-8cbd-bff24c38c243}) ----------- -The name of the StateType ({6234c07e-4200-4f2c-8cbd-bff24c38c243}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: moving, ID: {941d1e1f-8dd7-4493-812f-6cefefd88c2e}) ----------- -The name of the StateType ({941d1e1f-8dd7-4493-812f-6cefefd88c2e}) of ThingClass extendedBlind - Bewegung - - - Moving changed - The name of the EventType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({6234c07e-4200-4f2c-8cbd-bff24c38c243}) of ThingClass venetianBlind ----------- -The name of the EventType ({941d1e1f-8dd7-4493-812f-6cefefd88c2e}) of ThingClass extendedBlind - Bewegung geändert - - - Open - The name of the ActionType ({4a3a3b88-47e9-436f-86be-b5955f3fc2f7}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({3edb25af-ad51-495b-9ac9-ab97669339b7}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({9deb662d-2378-4345-a898-8742d41e43c1}) of ThingClass shutter ----------- -The name of the ActionType ({3e728e50-3d45-4035-b215-1e604cf3159b}) of ThingClass venetianBlind ----------- -The name of the ActionType ({5a7599fa-8351-4ed6-9b98-fa2f3be54304}) of ThingClass extendedBlind ----------- -The name of the ActionType ({120dc265-dbbb-4f19-9d31-c372c23479c0}) of ThingClass blind ----------- -The name of the ActionType ({979e9c51-5a93-4635-85e3-01874306b229}) of ThingClass awning - - - - Opening output - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: openingOutput, ID: {ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) ----------- -The name of the StateType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: simpleGaragedoor, EventType: openingOutput, ID: {fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) ----------- -The name of the StateType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor ----------- -The name of the ParamType (ThingClass: shutter, ActionType: openingOutput, ID: {cc547728-b309-4695-b355-49748ef2521c}) ----------- -The name of the ParamType (ThingClass: shutter, EventType: openingOutput, ID: {cc547728-b309-4695-b355-49748ef2521c}) ----------- -The name of the StateType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, ActionType: openingOutput, ID: {6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: openingOutput, ID: {6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) ----------- -The name of the StateType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: openingOutput, ID: {e559f077-e904-4bbc-8ec3-344b814d2eab}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: openingOutput, ID: {e559f077-e904-4bbc-8ec3-344b814d2eab}) ----------- -The name of the StateType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, ActionType: openingOutput, ID: {b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) ----------- -The name of the ParamType (ThingClass: blind, EventType: openingOutput, ID: {b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) ----------- -The name of the StateType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, ActionType: openingOutput, ID: {4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) ----------- -The name of the ParamType (ThingClass: awning, EventType: openingOutput, ID: {4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) ----------- -The name of the StateType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - Öffungsausgang geändert - - - Opening output changed - The name of the EventType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor ----------- -The name of the EventType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the EventType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the EventType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the EventType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the EventType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - Öffnungsausgang geändert - - - Percentage - The name of the ParamType (ThingClass: venetianBlind, ActionType: percentage, ID: {33dc8019-336d-4d50-8d60-dff8508338ca}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: percentage, ID: {33dc8019-336d-4d50-8d60-dff8508338ca}) ----------- -The name of the StateType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: percentage, ID: {181df603-d45f-4d3d-a358-97aa3e4ac0bd}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: percentage, ID: {181df603-d45f-4d3d-a358-97aa3e4ac0bd}) ----------- -The name of the StateType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - Prozent - - - Percentage changed - The name of the EventType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the EventType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - Prozent geändert - - - Power - The name of the ParamType (ThingClass: ventilationFlow, ActionType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) ----------- -The name of the ParamType (ThingClass: ventilationFlow, EventType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) ----------- -The name of the StateType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the ParamType (ThingClass: ventilation, ActionType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) ----------- -The name of the ParamType (ThingClass: ventilation, EventType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) ----------- -The name of the StateType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the ParamType (ThingClass: irrigation, ActionType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) ----------- -The name of the ParamType (ThingClass: irrigation, EventType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) ----------- -The name of the StateType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation ----------- -The name of the ParamType (ThingClass: powerSwitch, ActionType: power, ID: {08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) ----------- -The name of the ParamType (ThingClass: powerSwitch, EventType: power, ID: {08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) ----------- -The name of the StateType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch ----------- -The name of the ParamType (ThingClass: heating, ActionType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) ----------- -The name of the ParamType (ThingClass: heating, EventType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) ----------- -The name of the StateType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the ParamType (ThingClass: light, ActionType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) ----------- -The name of the ParamType (ThingClass: light, EventType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) ----------- -The name of the StateType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the ParamType (ThingClass: socket, ActionType: power, ID: {018038d7-1d02-4b17-8fe3-babca044b087}) ----------- -The name of the ParamType (ThingClass: socket, EventType: power, ID: {018038d7-1d02-4b17-8fe3-babca044b087}) ----------- -The name of the StateType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - Eingeschalten - - - Power changed - The name of the EventType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the EventType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the EventType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - Eingeschalten geändert - - - Power on/off - The name of the ActionType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch - Eingeschalten Ein/Aus - - - Powered on/off - The name of the EventType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch - Eingeschalten Ein/Aus - - - Set angle - The name of the ActionType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - Setzte Winkel - - - Set closing output - The name of the ActionType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the ActionType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the ActionType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the ActionType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the ActionType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - Setze Schließausgang - - - Set input value - The name of the ActionType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the ActionType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the ActionType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the ActionType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the ActionType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the ActionType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the ActionType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the ActionType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the ActionType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the ActionType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the ActionType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the ActionType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - Setze Eingangswert - - - Set opening output - The name of the ActionType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the ActionType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the ActionType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the ActionType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the ActionType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - Setze Öffnungsausgang - - - Set percentage - The name of the ActionType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the ActionType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - Setze Prozent - - - Set power - The name of the ActionType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the ActionType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the ActionType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - Setze Eingeschalten - - - Soil moisture - The name of the ParamType (ThingClass: moistureSensor, EventType: moisture, ID: {7a62e1d2-92f2-424c-876c-870478a4b2bd}) ----------- -The name of the StateType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor - Erdbodenfeuchte - - - Soil moisture changed - The name of the EventType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor - Erdbodenfeuchte geändert - - - Status - The name of the ParamType (ThingClass: shutter, EventType: status, ID: {6d6e72dc-4d2b-4ec1-82c2-54405a682711}) ----------- -The name of the StateType ({6d6e72dc-4d2b-4ec1-82c2-54405a682711}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: status, ID: {6fb7826e-b6d8-42f8-b712-719496046436}) ----------- -The name of the StateType ({6fb7826e-b6d8-42f8-b712-719496046436}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: status, ID: {c2354d7e-198a-43ae-aa5f-c6710010c7e1}) ----------- -The name of the StateType ({c2354d7e-198a-43ae-aa5f-c6710010c7e1}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, EventType: status, ID: {5fdec1e0-51f6-48b9-b743-ba572504b2c1}) ----------- -The name of the StateType ({5fdec1e0-51f6-48b9-b743-ba572504b2c1}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, EventType: status, ID: {ff6f2565-2a2e-4d34-b10f-d3f73b676399}) ----------- -The name of the StateType ({ff6f2565-2a2e-4d34-b10f-d3f73b676399}) of ThingClass awning - Status - - - Status changed - The name of the EventType ({6d6e72dc-4d2b-4ec1-82c2-54405a682711}) of ThingClass shutter ----------- -The name of the EventType ({6fb7826e-b6d8-42f8-b712-719496046436}) of ThingClass venetianBlind ----------- -The name of the EventType ({c2354d7e-198a-43ae-aa5f-c6710010c7e1}) of ThingClass extendedBlind ----------- -The name of the EventType ({5fdec1e0-51f6-48b9-b743-ba572504b2c1}) of ThingClass blind ----------- -The name of the EventType ({ff6f2565-2a2e-4d34-b10f-d3f73b676399}) of ThingClass awning - Status geändert - - - Stop - The name of the ActionType ({109c3eaf-26a0-4121-8be2-1363253178fd}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({f346766f-44ee-452b-bb9c-e89ec0f56016}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({db5f3332-1f4e-4f9e-84d2-93c5d7de315c}) of ThingClass shutter ----------- -The name of the ActionType ({6e3eeb5d-d7ed-4175-9795-e76451e0a00b}) of ThingClass venetianBlind ----------- -The name of the ActionType ({ab67e4bf-c7b6-489b-9b49-3e0a1c7d33ca}) of ThingClass extendedBlind ----------- -The name of the ActionType ({1a924c9a-5dcb-4b1c-8fd6-ab101098e007}) of ThingClass blind ----------- -The name of the ActionType ({555cafe4-bd12-42c6-bab1-8cd59af6468e}) of ThingClass awning - Stop - - - Temperature - The name of the ParamType (ThingClass: temperatureSensor, EventType: temperature, ID: {d0b6c4be-339e-4b0f-a234-0611b7565395}) ----------- -The name of the StateType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor - Temperatur - - - Temperature changed - The name of the EventType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor - Temperatur geändert - - - Turn on or off - The name of the ActionType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the ActionType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the ActionType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation - Schalte ein oder aus - - - Turned on or off - The name of the EventType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the EventType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the EventType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation - Ein- oder Ausgeschalten - - - Venetian blind - The name of the ThingClass ({e6b96ced-8d50-45da-91c8-792d364d2795}) - Jalousie - - - nymea - The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) - nymea - - - Energy - The name of the ParamType (ThingClass: smartMeter, EventType: totalEnergyConsumed, ID: {5821edb7-e6cb-4e5a-9d0b-3375126d3367}) ----------- -The name of the StateType ({5821edb7-e6cb-4e5a-9d0b-3375126d3367}) of ThingClass smartMeter - Energie - - - Energy changed - The name of the EventType ({5821edb7-e6cb-4e5a-9d0b-3375126d3367}) of ThingClass smartMeter - Energie geändert - - - Impulse/kWh - The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {c361732b-68eb-447e-a434-e84031231871}) - Impulse/kWh - - - Impulse input - The name of the ParamType (ThingClass: smartMeter, ActionType: impulseInput, ID: {9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) ----------- -The name of the ParamType (ThingClass: smartMeter, EventType: impulseInput, ID: {9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) ----------- -The name of the StateType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - Impulseingang - - - Impulse input changed - The name of the EventType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - Impulseingang geändert - - - Set impulse input - The name of the ActionType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - Setze Impulseingang - - - Timeframe for power calculation - The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {73c9acc3-8f76-40d7-a79b-a1f08bb308d4}) - Zeitfenster für Leistungsberechnung - - - Impulse based energy meter - The name of the ThingClass ({c3123967-f741-4fe1-a0d4-9a3e405d7e52}) - Impulsbasierter Energiezähler - - - Angle end to end time [ms] - The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {6c8340bf-7fd3-43e3-a75b-dfa2f6426e11}) - Winkel Endlage zu Endlage dauer [ms] - - - Closing duration [ms] - The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {4c0bf07d-aaab-4f67-af65-00ceaefbaa84}) ----------- -The name of the ParamType (ThingClass: extendedBlind, Type: settings, ID: {27a95b8d-7f97-441b-a3be-0646c517cb06}) - Schließzeit [ms] - - - Garage door with position control - The name of the ThingClass ({7341e689-4495-4422-851a-3e7c790394b8}) - Garagentor mit Lageeinstellung - - - Generic blind with position control - The name of the ThingClass ({40aa9f3c-a23c-4f7f-8786-fcf3554f3e19}) - Generisches Rollo mit Lageneinstellung - - - Impulse - The name of the ParamType (ThingClass: impulseGaragedooor, EventType: impulse, ID: {5ccaf0aa-01a4-441f-b6ca-18940da096a5}) ----------- -The name of the StateType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor - Impuls - - - Impulse based garage door - The name of the ThingClass ({d6699a12-f4a6-4c50-951c-f4f1cd0501dc}) - Impulsgesteuertes Garagentor - - - Impulse changed - The name of the EventType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor - Impuls geändert - - - Impulse duration - The name of the ParamType (ThingClass: impulseGaragedooor, Type: settings, ID: {962b356c-e975-4d33-b114-10f655eaf74c}) - Impulsdauer - - - Open position - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, ActionType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) ----------- -The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) ----------- -The name of the StateType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - Position offen - - - Open position changed - The name of the EventType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - Position offen geändert - - - Opening duration [ms] - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, Type: settings, ID: {04fb7724-a870-4df9-a79e-fab693931238}) - Öffnungsdauer [ms] - - - Operate - The name of the ActionType ({ff5461c6-70fc-435e-8424-96fa59ed321e}) of ThingClass impulseGaragedooor - Betätigen - - - Set open position - The name of the ActionType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - Setze Position offen - - - Simple garage door - The name of the ThingClass ({572403b1-bc22-4620-8170-53147a546033}) - Einfaches Garagentor - - - State - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: state, ID: {0cc74edb-7116-47cf-953a-409933f26557}) ----------- -The name of the StateType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor - Status - - - State changed - The name of the EventType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor - Status geändert - - - CO2 - The name of the ParamType (ThingClass: co2Sensor, EventType: co2, ID: {755c4c7f-093e-41dd-a38d-9ee18c9890d6}) ----------- -The name of the StateType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor - CO2 - - - CO2 changed - The name of the EventType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor - CO2 geändert - - - Generic CO2 sensor - The name of the ThingClass ({a58a2dae-4148-4a4d-ab34-2a11124454a0}) - Generischer CO2-Sensor - - - Generic pressure sensor - The name of the ThingClass ({9a8d804b-d1dc-450a-8c41-be491e5cdda0}) - Generischer Drucksensor - - - Maximum CO2 - The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a3029bee-8b13-4aed-8ebd-eaceb603f8ef}) - Maximum CO2 - - - Maximum pressure - The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {06e21251-8b4f-44a1-8504-6b51f8526bd0}) - Maximaldruck - - - Minimum CO2 - The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a0d8a6ec-599a-4ded-ae03-2950561f0b72}) - Minimum CO2 - - - Minimum pressure - The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {035e2619-f9c2-4e8f-95dd-f124ad9402d0}) - Minimaldruck - - - Pressure - The name of the ParamType (ThingClass: pressureSensor, EventType: pressure, ID: {e645a979-1465-4592-b8b0-f4c123db0800}) ----------- -The name of the StateType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor - Druck - - - Pressure changed - The name of the EventType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor - Druck geändert - - - Generic thermostat - The name of the ThingClass ({6a34ba99-e5ec-4fc9-a61f-695ed8573fa1}) - Generisches Thermostat - - - Set target temperature - The name of the ActionType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - Setze Zieltemperatur - - - Target temperature - The name of the ParamType (ThingClass: thermostat, ActionType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) ----------- -The name of the StateType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - Zieltemperatur - - - Target temperature changed - The name of the EventType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - Zieltemperature geändert - - - Set temperature sensor input - The name of the ActionType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - Setze Temperatursensoreingang - - - Temperature difference - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {64bf308f-a543-4e02-b787-1a1714c1f978}) - Temperaturdifferenz - - - Temperature sensor input - The name of the ParamType (ThingClass: thermostat, ActionType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) ----------- -The name of the StateType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - Temperatursensoreingang - - - Temperature sensor input changed - The name of the EventType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - Temperatursensoreingang geändert - - - Operating mode - The name of the ParamType (ThingClass: sgReady, ActionType: operatingMode, ID: {85667640-d719-4be4-a5fa-e41193eea162}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: operatingMode, ID: {85667640-d719-4be4-a5fa-e41193eea162}) ----------- -The name of the StateType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - Betriebszustand - - - Operating mode changed - The name of the EventType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - Betriebszustand geändert - - - Operating mode description - The name of the ParamType (ThingClass: sgReady, EventType: operatingModeDescription, ID: {b421d098-f6e9-40e2-b536-58acdb3a49fe}) ----------- -The name of the StateType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady - Betriebszustandsbeschreibung - - - Operating mode description changed - The name of the EventType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady - Betriebszustandsbeschreibung geändert - - - Relay 1 - The name of the ParamType (ThingClass: sgReady, ActionType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) ----------- -The name of the StateType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - Relais 1 - - - Relay 1 changed - The name of the EventType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - Relais 1 geändert - - - Relay 2 - The name of the ParamType (ThingClass: sgReady, ActionType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) ----------- -The name of the StateType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - Relais 2 - - - Relay 2 changed - The name of the EventType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - Relais 2 geändert - - - SG-Ready - The name of the ThingClass ({83cf138d-02dc-4015-9b03-6360c2f3cfb1}) - SG-Ready - - - Set operating mode - The name of the ActionType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - Setze Betriebszustand - - - Set relay 1 - The name of the ActionType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - Setze Relais 1 - - - Set relay 2 - The name of the ActionType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - Setze Relais 2 - - - Closed - The name of the ParamType (ThingClass: doorSensor, ActionType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) ----------- -The name of the ParamType (ThingClass: doorSensor, EventType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) ----------- -The name of the StateType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - Geschlossen - - - Set open or closed - The name of the ActionType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - Setze offen oder geschlossen - - - Generic light sensor - The name of the ThingClass ({d4d873fd-f0fc-433f-b615-91c1506a1890}) - Generischer Lichtsensor - - - Light intensity - The name of the ParamType (ThingClass: lightSensor, EventType: lightIntensity, ID: {fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) ----------- -The name of the StateType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor - Helligkeit - - - Light intensity changed - The name of the EventType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor - Helligkeit geändert - - - Maximum Lux - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {7fe74404-d7f0-41af-a8d4-dd1bda27f752}) - Höchster Lux-Wert - - - Minimum Lux - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {6dea7384-b079-443b-8cc2-1479138fa212}) - Tiefster Lux-Wert - - - Cooler on/off - The name of the ParamType (ThingClass: cooling, ActionType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) ----------- -The name of the ParamType (ThingClass: cooling, EventType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) ----------- -The name of the StateType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - Kühlung an/aus - - - Cooler turned on/off - The name of the EventType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - Kühlung ein- oder ausgeschaltet - - - Cooling On/off - The name of the ParamType (ThingClass: thermostat, ActionType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) ----------- -The name of the StateType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - Kühlung ein/aus - - - Cooling turned on/off - The name of the EventType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - Kühlung ein- oder ausgeschaltet - - - Generic cooler - The name of the ThingClass ({09edbc07-d382-48a4-9b16-99992014aff9}) - Generische Kühlung - - - Generic presence sensor - The name of the ThingClass ({339a0c54-4086-404f-8d36-bcf20621b785}) - Generischer Anwesenheitssensor - - - Heating On/off - The name of the ParamType (ThingClass: thermostat, ActionType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) ----------- -The name of the StateType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - Heizung ein/aus - - - Heating turned on/off - The name of the EventType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - Heizung ein- oder ausgeschaltet - - - Last seen time - The name of the ParamType (ThingClass: presenceSensor, EventType: lastSeenTime, ID: {be4842cb-140c-425f-9630-8bb19fdb943e}) ----------- -The name of the StateType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor - Zuletzt gesehen - - - Last seen time changed - The name of the EventType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor - Zuletzt gesehen geändert - - - Presence detected - The name of the ParamType (ThingClass: presenceSensor, ActionType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) ----------- -The name of the ParamType (ThingClass: presenceSensor, EventType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) ----------- -The name of the StateType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - Anwesenheit erkannt - - - Presense changed - The name of the EventType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - Anwesenheit geändert - - - Set presence - The name of the ActionType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - Setze Anwesenheit - - - Turn cooler on/off - The name of the ActionType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - Kühlung ein- oder ausschalten - - - Turn cooling on/off - The name of the ActionType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - Kühlung ein- oder ausschalten - - - Turn heating on/off - The name of the ActionType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - Heizung ein- oder ausschalten - - - Opened or closed - The name of the EventType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - Geöffnet oder geschlossen - - - Battery critical - The name of the ParamType (ThingClass: battery, EventType: batteryCritical, ID: {e95dc037-002d-40a2-8c15-cd5489bd354a}) ----------- -The name of the StateType ({e95dc037-002d-40a2-8c15-cd5489bd354a}) of ThingClass battery - Batterieladung kritisch - - - Battery level - The name of the ParamType (ThingClass: car, ActionType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) ----------- -The name of the ParamType (ThingClass: car, EventType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) ----------- -The name of the StateType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the ParamType (ThingClass: battery, EventType: batteryLevel, ID: {d37eed4a-befc-40d4-b435-40a761f99314}) ----------- -The name of the StateType ({d37eed4a-befc-40d4-b435-40a761f99314}) of ThingClass battery - Batterieladung - - - Battery level changed - The name of the EventType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the EventType ({d37eed4a-befc-40d4-b435-40a761f99314}) of ThingClass battery - Batterieladung geändert - - - Battery level control - The name of the ParamType (ThingClass: battery, ActionType: batteryLevelControl, ID: {3336f0c2-158b-4353-b74f-f1bb9c4e8447}) ----------- -The name of the ParamType (ThingClass: battery, EventType: batteryLevelControl, ID: {3336f0c2-158b-4353-b74f-f1bb9c4e8447}) ----------- -The name of the StateType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - Batterieladungssteuerung - - - Battery level control changed - The name of the EventType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - Batterieladungssteuerung geändert - - - Charging - The name of the ParamType (ThingClass: battery, ActionType: charging, ID: {a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) ----------- -The name of the ParamType (ThingClass: battery, EventType: charging, ID: {a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) ----------- -The name of the StateType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - Ladend - - - Generic battery - The name of the ThingClass ({81418556-cae3-4803-aa0c-9c4b3304a3eb}) - Generische Batterie - - - Critical battery level - The name of the ParamType (ThingClass: battery, Type: settings, ID: {8d875cb7-3a14-42d1-bf1b-759e5fd95a8f}) - Kritischer Batteriewert - - - Battery entered or left critical state - The name of the EventType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car ----------- -The name of the EventType ({e95dc037-002d-40a2-8c15-cd5489bd354a}) of ThingClass battery - Batterieladung kritisch geändert - - - Charging started or stopped - The name of the EventType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - Laden gestartet oder beendet - - - Set battery level - The name of the ActionType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the ActionType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - Setze Batterieladung - - - Set charging - The name of the ActionType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - Setze Laden - - - Analog input - The name of the ParamType (ThingClass: generic, ActionType: analogInput, ID: {810fcd3c-7854-4bb1-82f6-1403ba54875e}) ----------- -The name of the ParamType (ThingClass: generic, EventType: analogInput, ID: {810fcd3c-7854-4bb1-82f6-1403ba54875e}) ----------- -The name of the StateType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - Analoger Eingang - - - Analog input changed - The name of the EventType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - Analoger Eingang geändert - - - Analog output - The name of the ParamType (ThingClass: generic, ActionType: analogOutput, ID: {de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) ----------- -The name of the ParamType (ThingClass: generic, EventType: analogOutput, ID: {de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) ----------- -The name of the StateType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - Analoger Ausgang - - - Analog output changed - The name of the EventType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - Analoger Ausgang geändret - - - Digital input - The name of the ParamType (ThingClass: generic, ActionType: digitalInput, ID: {3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) ----------- -The name of the ParamType (ThingClass: generic, EventType: digitalInput, ID: {3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) ----------- -The name of the StateType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - Digitaler Eingang - - - Digital input changed - The name of the EventType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - Digitaler Eingang geändert - - - Digital output - The name of the ParamType (ThingClass: generic, ActionType: digitalOutput, ID: {605b4d8e-71a7-441e-900a-e07c305acd93}) ----------- -The name of the ParamType (ThingClass: generic, EventType: digitalOutput, ID: {605b4d8e-71a7-441e-900a-e07c305acd93}) ----------- -The name of the StateType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - Digitaler Ausgang - - - Digital output changed - The name of the EventType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - Digitaler Ausgang geändert - - - Generic thing - The name of the ThingClass ({f5c02d35-b06e-4950-8238-847d50cabfdf}) - Generisches "Thing" - - - Set analog input - The name of the ActionType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - Setze Analogen Eingang - - - Set analog output - The name of the ActionType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - Setze analogen Ausgang - - - Set digital input - The name of the ActionType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - Setze digitalen Eingang - - - Set digital output - The name of the ActionType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - Setze digitalen Ausgang - - - Set string state - The name of the ActionType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - Setze Zeichenkette - - - String state - The name of the ParamType (ThingClass: generic, ActionType: stringState, ID: {f477e227-0d2d-4d88-a545-7dedf36266d5}) ----------- -The name of the ParamType (ThingClass: generic, EventType: stringState, ID: {f477e227-0d2d-4d88-a545-7dedf36266d5}) ----------- -The name of the StateType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - Zeichenkette - - - String state changed - The name of the EventType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - Zeichenkette geändert - - - Air flow rate - The name of the ParamType (ThingClass: ventilationFlow, ActionType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) ----------- -The name of the ParamType (ThingClass: ventilationFlow, EventType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) ----------- -The name of the StateType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - Luftfluß - - - Air flow rate changed - The name of the EventType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - Luftfluß geändert - - - Generic ventilation with flow control - The name of the ThingClass ({a7eec5f7-3cc3-4edb-baa7-1f6b6f935bf8}) - Generische Lüftung mit Luftfluß-Regelung - - - Set air flow rate - The name of the ActionType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - Luftfluß ändern - - - CO level - The name of the ParamType (ThingClass: coSensor, EventType: co, ID: {9eebe9d2-b34b-4847-bc25-109e2b8cab24}) ----------- -The name of the StateType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor - CO Wert - - - CO level changed - The name of the EventType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor - CO Wert geändert - - - Current Power usage - The name of the ParamType (ThingClass: smartMeter, EventType: currentPower, ID: {5983d714-5f80-42d8-bee2-9228b6382b3b}) ----------- -The name of the StateType ({5983d714-5f80-42d8-bee2-9228b6382b3b}) of ThingClass smartMeter - Aktueller Energieverbrauch - - - Current Power usage changed - The name of the EventType ({5983d714-5f80-42d8-bee2-9228b6382b3b}) of ThingClass smartMeter - Aktueller Energieverbrauch geändert - - - Gas level - The name of the ParamType (ThingClass: gasSensor, EventType: gas, ID: {5135648f-57b7-44b0-b9d0-c5accad09356}) ----------- -The name of the StateType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor - Gaswert - - - Gas level changed - The name of the EventType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor - Gaswert geändert - - - Generic CO sensor - The name of the ThingClass ({262a29b2-b5df-4ee2-822c-e672f50d97b6}) - Generischer CO Sensor - - - Generic O2 sensor - The name of the ThingClass ({a8cf20ec-132b-4f6f-b5ec-73dc2f873b43}) - Generischer O2 Sensor - - - Generic ORP sensor - The name of the ThingClass ({3edeec39-ab9d-4697-90cc-0bba089384cf}) - Generischer ORP Sensor - - - Generic flammable gas sensor - The name of the ThingClass ({25c6725f-5c15-485b-9ec4-cb0e11ab6b32}) - Generischer Sensor für entflammbare Gase - - - Gerneric water sensor - The name of the ThingClass ({09b9cb86-f551-4efe-9a7d-2f7624e9510f}) - Generischer Wassersensor - - - Maximum CO - The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e9def195-1b67-4a1b-8030-cbbc6209d52e}) - Maximaler CO Wert - - - Maximum input ORP value - The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {bd0774c9-1b89-49ce-b0f8-66ff26ca10db}) - Minimaler ORP Eingangswert - - - Maximum input value - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {4e228f9b-8631-4643-8375-3d8d76d12e9c}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {198847f6-a188-42b0-9e0b-15587eaabbed}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8889e45-59e5-4cc4-b228-611f8f19f531}) - Maximaler Eingangswert - - - Maximum value - The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {51f4a830-3ef9-4fa2-b36b-5976f724f8a1}) - Maximaler Wert - - - Minimum CO - The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e850b044-fd70-446c-a943-3c88407425f5}) - Minimaler CO Wert - - - Minimum input value - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {16ea3cf2-46fd-40a3-88bf-21a2bb7cbabe}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {58e84041-d451-44a2-972e-13a79b449b58}) ----------- -The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {396bf3f9-a3fc-44c3-90f8-b316670116a7}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8ff2e16-e06c-4b1e-839a-a06691a12d64}) - Minimaler Eingangswert - - - Minimum value - The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {480945ea-6262-408d-b799-cbff905a40db}) - Minimaler Wert - - - O2 saturation - The name of the ParamType (ThingClass: o2Sensor, EventType: o2saturation, ID: {a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) ----------- -The name of the StateType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor - O2 Sättigung - - - O2 saturation changed - The name of the EventType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor - O2 Sättigung geändert - - - ORP - The name of the ParamType (ThingClass: orpSensor, EventType: orp, ID: {e5ed3535-2e5d-412e-85f8-782cbccd7731}) ----------- -The name of the StateType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor - ORP - - - ORP changed - The name of the EventType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor - ORP Wert geändert - - - PH - The name of the ParamType (ThingClass: phSensor, EventType: ph, ID: {743514b1-8018-4525-b87a-c5f414146ff2}) ----------- -The name of the StateType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor - PH - - - PH changed - The name of the EventType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor - PH Wert geändert - - - PH sensor - The name of the ThingClass ({e2934fa1-59c3-4de8-82f2-66181136085c}) - PH Sensor - - - Set water detected - The name of the ActionType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor - Setze Wasser erkannt - - - Water detected - The name of the ParamType (ThingClass: waterSensor, ActionType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) ----------- -The name of the ParamType (ThingClass: waterSensor, EventType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) ----------- -The name of the EventType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor ----------- -The name of the StateType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor - Wasser erkannt - - - Battery level critical - The name of the ParamType (ThingClass: car, EventType: batteryCritical, ID: {d33982d6-6467-4281-b448-68c1b1db088d}) ----------- -The name of the StateType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car - Batterieladung kritisch - - - Capacity - The name of the ParamType (ThingClass: car, ActionType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) ----------- -The name of the ParamType (ThingClass: car, EventType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) ----------- -The name of the StateType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - Kapazität - - - Capacity changed - The name of the EventType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - Kapazität geändert - - - Generic electric car - The name of the ThingClass ({dbe0a9ff-94ba-4a94-ae52-51da3f05c717}) - Generisches Elektroauto - - - Set capacity - The name of the ActionType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - Setze Kapazität - - - Generic door or window sensor - The name of the ThingClass ({2d936f56-48ee-4be1-9b3e-28a335ad8085}) - Generischer Tür- oder Fenstersensor - - - Generic water level sensor - The name of the ThingClass ({f1576df0-fb45-4bf0-89fa-a83c4118c326}) - - - - Tank capactity - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {5e98e8d2-d849-46c5-b25a-d54f184ea4c7}) - - - - Water level - The name of the ParamType (ThingClass: waterLevelSensor, EventType: waterLevel, ID: {07563165-e42d-4d0f-ac60-31cdd19170f2}) ----------- -The name of the StateType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor - - - - Water level changed - The name of the EventType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor - - - - - IntegrationPluginGenericThings - - Invalid closing or angle time - Ungültige Schließ- oder Winkelstellzeit - - - diff --git a/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts b/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts deleted file mode 100644 index 0a2046c..0000000 --- a/genericthings/translations/b3188696-2585-4806-bf98-30ab576ce5c8-en_US.ts +++ /dev/null @@ -1,1590 +0,0 @@ - - - - - GenericThings - - Accuracy (decimal places) - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {f800988f-1ad5-4ffb-9aa8-70ef17614966}) ----------- -The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {1c7465b1-490d-43db-bb67-a179a6923a57}) ----------- -The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {236831a8-a455-4e38-a9cd-eabbebaa3f67}) ----------- -The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {9c8a9553-7b68-4b58-a8f1-3c6b591998c0}) ----------- -The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {021a17d8-9e5e-4dd6-835d-1a3e1ffd6b23}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {d79701ac-1619-42d8-b10f-a55e8e2ab3f1}) ----------- -The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {1f218ad8-652a-4bda-987d-3e183ff040b2}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {bb41de73-31d0-4b21-8f80-14467120aae4}) ----------- -The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3c967a68-9951-4c9a-b019-79b913e762b6}) ----------- -The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {38064841-6121-4862-a639-08fb0b778511}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {3b543c3a-1fc0-45b5-8c07-600a6045f82e}) - - - - Angle - The name of the ParamType (ThingClass: venetianBlind, ActionType: angle, ID: {fcb700c4-5da8-4385-85b0-6616e807974e}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: angle, ID: {fcb700c4-5da8-4385-85b0-6616e807974e}) ----------- -The name of the StateType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - - - - Angle changed - The name of the EventType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - - - - Close - The name of the ActionType ({2420fcdb-03d3-4edb-aa89-e3b93c7d6d18}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({1111c0ed-69b6-480c-9fd5-15292600d4f4}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({cf5303f1-67c7-4cef-b11c-eb9de6fc8a87}) of ThingClass shutter ----------- -The name of the ActionType ({1c71f050-f6cb-4929-9c9d-7c262f77c143}) of ThingClass venetianBlind ----------- -The name of the ActionType ({97d6351d-7440-47f3-bdba-a31bb15368ac}) of ThingClass extendedBlind ----------- -The name of the ActionType ({86e9cf21-7487-47c4-b4be-4a940d7235fb}) of ThingClass blind ----------- -The name of the ActionType ({53b5ba77-9a34-4cd6-ad24-fb01fc465f98}) of ThingClass awning - - - - Closing output - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: closingOutput, ID: {e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) ----------- -The name of the StateType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: simpleGaragedoor, EventType: closingOutput, ID: {44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) ----------- -The name of the StateType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor ----------- -The name of the ParamType (ThingClass: shutter, ActionType: closingOutput, ID: {1c35df0e-4c41-455f-893a-0145377952a0}) ----------- -The name of the ParamType (ThingClass: shutter, EventType: closingOutput, ID: {1c35df0e-4c41-455f-893a-0145377952a0}) ----------- -The name of the StateType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, ActionType: closingOutput, ID: {84dd2fa1-85fe-47f3-9e32-e6083432d39c}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: closingOutput, ID: {84dd2fa1-85fe-47f3-9e32-e6083432d39c}) ----------- -The name of the StateType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: closingOutput, ID: {1a4a5839-a30d-4239-a124-63bfdc74a8f6}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: closingOutput, ID: {1a4a5839-a30d-4239-a124-63bfdc74a8f6}) ----------- -The name of the StateType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, ActionType: closingOutput, ID: {9b673430-572d-4a9c-85d3-dafadbe541cd}) ----------- -The name of the ParamType (ThingClass: blind, EventType: closingOutput, ID: {9b673430-572d-4a9c-85d3-dafadbe541cd}) ----------- -The name of the StateType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, ActionType: closingOutput, ID: {59bfd575-709f-4e43-9726-de26e6d4ca8b}) ----------- -The name of the ParamType (ThingClass: awning, EventType: closingOutput, ID: {59bfd575-709f-4e43-9726-de26e6d4ca8b}) ----------- -The name of the StateType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - - - - Closing output changed - The name of the EventType ({e1c14bcd-6131-494b-8dd1-46738e9c8f5e}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({44ef060a-e6fc-4f33-84d2-b24ac7d31ff1}) of ThingClass simpleGaragedoor ----------- -The name of the EventType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the EventType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the EventType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the EventType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the EventType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - - - - Generic Things - The name of the plugin GenericThings ({b3188696-2585-4806-bf98-30ab576ce5c8}) - - - - Generic awning - The name of the ThingClass ({9e69585f-90ba-44e4-ad90-5b4bffbe345a}) - - - - Generic blind - The name of the ThingClass ({17ee3657-6ad8-4ae2-8959-3cf66cec8d13}) - - - - Generic heating - The name of the ThingClass ({392854c4-3d14-4cf8-96cd-d933526bd197}) - - - - Generic humidity sensor - The name of the ThingClass ({d295bc64-773c-42a9-83e2-80db5fa0d1ce}) - - - - Generic irrigation - The name of the ThingClass ({d013b980-20d5-4791-9c4f-b411c39241d7}) - - - - Generic light - The name of the ThingClass ({c50d3216-f307-4f9f-8190-4391510c385c}) - - - - Generic power socket - The name of the ThingClass ({4e7261af-a27b-4446-8346-914ea59f7547}) - - - - Generic power switch - The name of the ThingClass ({57daa147-dd6f-4673-a757-d8f01a2054c7}) - - - - Generic shutter - The name of the ThingClass ({7917c2e7-d7d2-4c47-a38d-41f7dd7693d9}) - - - - Generic soil moisture sensor - The name of the ThingClass ({33e610cf-ff30-481b-9f0b-d6857bcd41a5}) - - - - Generic temperature sensor - The name of the ThingClass ({cf3d65db-6f68-457b-968c-cfb66cbd5311}) - - - - Generic ventilation - The name of the ThingClass ({24af8dd3-ddf0-47f0-bf09-70fdfd8dceab}) - - - - Humidity - The name of the ParamType (ThingClass: humiditySensor, EventType: humidity, ID: {925225d9-2965-444a-9c42-63c2873700fb}) ----------- -The name of the StateType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor - - - - Humidity changed - The name of the EventType ({925225d9-2965-444a-9c42-63c2873700fb}) of ThingClass humiditySensor - - - - Input value - The name of the ParamType (ThingClass: waterLevelSensor, ActionType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) ----------- -The name of the ParamType (ThingClass: waterLevelSensor, EventType: input, ID: {d344887d-da5d-4742-83bd-608754b2d0aa}) ----------- -The name of the StateType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the ParamType (ThingClass: lightSensor, ActionType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) ----------- -The name of the ParamType (ThingClass: lightSensor, EventType: input, ID: {520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) ----------- -The name of the StateType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the ParamType (ThingClass: gasSensor, ActionType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) ----------- -The name of the ParamType (ThingClass: gasSensor, EventType: input, ID: {e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) ----------- -The name of the StateType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the ParamType (ThingClass: co2Sensor, ActionType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) ----------- -The name of the ParamType (ThingClass: co2Sensor, EventType: input, ID: {7dc765f8-fa9b-4199-8f21-49ed452f226d}) ----------- -The name of the StateType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the ParamType (ThingClass: coSensor, ActionType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) ----------- -The name of the ParamType (ThingClass: coSensor, EventType: input, ID: {cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) ----------- -The name of the StateType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the ParamType (ThingClass: pressureSensor, ActionType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) ----------- -The name of the ParamType (ThingClass: pressureSensor, EventType: input, ID: {c320577c-371a-442b-ac80-b692ff2064c9}) ----------- -The name of the StateType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the ParamType (ThingClass: o2Sensor, ActionType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) ----------- -The name of the ParamType (ThingClass: o2Sensor, EventType: input, ID: {7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) ----------- -The name of the StateType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the ParamType (ThingClass: orpSensor, ActionType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) ----------- -The name of the ParamType (ThingClass: orpSensor, EventType: input, ID: {020ff04f-a157-4925-9c55-2b45389208fc}) ----------- -The name of the StateType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the ParamType (ThingClass: phSensor, ActionType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) ----------- -The name of the ParamType (ThingClass: phSensor, EventType: input, ID: {614a039b-9ed9-4b62-9c74-01ba4ac42f16}) ----------- -The name of the StateType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the ParamType (ThingClass: moistureSensor, ActionType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) ----------- -The name of the ParamType (ThingClass: moistureSensor, EventType: input, ID: {ce64a425-d990-4fc1-966b-be6de445792b}) ----------- -The name of the StateType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the ParamType (ThingClass: humiditySensor, ActionType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) ----------- -The name of the ParamType (ThingClass: humiditySensor, EventType: input, ID: {a8223e65-e704-4f84-9bbe-d8fc42597047}) ----------- -The name of the StateType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the ParamType (ThingClass: temperatureSensor, ActionType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, EventType: input, ID: {fed37466-1264-4ac1-84fd-aff3a1f7ff04}) ----------- -The name of the StateType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - - - - Input value changed - The name of the EventType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the EventType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the EventType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the EventType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the EventType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the EventType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the EventType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the EventType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the EventType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the EventType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the EventType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the EventType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - - - - Maximum humidity - The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {10afc387-68d1-47ea-a816-0d1acad47b3c}) - - - - Maximum moisture - The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {3426817d-065e-4cfc-aa21-bb434de684d6}) - - - - Maximum temperature - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {85608dd5-7e67-4c98-9e62-b97411681048}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {8b5947ab-127f-4995-853b-eeeb628811e3}) - - - - Minimum humidity - The name of the ParamType (ThingClass: humiditySensor, Type: settings, ID: {0218ffa9-3d49-4b25-a59f-c8831f190432}) - - - - Minimum moisture - The name of the ParamType (ThingClass: moistureSensor, Type: settings, ID: {32153786-f1ae-4aa4-a84c-b9054102eb92}) - - - - Minimum temperature - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {67451c97-50e1-4ea6-ac43-4386fbd26698}) ----------- -The name of the ParamType (ThingClass: temperatureSensor, Type: settings, ID: {c86ae5d3-9335-4b6e-8231-bf3ed6670dff}) - - - - Moving - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: moving, ID: {963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) ----------- -The name of the StateType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: moving, ID: {6234c07e-4200-4f2c-8cbd-bff24c38c243}) ----------- -The name of the StateType ({6234c07e-4200-4f2c-8cbd-bff24c38c243}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: moving, ID: {941d1e1f-8dd7-4493-812f-6cefefd88c2e}) ----------- -The name of the StateType ({941d1e1f-8dd7-4493-812f-6cefefd88c2e}) of ThingClass extendedBlind - - - - Moving changed - The name of the EventType ({963bed3d-2ccb-4dd0-b609-c7e9f25d32d6}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({6234c07e-4200-4f2c-8cbd-bff24c38c243}) of ThingClass venetianBlind ----------- -The name of the EventType ({941d1e1f-8dd7-4493-812f-6cefefd88c2e}) of ThingClass extendedBlind - - - - Open - The name of the ActionType ({4a3a3b88-47e9-436f-86be-b5955f3fc2f7}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({3edb25af-ad51-495b-9ac9-ab97669339b7}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({9deb662d-2378-4345-a898-8742d41e43c1}) of ThingClass shutter ----------- -The name of the ActionType ({3e728e50-3d45-4035-b215-1e604cf3159b}) of ThingClass venetianBlind ----------- -The name of the ActionType ({5a7599fa-8351-4ed6-9b98-fa2f3be54304}) of ThingClass extendedBlind ----------- -The name of the ActionType ({120dc265-dbbb-4f19-9d31-c372c23479c0}) of ThingClass blind ----------- -The name of the ActionType ({979e9c51-5a93-4635-85e3-01874306b229}) of ThingClass awning - - - - Opening output - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: openingOutput, ID: {ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) ----------- -The name of the StateType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ParamType (ThingClass: simpleGaragedoor, EventType: openingOutput, ID: {fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) ----------- -The name of the StateType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor ----------- -The name of the ParamType (ThingClass: shutter, ActionType: openingOutput, ID: {cc547728-b309-4695-b355-49748ef2521c}) ----------- -The name of the ParamType (ThingClass: shutter, EventType: openingOutput, ID: {cc547728-b309-4695-b355-49748ef2521c}) ----------- -The name of the StateType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, ActionType: openingOutput, ID: {6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: openingOutput, ID: {6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) ----------- -The name of the StateType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: openingOutput, ID: {e559f077-e904-4bbc-8ec3-344b814d2eab}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: openingOutput, ID: {e559f077-e904-4bbc-8ec3-344b814d2eab}) ----------- -The name of the StateType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, ActionType: openingOutput, ID: {b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) ----------- -The name of the ParamType (ThingClass: blind, EventType: openingOutput, ID: {b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) ----------- -The name of the StateType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, ActionType: openingOutput, ID: {4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) ----------- -The name of the ParamType (ThingClass: awning, EventType: openingOutput, ID: {4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) ----------- -The name of the StateType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - - - - Opening output changed - The name of the EventType ({ecc799c7-4d74-4d1f-94e5-2d74e77493ae}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the EventType ({fcd421eb-54f2-4195-bdef-ffa69e9dcc57}) of ThingClass simpleGaragedoor ----------- -The name of the EventType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the EventType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the EventType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the EventType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the EventType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - - - - Percentage - The name of the ParamType (ThingClass: venetianBlind, ActionType: percentage, ID: {33dc8019-336d-4d50-8d60-dff8508338ca}) ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: percentage, ID: {33dc8019-336d-4d50-8d60-dff8508338ca}) ----------- -The name of the StateType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, ActionType: percentage, ID: {181df603-d45f-4d3d-a358-97aa3e4ac0bd}) ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: percentage, ID: {181df603-d45f-4d3d-a358-97aa3e4ac0bd}) ----------- -The name of the StateType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - - - - Percentage changed - The name of the EventType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the EventType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - - - - Power - The name of the ParamType (ThingClass: ventilationFlow, ActionType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) ----------- -The name of the ParamType (ThingClass: ventilationFlow, EventType: power, ID: {adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) ----------- -The name of the StateType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the ParamType (ThingClass: ventilation, ActionType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) ----------- -The name of the ParamType (ThingClass: ventilation, EventType: power, ID: {846711b7-ea5a-4c66-a267-001c60406509}) ----------- -The name of the StateType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the ParamType (ThingClass: irrigation, ActionType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) ----------- -The name of the ParamType (ThingClass: irrigation, EventType: power, ID: {0212a287-c5ae-4644-8803-adfdd8caeb9a}) ----------- -The name of the StateType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation ----------- -The name of the ParamType (ThingClass: powerSwitch, ActionType: power, ID: {08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) ----------- -The name of the ParamType (ThingClass: powerSwitch, EventType: power, ID: {08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) ----------- -The name of the StateType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch ----------- -The name of the ParamType (ThingClass: heating, ActionType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) ----------- -The name of the ParamType (ThingClass: heating, EventType: power, ID: {409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) ----------- -The name of the StateType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the ParamType (ThingClass: light, ActionType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) ----------- -The name of the ParamType (ThingClass: light, EventType: power, ID: {8b6e4a67-6522-408b-b676-8d2f09ed2d54}) ----------- -The name of the StateType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the ParamType (ThingClass: socket, ActionType: power, ID: {018038d7-1d02-4b17-8fe3-babca044b087}) ----------- -The name of the ParamType (ThingClass: socket, EventType: power, ID: {018038d7-1d02-4b17-8fe3-babca044b087}) ----------- -The name of the StateType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - - - - Power changed - The name of the EventType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the EventType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the EventType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - - - - Power on/off - The name of the ActionType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch - - - - Powered on/off - The name of the EventType ({08087af6-6a3b-4e4a-ac6d-56f23ce63edf}) of ThingClass powerSwitch - - - - Set angle - The name of the ActionType ({fcb700c4-5da8-4385-85b0-6616e807974e}) of ThingClass venetianBlind - - - - Set closing output - The name of the ActionType ({1c35df0e-4c41-455f-893a-0145377952a0}) of ThingClass shutter ----------- -The name of the ActionType ({84dd2fa1-85fe-47f3-9e32-e6083432d39c}) of ThingClass venetianBlind ----------- -The name of the ActionType ({1a4a5839-a30d-4239-a124-63bfdc74a8f6}) of ThingClass extendedBlind ----------- -The name of the ActionType ({9b673430-572d-4a9c-85d3-dafadbe541cd}) of ThingClass blind ----------- -The name of the ActionType ({59bfd575-709f-4e43-9726-de26e6d4ca8b}) of ThingClass awning - - - - Set input value - The name of the ActionType ({d344887d-da5d-4742-83bd-608754b2d0aa}) of ThingClass waterLevelSensor ----------- -The name of the ActionType ({520e5d27-7d15-4d79-94cf-5d01f5a09ea8}) of ThingClass lightSensor ----------- -The name of the ActionType ({e3eb500a-ac00-426c-932a-dee4fd6fbcf5}) of ThingClass gasSensor ----------- -The name of the ActionType ({7dc765f8-fa9b-4199-8f21-49ed452f226d}) of ThingClass co2Sensor ----------- -The name of the ActionType ({cf3ec5ec-7098-47c5-9666-b3c52eba1b1d}) of ThingClass coSensor ----------- -The name of the ActionType ({c320577c-371a-442b-ac80-b692ff2064c9}) of ThingClass pressureSensor ----------- -The name of the ActionType ({7e74fca7-84d0-4f3e-9f26-4232b7b9f507}) of ThingClass o2Sensor ----------- -The name of the ActionType ({020ff04f-a157-4925-9c55-2b45389208fc}) of ThingClass orpSensor ----------- -The name of the ActionType ({614a039b-9ed9-4b62-9c74-01ba4ac42f16}) of ThingClass phSensor ----------- -The name of the ActionType ({ce64a425-d990-4fc1-966b-be6de445792b}) of ThingClass moistureSensor ----------- -The name of the ActionType ({a8223e65-e704-4f84-9bbe-d8fc42597047}) of ThingClass humiditySensor ----------- -The name of the ActionType ({fed37466-1264-4ac1-84fd-aff3a1f7ff04}) of ThingClass temperatureSensor - - - - Set opening output - The name of the ActionType ({cc547728-b309-4695-b355-49748ef2521c}) of ThingClass shutter ----------- -The name of the ActionType ({6041dacf-5303-4dc0-ba3c-7ecaa438f2dd}) of ThingClass venetianBlind ----------- -The name of the ActionType ({e559f077-e904-4bbc-8ec3-344b814d2eab}) of ThingClass extendedBlind ----------- -The name of the ActionType ({b2dbf25c-27e5-4f7e-a57d-2ef6d087fa2b}) of ThingClass blind ----------- -The name of the ActionType ({4bb951a4-ea23-4cf0-9269-41d2c4eaf5a4}) of ThingClass awning - - - - Set percentage - The name of the ActionType ({33dc8019-336d-4d50-8d60-dff8508338ca}) of ThingClass venetianBlind ----------- -The name of the ActionType ({181df603-d45f-4d3d-a358-97aa3e4ac0bd}) of ThingClass extendedBlind - - - - Set power - The name of the ActionType ({409b635e-a754-4b5c-b3f0-d1c5a0fb3f03}) of ThingClass heating ----------- -The name of the ActionType ({8b6e4a67-6522-408b-b676-8d2f09ed2d54}) of ThingClass light ----------- -The name of the ActionType ({018038d7-1d02-4b17-8fe3-babca044b087}) of ThingClass socket - - - - Soil moisture - The name of the ParamType (ThingClass: moistureSensor, EventType: moisture, ID: {7a62e1d2-92f2-424c-876c-870478a4b2bd}) ----------- -The name of the StateType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor - - - - Soil moisture changed - The name of the EventType ({7a62e1d2-92f2-424c-876c-870478a4b2bd}) of ThingClass moistureSensor - - - - Status - The name of the ParamType (ThingClass: shutter, EventType: status, ID: {6d6e72dc-4d2b-4ec1-82c2-54405a682711}) ----------- -The name of the StateType ({6d6e72dc-4d2b-4ec1-82c2-54405a682711}) of ThingClass shutter ----------- -The name of the ParamType (ThingClass: venetianBlind, EventType: status, ID: {6fb7826e-b6d8-42f8-b712-719496046436}) ----------- -The name of the StateType ({6fb7826e-b6d8-42f8-b712-719496046436}) of ThingClass venetianBlind ----------- -The name of the ParamType (ThingClass: extendedBlind, EventType: status, ID: {c2354d7e-198a-43ae-aa5f-c6710010c7e1}) ----------- -The name of the StateType ({c2354d7e-198a-43ae-aa5f-c6710010c7e1}) of ThingClass extendedBlind ----------- -The name of the ParamType (ThingClass: blind, EventType: status, ID: {5fdec1e0-51f6-48b9-b743-ba572504b2c1}) ----------- -The name of the StateType ({5fdec1e0-51f6-48b9-b743-ba572504b2c1}) of ThingClass blind ----------- -The name of the ParamType (ThingClass: awning, EventType: status, ID: {ff6f2565-2a2e-4d34-b10f-d3f73b676399}) ----------- -The name of the StateType ({ff6f2565-2a2e-4d34-b10f-d3f73b676399}) of ThingClass awning - - - - Status changed - The name of the EventType ({6d6e72dc-4d2b-4ec1-82c2-54405a682711}) of ThingClass shutter ----------- -The name of the EventType ({6fb7826e-b6d8-42f8-b712-719496046436}) of ThingClass venetianBlind ----------- -The name of the EventType ({c2354d7e-198a-43ae-aa5f-c6710010c7e1}) of ThingClass extendedBlind ----------- -The name of the EventType ({5fdec1e0-51f6-48b9-b743-ba572504b2c1}) of ThingClass blind ----------- -The name of the EventType ({ff6f2565-2a2e-4d34-b10f-d3f73b676399}) of ThingClass awning - - - - Stop - The name of the ActionType ({109c3eaf-26a0-4121-8be2-1363253178fd}) of ThingClass extendedStatefulGaragedoor ----------- -The name of the ActionType ({f346766f-44ee-452b-bb9c-e89ec0f56016}) of ThingClass simpleGaragedoor ----------- -The name of the ActionType ({db5f3332-1f4e-4f9e-84d2-93c5d7de315c}) of ThingClass shutter ----------- -The name of the ActionType ({6e3eeb5d-d7ed-4175-9795-e76451e0a00b}) of ThingClass venetianBlind ----------- -The name of the ActionType ({ab67e4bf-c7b6-489b-9b49-3e0a1c7d33ca}) of ThingClass extendedBlind ----------- -The name of the ActionType ({1a924c9a-5dcb-4b1c-8fd6-ab101098e007}) of ThingClass blind ----------- -The name of the ActionType ({555cafe4-bd12-42c6-bab1-8cd59af6468e}) of ThingClass awning - - - - Temperature - The name of the ParamType (ThingClass: temperatureSensor, EventType: temperature, ID: {d0b6c4be-339e-4b0f-a234-0611b7565395}) ----------- -The name of the StateType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor - - - - Temperature changed - The name of the EventType ({d0b6c4be-339e-4b0f-a234-0611b7565395}) of ThingClass temperatureSensor - - - - Turn on or off - The name of the ActionType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the ActionType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the ActionType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation - - - - Turned on or off - The name of the EventType ({adf9a8dd-da13-4070-a3bd-9d4be26ebcd1}) of ThingClass ventilationFlow ----------- -The name of the EventType ({846711b7-ea5a-4c66-a267-001c60406509}) of ThingClass ventilation ----------- -The name of the EventType ({0212a287-c5ae-4644-8803-adfdd8caeb9a}) of ThingClass irrigation - - - - Venetian blind - The name of the ThingClass ({e6b96ced-8d50-45da-91c8-792d364d2795}) - - - - nymea - The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6}) - - - - Energy - The name of the ParamType (ThingClass: smartMeter, EventType: totalEnergyConsumed, ID: {5821edb7-e6cb-4e5a-9d0b-3375126d3367}) ----------- -The name of the StateType ({5821edb7-e6cb-4e5a-9d0b-3375126d3367}) of ThingClass smartMeter - - - - Energy changed - The name of the EventType ({5821edb7-e6cb-4e5a-9d0b-3375126d3367}) of ThingClass smartMeter - - - - Impulse/kWh - The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {c361732b-68eb-447e-a434-e84031231871}) - - - - Impulse input - The name of the ParamType (ThingClass: smartMeter, ActionType: impulseInput, ID: {9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) ----------- -The name of the ParamType (ThingClass: smartMeter, EventType: impulseInput, ID: {9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) ----------- -The name of the StateType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - - - - Impulse input changed - The name of the EventType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - - - - Set impulse input - The name of the ActionType ({9cd7e5ca-f8f8-48d5-9785-911ae75158c3}) of ThingClass smartMeter - - - - Timeframe for power calculation - The name of the ParamType (ThingClass: smartMeter, Type: settings, ID: {73c9acc3-8f76-40d7-a79b-a1f08bb308d4}) - - - - Impulse based energy meter - The name of the ThingClass ({c3123967-f741-4fe1-a0d4-9a3e405d7e52}) - - - - Angle end to end time [ms] - The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {6c8340bf-7fd3-43e3-a75b-dfa2f6426e11}) - - - - CO2 - The name of the ParamType (ThingClass: co2Sensor, EventType: co2, ID: {755c4c7f-093e-41dd-a38d-9ee18c9890d6}) ----------- -The name of the StateType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor - - - - CO2 changed - The name of the EventType ({755c4c7f-093e-41dd-a38d-9ee18c9890d6}) of ThingClass co2Sensor - - - - Closing duration [ms] - The name of the ParamType (ThingClass: venetianBlind, Type: settings, ID: {4c0bf07d-aaab-4f67-af65-00ceaefbaa84}) ----------- -The name of the ParamType (ThingClass: extendedBlind, Type: settings, ID: {27a95b8d-7f97-441b-a3be-0646c517cb06}) - - - - Garage door with position control - The name of the ThingClass ({7341e689-4495-4422-851a-3e7c790394b8}) - - - - Generic CO2 sensor - The name of the ThingClass ({a58a2dae-4148-4a4d-ab34-2a11124454a0}) - - - - Generic blind with position control - The name of the ThingClass ({40aa9f3c-a23c-4f7f-8786-fcf3554f3e19}) - - - - Generic pressure sensor - The name of the ThingClass ({9a8d804b-d1dc-450a-8c41-be491e5cdda0}) - - - - Impulse - The name of the ParamType (ThingClass: impulseGaragedooor, EventType: impulse, ID: {5ccaf0aa-01a4-441f-b6ca-18940da096a5}) ----------- -The name of the StateType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor - - - - Impulse based garage door - The name of the ThingClass ({d6699a12-f4a6-4c50-951c-f4f1cd0501dc}) - - - - Impulse changed - The name of the EventType ({5ccaf0aa-01a4-441f-b6ca-18940da096a5}) of ThingClass impulseGaragedooor - - - - Impulse duration - The name of the ParamType (ThingClass: impulseGaragedooor, Type: settings, ID: {962b356c-e975-4d33-b114-10f655eaf74c}) - - - - Maximum CO2 - The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a3029bee-8b13-4aed-8ebd-eaceb603f8ef}) - - - - Maximum pressure - The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {06e21251-8b4f-44a1-8504-6b51f8526bd0}) - - - - Minimum CO2 - The name of the ParamType (ThingClass: co2Sensor, Type: settings, ID: {a0d8a6ec-599a-4ded-ae03-2950561f0b72}) - - - - Minimum pressure - The name of the ParamType (ThingClass: pressureSensor, Type: settings, ID: {035e2619-f9c2-4e8f-95dd-f124ad9402d0}) - - - - Open position - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, ActionType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) ----------- -The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: percentage, ID: {f9244c14-0bc9-49ce-90a5-437e66245594}) ----------- -The name of the StateType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - - - - Open position changed - The name of the EventType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - - - - Opening duration [ms] - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, Type: settings, ID: {04fb7724-a870-4df9-a79e-fab693931238}) - - - - Operate - The name of the ActionType ({ff5461c6-70fc-435e-8424-96fa59ed321e}) of ThingClass impulseGaragedooor - - - - Pressure - The name of the ParamType (ThingClass: pressureSensor, EventType: pressure, ID: {e645a979-1465-4592-b8b0-f4c123db0800}) ----------- -The name of the StateType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor - - - - Pressure changed - The name of the EventType ({e645a979-1465-4592-b8b0-f4c123db0800}) of ThingClass pressureSensor - - - - Set open position - The name of the ActionType ({f9244c14-0bc9-49ce-90a5-437e66245594}) of ThingClass extendedStatefulGaragedoor - - - - Simple garage door - The name of the ThingClass ({572403b1-bc22-4620-8170-53147a546033}) - - - - State - The name of the ParamType (ThingClass: extendedStatefulGaragedoor, EventType: state, ID: {0cc74edb-7116-47cf-953a-409933f26557}) ----------- -The name of the StateType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor - - - - State changed - The name of the EventType ({0cc74edb-7116-47cf-953a-409933f26557}) of ThingClass extendedStatefulGaragedoor - - - - Generic thermostat - The name of the ThingClass ({6a34ba99-e5ec-4fc9-a61f-695ed8573fa1}) - - - - Set target temperature - The name of the ActionType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - - - - Target temperature - The name of the ParamType (ThingClass: thermostat, ActionType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: targetTemperature, ID: {60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) ----------- -The name of the StateType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - - - - Target temperature changed - The name of the EventType ({60169ebf-c1e3-41ed-a1bb-4b858e93ec50}) of ThingClass thermostat - - - - Set temperature sensor input - The name of the ActionType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - - - - Temperature difference - The name of the ParamType (ThingClass: thermostat, Type: settings, ID: {64bf308f-a543-4e02-b787-1a1714c1f978}) - - - - Temperature sensor input - The name of the ParamType (ThingClass: thermostat, ActionType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: temperature, ID: {0f808803-0e63-47df-b024-9685998ba663}) ----------- -The name of the StateType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - - - - Temperature sensor input changed - The name of the EventType ({0f808803-0e63-47df-b024-9685998ba663}) of ThingClass thermostat - - - - Operating mode - The name of the ParamType (ThingClass: sgReady, ActionType: operatingMode, ID: {85667640-d719-4be4-a5fa-e41193eea162}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: operatingMode, ID: {85667640-d719-4be4-a5fa-e41193eea162}) ----------- -The name of the StateType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - - - - Operating mode changed - The name of the EventType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - - - - Operating mode description - The name of the ParamType (ThingClass: sgReady, EventType: operatingModeDescription, ID: {b421d098-f6e9-40e2-b536-58acdb3a49fe}) ----------- -The name of the StateType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady - - - - Operating mode description changed - The name of the EventType ({b421d098-f6e9-40e2-b536-58acdb3a49fe}) of ThingClass sgReady - - - - Relay 1 - The name of the ParamType (ThingClass: sgReady, ActionType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: relay1, ID: {d080466e-7271-441f-9916-1199a6668545}) ----------- -The name of the StateType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - - - - Relay 1 changed - The name of the EventType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - - - - Relay 2 - The name of the ParamType (ThingClass: sgReady, ActionType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) ----------- -The name of the ParamType (ThingClass: sgReady, EventType: relay2, ID: {caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) ----------- -The name of the StateType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - - - - Relay 2 changed - The name of the EventType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - - - - SG-Ready - The name of the ThingClass ({83cf138d-02dc-4015-9b03-6360c2f3cfb1}) - - - - Set operating mode - The name of the ActionType ({85667640-d719-4be4-a5fa-e41193eea162}) of ThingClass sgReady - - - - Set relay 1 - The name of the ActionType ({d080466e-7271-441f-9916-1199a6668545}) of ThingClass sgReady - - - - Set relay 2 - The name of the ActionType ({caf22937-fdf7-41e1-a87b-d11e66c4f4c6}) of ThingClass sgReady - - - - Closed - The name of the ParamType (ThingClass: doorSensor, ActionType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) ----------- -The name of the ParamType (ThingClass: doorSensor, EventType: closed, ID: {7f5fdc2b-7916-4e90-9c24-558162304f71}) ----------- -The name of the StateType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - - - - Set open or closed - The name of the ActionType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - - - - Generic light sensor - The name of the ThingClass ({d4d873fd-f0fc-433f-b615-91c1506a1890}) - - - - Light intensity - The name of the ParamType (ThingClass: lightSensor, EventType: lightIntensity, ID: {fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) ----------- -The name of the StateType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor - - - - Light intensity changed - The name of the EventType ({fe12ef32-9f2f-41cd-acb7-6b8e4acffa3b}) of ThingClass lightSensor - - - - Maximum Lux - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {7fe74404-d7f0-41af-a8d4-dd1bda27f752}) - - - - Minimum Lux - The name of the ParamType (ThingClass: lightSensor, Type: settings, ID: {6dea7384-b079-443b-8cc2-1479138fa212}) - - - - Cooler on/off - The name of the ParamType (ThingClass: cooling, ActionType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) ----------- -The name of the ParamType (ThingClass: cooling, EventType: power, ID: {918cfd2c-6692-4faa-acc6-18ebf93611ec}) ----------- -The name of the StateType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - - - - Cooler turned on/off - The name of the EventType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - - - - Cooling On/off - The name of the ParamType (ThingClass: thermostat, ActionType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: coolingOn, ID: {cab7d4bd-f612-4d12-b3a4-0649e189810f}) ----------- -The name of the StateType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - - - - Cooling turned on/off - The name of the EventType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - - - - Generic cooler - The name of the ThingClass ({09edbc07-d382-48a4-9b16-99992014aff9}) - - - - Generic presence sensor - The name of the ThingClass ({339a0c54-4086-404f-8d36-bcf20621b785}) - - - - Heating On/off - The name of the ParamType (ThingClass: thermostat, ActionType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) ----------- -The name of the ParamType (ThingClass: thermostat, EventType: heatingOn, ID: {1f6a0c39-4417-4e31-86db-9926cf81c345}) ----------- -The name of the StateType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - - - - Heating turned on/off - The name of the EventType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - - - - Last seen time - The name of the ParamType (ThingClass: presenceSensor, EventType: lastSeenTime, ID: {be4842cb-140c-425f-9630-8bb19fdb943e}) ----------- -The name of the StateType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor - - - - Last seen time changed - The name of the EventType ({be4842cb-140c-425f-9630-8bb19fdb943e}) of ThingClass presenceSensor - - - - Presence detected - The name of the ParamType (ThingClass: presenceSensor, ActionType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) ----------- -The name of the ParamType (ThingClass: presenceSensor, EventType: isPresent, ID: {22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) ----------- -The name of the StateType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - - - - Presense changed - The name of the EventType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - - - - Set presence - The name of the ActionType ({22c1eac6-9bb5-4cc1-ac0d-e3e1499edd3c}) of ThingClass presenceSensor - - - - Turn cooler on/off - The name of the ActionType ({918cfd2c-6692-4faa-acc6-18ebf93611ec}) of ThingClass cooling - - - - Turn cooling on/off - The name of the ActionType ({cab7d4bd-f612-4d12-b3a4-0649e189810f}) of ThingClass thermostat - - - - Turn heating on/off - The name of the ActionType ({1f6a0c39-4417-4e31-86db-9926cf81c345}) of ThingClass thermostat - - - - Opened or closed - The name of the EventType ({7f5fdc2b-7916-4e90-9c24-558162304f71}) of ThingClass doorSensor - - - - Battery critical - The name of the ParamType (ThingClass: battery, EventType: batteryCritical, ID: {e95dc037-002d-40a2-8c15-cd5489bd354a}) ----------- -The name of the StateType ({e95dc037-002d-40a2-8c15-cd5489bd354a}) of ThingClass battery - - - - Battery level - The name of the ParamType (ThingClass: car, ActionType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) ----------- -The name of the ParamType (ThingClass: car, EventType: batteryLevel, ID: {3f1cca10-8988-4ec6-b937-0775653cde12}) ----------- -The name of the StateType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the ParamType (ThingClass: battery, EventType: batteryLevel, ID: {d37eed4a-befc-40d4-b435-40a761f99314}) ----------- -The name of the StateType ({d37eed4a-befc-40d4-b435-40a761f99314}) of ThingClass battery - - - - Battery level changed - The name of the EventType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the EventType ({d37eed4a-befc-40d4-b435-40a761f99314}) of ThingClass battery - - - - Battery level control - The name of the ParamType (ThingClass: battery, ActionType: batteryLevelControl, ID: {3336f0c2-158b-4353-b74f-f1bb9c4e8447}) ----------- -The name of the ParamType (ThingClass: battery, EventType: batteryLevelControl, ID: {3336f0c2-158b-4353-b74f-f1bb9c4e8447}) ----------- -The name of the StateType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - - - - Battery level control changed - The name of the EventType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - - - - Charging - The name of the ParamType (ThingClass: battery, ActionType: charging, ID: {a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) ----------- -The name of the ParamType (ThingClass: battery, EventType: charging, ID: {a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) ----------- -The name of the StateType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - - - - Generic battery - The name of the ThingClass ({81418556-cae3-4803-aa0c-9c4b3304a3eb}) - - - - Critical battery level - The name of the ParamType (ThingClass: battery, Type: settings, ID: {8d875cb7-3a14-42d1-bf1b-759e5fd95a8f}) - - - - Battery entered or left critical state - The name of the EventType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car ----------- -The name of the EventType ({e95dc037-002d-40a2-8c15-cd5489bd354a}) of ThingClass battery - - - - Charging started or stopped - The name of the EventType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - - - - Set battery level - The name of the ActionType ({3f1cca10-8988-4ec6-b937-0775653cde12}) of ThingClass car ----------- -The name of the ActionType ({3336f0c2-158b-4353-b74f-f1bb9c4e8447}) of ThingClass battery - - - - Set charging - The name of the ActionType ({a61c0328-b982-46a5-9cc0-b4fa4d0ab84d}) of ThingClass battery - - - - Analog input - The name of the ParamType (ThingClass: generic, ActionType: analogInput, ID: {810fcd3c-7854-4bb1-82f6-1403ba54875e}) ----------- -The name of the ParamType (ThingClass: generic, EventType: analogInput, ID: {810fcd3c-7854-4bb1-82f6-1403ba54875e}) ----------- -The name of the StateType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - - - - Analog input changed - The name of the EventType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - - - - Analog output - The name of the ParamType (ThingClass: generic, ActionType: analogOutput, ID: {de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) ----------- -The name of the ParamType (ThingClass: generic, EventType: analogOutput, ID: {de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) ----------- -The name of the StateType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - - - - Analog output changed - The name of the EventType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - - - - Digital input - The name of the ParamType (ThingClass: generic, ActionType: digitalInput, ID: {3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) ----------- -The name of the ParamType (ThingClass: generic, EventType: digitalInput, ID: {3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) ----------- -The name of the StateType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - - - - Digital input changed - The name of the EventType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - - - - Digital output - The name of the ParamType (ThingClass: generic, ActionType: digitalOutput, ID: {605b4d8e-71a7-441e-900a-e07c305acd93}) ----------- -The name of the ParamType (ThingClass: generic, EventType: digitalOutput, ID: {605b4d8e-71a7-441e-900a-e07c305acd93}) ----------- -The name of the StateType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - - - - Digital output changed - The name of the EventType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - - - - Generic thing - The name of the ThingClass ({f5c02d35-b06e-4950-8238-847d50cabfdf}) - - - - Set analog input - The name of the ActionType ({810fcd3c-7854-4bb1-82f6-1403ba54875e}) of ThingClass generic - - - - Set analog output - The name of the ActionType ({de8ec1b1-8026-4fd8-aefb-dedc07616aa4}) of ThingClass generic - - - - Set digital input - The name of the ActionType ({3cf5eb01-dae8-49cd-8c5f-b0224be0044f}) of ThingClass generic - - - - Set digital output - The name of the ActionType ({605b4d8e-71a7-441e-900a-e07c305acd93}) of ThingClass generic - - - - Set string state - The name of the ActionType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - - - - String state - The name of the ParamType (ThingClass: generic, ActionType: stringState, ID: {f477e227-0d2d-4d88-a545-7dedf36266d5}) ----------- -The name of the ParamType (ThingClass: generic, EventType: stringState, ID: {f477e227-0d2d-4d88-a545-7dedf36266d5}) ----------- -The name of the StateType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - - - - String state changed - The name of the EventType ({f477e227-0d2d-4d88-a545-7dedf36266d5}) of ThingClass generic - - - - Air flow rate - The name of the ParamType (ThingClass: ventilationFlow, ActionType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) ----------- -The name of the ParamType (ThingClass: ventilationFlow, EventType: flowRate, ID: {5a273bba-0bef-49fb-870a-7f2df8fc14b6}) ----------- -The name of the StateType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - - - - Air flow rate changed - The name of the EventType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - - - - Generic ventilation with flow control - The name of the ThingClass ({a7eec5f7-3cc3-4edb-baa7-1f6b6f935bf8}) - - - - Set air flow rate - The name of the ActionType ({5a273bba-0bef-49fb-870a-7f2df8fc14b6}) of ThingClass ventilationFlow - - - - CO level - The name of the ParamType (ThingClass: coSensor, EventType: co, ID: {9eebe9d2-b34b-4847-bc25-109e2b8cab24}) ----------- -The name of the StateType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor - - - - CO level changed - The name of the EventType ({9eebe9d2-b34b-4847-bc25-109e2b8cab24}) of ThingClass coSensor - - - - Current Power usage - The name of the ParamType (ThingClass: smartMeter, EventType: currentPower, ID: {5983d714-5f80-42d8-bee2-9228b6382b3b}) ----------- -The name of the StateType ({5983d714-5f80-42d8-bee2-9228b6382b3b}) of ThingClass smartMeter - - - - Current Power usage changed - The name of the EventType ({5983d714-5f80-42d8-bee2-9228b6382b3b}) of ThingClass smartMeter - - - - Gas level - The name of the ParamType (ThingClass: gasSensor, EventType: gas, ID: {5135648f-57b7-44b0-b9d0-c5accad09356}) ----------- -The name of the StateType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor - - - - Gas level changed - The name of the EventType ({5135648f-57b7-44b0-b9d0-c5accad09356}) of ThingClass gasSensor - - - - Generic CO sensor - The name of the ThingClass ({262a29b2-b5df-4ee2-822c-e672f50d97b6}) - - - - Generic O2 sensor - The name of the ThingClass ({a8cf20ec-132b-4f6f-b5ec-73dc2f873b43}) - - - - Generic ORP sensor - The name of the ThingClass ({3edeec39-ab9d-4697-90cc-0bba089384cf}) - - - - Generic flammable gas sensor - The name of the ThingClass ({25c6725f-5c15-485b-9ec4-cb0e11ab6b32}) - - - - Gerneric water sensor - The name of the ThingClass ({09b9cb86-f551-4efe-9a7d-2f7624e9510f}) - - - - Maximum CO - The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e9def195-1b67-4a1b-8030-cbbc6209d52e}) - - - - Maximum input ORP value - The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {bd0774c9-1b89-49ce-b0f8-66ff26ca10db}) - - - - Maximum input value - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {4e228f9b-8631-4643-8375-3d8d76d12e9c}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {198847f6-a188-42b0-9e0b-15587eaabbed}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8889e45-59e5-4cc4-b228-611f8f19f531}) - - - - Maximum value - The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {51f4a830-3ef9-4fa2-b36b-5976f724f8a1}) - - - - Minimum CO - The name of the ParamType (ThingClass: coSensor, Type: settings, ID: {e850b044-fd70-446c-a943-3c88407425f5}) - - - - Minimum input value - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {16ea3cf2-46fd-40a3-88bf-21a2bb7cbabe}) ----------- -The name of the ParamType (ThingClass: o2Sensor, Type: settings, ID: {58e84041-d451-44a2-972e-13a79b449b58}) ----------- -The name of the ParamType (ThingClass: orpSensor, Type: settings, ID: {396bf3f9-a3fc-44c3-90f8-b316670116a7}) ----------- -The name of the ParamType (ThingClass: phSensor, Type: settings, ID: {a8ff2e16-e06c-4b1e-839a-a06691a12d64}) - - - - Minimum value - The name of the ParamType (ThingClass: gasSensor, Type: settings, ID: {480945ea-6262-408d-b799-cbff905a40db}) - - - - O2 saturation - The name of the ParamType (ThingClass: o2Sensor, EventType: o2saturation, ID: {a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) ----------- -The name of the StateType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor - - - - O2 saturation changed - The name of the EventType ({a3ff7641-87d9-4b07-b8e5-e6aa92b90088}) of ThingClass o2Sensor - - - - ORP - The name of the ParamType (ThingClass: orpSensor, EventType: orp, ID: {e5ed3535-2e5d-412e-85f8-782cbccd7731}) ----------- -The name of the StateType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor - - - - ORP changed - The name of the EventType ({e5ed3535-2e5d-412e-85f8-782cbccd7731}) of ThingClass orpSensor - - - - PH - The name of the ParamType (ThingClass: phSensor, EventType: ph, ID: {743514b1-8018-4525-b87a-c5f414146ff2}) ----------- -The name of the StateType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor - - - - PH changed - The name of the EventType ({743514b1-8018-4525-b87a-c5f414146ff2}) of ThingClass phSensor - - - - PH sensor - The name of the ThingClass ({e2934fa1-59c3-4de8-82f2-66181136085c}) - - - - Set water detected - The name of the ActionType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor - - - - Water detected - The name of the ParamType (ThingClass: waterSensor, ActionType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) ----------- -The name of the ParamType (ThingClass: waterSensor, EventType: waterDetected, ID: {b2427b85-1f62-4635-b546-1961191426ef}) ----------- -The name of the EventType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor ----------- -The name of the StateType ({b2427b85-1f62-4635-b546-1961191426ef}) of ThingClass waterSensor - - - - Battery level critical - The name of the ParamType (ThingClass: car, EventType: batteryCritical, ID: {d33982d6-6467-4281-b448-68c1b1db088d}) ----------- -The name of the StateType ({d33982d6-6467-4281-b448-68c1b1db088d}) of ThingClass car - - - - Capacity - The name of the ParamType (ThingClass: car, ActionType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) ----------- -The name of the ParamType (ThingClass: car, EventType: capacity, ID: {363a2a39-61b6-4109-9cd9-aca7367d12c7}) ----------- -The name of the StateType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - - - - Capacity changed - The name of the EventType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - - - - Generic electric car - The name of the ThingClass ({dbe0a9ff-94ba-4a94-ae52-51da3f05c717}) - - - - Set capacity - The name of the ActionType ({363a2a39-61b6-4109-9cd9-aca7367d12c7}) of ThingClass car - - - - Generic door or window sensor - The name of the ThingClass ({2d936f56-48ee-4be1-9b3e-28a335ad8085}) - - - - Generic water level sensor - The name of the ThingClass ({f1576df0-fb45-4bf0-89fa-a83c4118c326}) - - - - Tank capactity - The name of the ParamType (ThingClass: waterLevelSensor, Type: settings, ID: {5e98e8d2-d849-46c5-b25a-d54f184ea4c7}) - - - - Water level - The name of the ParamType (ThingClass: waterLevelSensor, EventType: waterLevel, ID: {07563165-e42d-4d0f-ac60-31cdd19170f2}) ----------- -The name of the StateType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor - - - - Water level changed - The name of the EventType ({07563165-e42d-4d0f-ac60-31cdd19170f2}) of ThingClass waterLevelSensor - - - - - IntegrationPluginGenericThings - - Invalid closing or angle time - - - - diff --git a/nymea-plugins-genericthings.pro b/nymea-plugins-genericthings.pro new file mode 100644 index 0000000..65bda2c --- /dev/null +++ b/nymea-plugins-genericthings.pro @@ -0,0 +1,55 @@ +TEMPLATE = subdirs + +PLUGIN_DIRS = \ + genericbuttons \ + genericcar \ + genericenergy \ + genericgarages \ + genericheatingcooling \ + genericirrigation \ + genericsensors \ + genericshading \ + genericthing \ + + +message(============================================) +message("Qt version:" $$[QT_VERSION]) + +plugininfo.depends = FORCE +for (entry, PLUGIN_DIRS):plugininfo.commands += test -d $${entry} || mkdir -p $${entry}; cd $${entry} && qmake -o Makefile $$PWD/$${entry}/$${entry}.pro && cd ..; +for (entry, PLUGIN_DIRS):plugininfo.commands += make -C $${entry} plugininfo.h; +QMAKE_EXTRA_TARGETS += plugininfo + +# Translations: +# make lupdate to update .ts files +lupdate.depends = FORCE plugininfo +for (entry, PLUGIN_DIRS):lupdate.commands += make -C $${entry} lupdate; +QMAKE_EXTRA_TARGETS += lupdate + +# make lrelease to build .qm from .ts +lrelease.depends = FORCE +for (entry, PLUGIN_DIRS):lrelease.commands += lrelease $$files($$PWD/$${entry}/translations/*.ts, true); +for (entry, PLUGIN_DIRS):lrelease.commands += rsync -a $$PWD/$${entry}/translations/*.qm $$OUT_PWD/translations/; +QMAKE_EXTRA_TARGETS += lrelease + +# For Qt-Creator's code model: Add CPATH to INCLUDEPATH explicitly +INCLUDEPATH += $$(CPATH) + +message("Usage: qmake [srcdir] [WITH_PLUGINS=\"...\"] [WITHOUT_PLUGINS=\"...\"]") + +isEmpty(WITH_PLUGINS) { + PLUGINS = $${PLUGIN_DIRS} +} else { + PLUGINS = $${WITH_PLUGINS} +} +PLUGINS-=$${WITHOUT_PLUGINS} + +message("Building plugins:") +for(plugin, PLUGINS) { + exists($${plugin}) { + SUBDIRS*= $${plugin} + message("- $${plugin}") + } else { + error("Invalid plugin \"$${plugin}\".") + } +} diff --git a/nymea-plugins.pro b/nymea-plugins.pro deleted file mode 100644 index 9265169..0000000 --- a/nymea-plugins.pro +++ /dev/null @@ -1,129 +0,0 @@ -TEMPLATE = subdirs - -PLUGIN_DIRS = \ - anel \ - aqi \ - avahimonitor \ - awattar \ - bluos \ - boblight \ - bose \ - coinmarketcap \ - commandlauncher \ - datetime \ - daylightsensor \ - denon \ - doorbird \ - dht \ - dweetio \ - dynatrace \ - elgato \ - eq-3 \ - fastcom \ - flowercare \ - fronius \ - garadget \ - genericelements \ - genericthings \ - goecharger \ - gpio \ - i2cdevices \ - httpcommander \ - homeconnect \ - keba \ - kodi \ - lgsmarttv \ - lifx \ - mecelectronics \ - mailnotification \ - mqttclient \ - mystrom \ - neatobotvac \ - nanoleaf \ - netatmo \ - networkdetector \ - nuki \ - mcp3008 \ - onewire \ - openuv \ - openweathermap \ - osdomotics \ - philipshue \ - pushbullet \ - pushnotifications \ - shelly \ - solarlog \ - systemmonitor \ - reversessh \ - senic \ - serialportcommander \ - sgready \ - simpleheatpump \ - sma \ - somfytahoma \ - sonos \ - sunposition \ - tado \ - tasmota \ - tcpcommander \ - telegram \ - tempo \ - texasinstruments \ - tplink \ - tuya \ - udpcommander \ - unifi \ - usbrelay \ - wakeonlan \ - wemo \ - ws2812fx \ - zigbeedevelco \ - zigbeegeneric \ - zigbeegenericlights \ - zigbeelumi \ - zigbeephilipshue \ - zigbeeremotes \ - zigbeetradfri \ - - -message(============================================) -message("Qt version:" $$[QT_VERSION]) - -plugininfo.depends = FORCE -for (entry, PLUGIN_DIRS):plugininfo.commands += test -d $${entry} || mkdir -p $${entry}; cd $${entry} && qmake -o Makefile $$PWD/$${entry}/$${entry}.pro && cd ..; -for (entry, PLUGIN_DIRS):plugininfo.commands += make -C $${entry} plugininfo.h; -QMAKE_EXTRA_TARGETS += plugininfo - -# Translations: -# make lupdate to update .ts files -lupdate.depends = FORCE plugininfo -for (entry, PLUGIN_DIRS):lupdate.commands += make -C $${entry} lupdate; -QMAKE_EXTRA_TARGETS += lupdate - -# make lrelease to build .qm from .ts -lrelease.depends = FORCE -for (entry, PLUGIN_DIRS):lrelease.commands += lrelease $$files($$PWD/$${entry}/translations/*.ts, true); -for (entry, PLUGIN_DIRS):lrelease.commands += rsync -a $$PWD/$${entry}/translations/*.qm $$OUT_PWD/translations/; -QMAKE_EXTRA_TARGETS += lrelease - -# For Qt-Creator's code model: Add CPATH to INCLUDEPATH explicitly -INCLUDEPATH += $$(CPATH) - -message("Usage: qmake [srcdir] [WITH_PLUGINS=\"...\"] [WITHOUT_PLUGINS=\"...\"]") - -isEmpty(WITH_PLUGINS) { - PLUGINS = $${PLUGIN_DIRS} -} else { - PLUGINS = $${WITH_PLUGINS} -} -PLUGINS-=$${WITHOUT_PLUGINS} - -message("Building plugins:") -for(plugin, PLUGINS) { - exists($${plugin}) { - SUBDIRS*= $${plugin} - message("- $${plugin}") - } else { - error("Invalid plugin \"$${plugin}\".") - } -}