├── README.md ├── addon ├── VERSION ├── generateaddon.sh ├── hvl │ ├── exec.cgi │ ├── hvl_addon.cfg │ ├── index.html │ ├── update-check.cgi │ └── update_addon ├── rc.d │ └── ccu_hvl └── update_script ├── bin ├── hmvi ├── hmvi.service └── hmviservice ├── devices ├── HM-CC-SCD.json ├── HM-CC-SCD_NA.json ├── HM-LC-Dim1T-Pl.json ├── HM-LC-RGBW-WM.json ├── HM-LC-Sw1-Pl.json ├── HM-OU-LED16.json ├── HM-RC-19.json ├── HM-RC-19_HTTP.json ├── HM-RC-19_Harmony.json ├── HM-RC-19_Pioneer.json ├── HM-RC-19_Sonos.json ├── HM-RC-Key4-2.json ├── HM-WDS10-TH-O.json ├── HM-WDS10-TH-O_NA.json ├── HM-WDS40-TH-I-2.json ├── HM-WDS40-TH-I-2_NA.json ├── KS500.json └── VIR-LG-RGBW-DIM.json ├── hvl_addon.tar.gz ├── install.sh ├── install_raspberrymatic.sh ├── lib ├── Config.js ├── ConfigurationServer.js ├── HomematicChannel.js ├── HomematicDevice.js ├── HomematicLogicLayer.js ├── HomematicParameter.js ├── HomematicParameterSet.js ├── HomematicReqaRequest.js ├── HomematicVirtualPlatform.js ├── Installer.js ├── Localizable.strings ├── Localization.js ├── Log.js ├── Serialize.js ├── Server.js ├── Util.js ├── VirtualDevicePlugin.js ├── ccu_installer.txt ├── ccu_rcscript.txt ├── hmvi ├── hmvi_npm ├── homematic-xmlrpc │ ├── HISTORY.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── lib │ │ ├── client.js │ │ ├── cookies.js │ │ ├── customtype.js │ │ ├── date_formatter.js │ │ ├── deserializer.js │ │ ├── serializer.js │ │ ├── server.js │ │ └── xmlrpc.js │ └── package.json ├── index-server.js ├── index.js ├── l_hmvi └── logger.js ├── package.json ├── plugins ├── Alexa │ ├── AlexaPlatform.js │ ├── Localizable.strings │ ├── README.md │ ├── index.js │ ├── package.json │ ├── service │ │ ├── AlexaHarmonyActivityService.js │ │ ├── AlexaHarmonyDeviceService.js │ │ ├── AlexaHomematicColorService.js │ │ ├── AlexaHomematicDimmerService.js │ │ ├── AlexaHomematicHMIPDimmerService.js │ │ ├── AlexaHomematicHMIPSwitchService.js │ │ ├── AlexaHomematicHMIPThermostatService.js │ │ ├── AlexaHomematicOldStyleThermostatService.js │ │ ├── AlexaHomematicProgramService.js │ │ ├── AlexaHomematicSwitchService.js │ │ ├── AlexaHomematicThermostatService.js │ │ ├── AlexaHomematicWiredDimmerService.js │ │ ├── AlexaHomematicWiredSwitchService.js │ │ ├── AlexaHueSceneService.js │ │ ├── AlexaHueService.js │ │ ├── AlexaLogicService.js │ │ ├── AlexaSonosService.js │ │ ├── AlexaTradfriDimmerService.js │ │ ├── GenericService.js │ │ ├── config.json │ │ └── phrases.json │ ├── skill │ │ └── cloud │ │ │ ├── index.js │ │ │ ├── msg_srv.js │ │ │ └── package.json │ └── www │ │ ├── app.js │ │ ├── de-de │ │ ├── edit.html │ │ ├── index.html │ │ ├── list_appliance.html │ │ ├── list_edit.html │ │ └── new_appliance.html │ │ ├── edit.html │ │ ├── index.html │ │ ├── list.html │ │ ├── list.json │ │ ├── list_appliance.html │ │ ├── list_edit.html │ │ ├── log.html │ │ └── new_appliance.html ├── BMWConnect │ ├── BMWConnectPlatform.js │ ├── BMWConnectedDrive.js │ ├── HM-Sec-SCo.json │ ├── HM-Sen-Wa-Od.json │ ├── README.md │ ├── index.js │ ├── package.json │ └── test.js ├── Backup │ ├── BackupPlatform.js │ ├── index.js │ ├── package.json │ └── www │ │ └── index.html ├── CCUDutyCycle │ ├── CCUDutyCycle.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ ├── list.json │ │ └── list_dc_tmp.html ├── CleanOMat980 │ ├── CleanOMat980Platform.js │ ├── GuidePluginRoomba980.pdf │ ├── HM-RC-Key4_Clean.json │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── DashButton │ ├── DashButtonPlatform.js │ ├── HM-PB-2-FM.json │ ├── README.md │ ├── index.js │ ├── package.json │ ├── stor.js │ └── www │ │ ├── de-de │ │ ├── index Kopie.html │ │ ├── index.html │ │ ├── install.html │ │ └── list_device_tmp_new.html │ │ ├── index Kopie.html │ │ ├── index.html │ │ ├── install.html │ │ ├── list_device_tmp.html │ │ └── list_device_tmp_new.html ├── DenonAVR │ ├── DenonAVR.js │ ├── HM-RC-19_Denon.json │ ├── index.js │ └── package.json ├── DenonAVRHTTP │ ├── DenonAVRHTTP.js │ ├── HM-RC-19_Denon.json │ ├── index.js │ └── package.json ├── DummyPlugin │ ├── DummyPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── FlowerPower │ ├── FlowerPowerPlatform.js │ ├── HM-WDS40-TH-I-2_FP.json │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── HttpPlugin │ ├── HttpPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── HuePlugin │ ├── HM-LC-Dim1T-Pl.json │ ├── HueColorDevice.js │ ├── HueDayLightSensor.js │ ├── HueDeviceOsramPlug.js │ ├── HueDimmableDevice.js │ ├── HueEffectServer.js │ ├── HueGroupManager.js │ ├── HuePlatform.js │ ├── HueSFXDevice.js │ ├── HueSceneManager.js │ ├── HueTempSensor.js │ ├── Localizable.strings │ ├── README.md │ ├── index.js │ ├── package.json │ ├── scenes │ │ ├── bluelounge.json │ │ ├── candle.json │ │ ├── cinema.json │ │ ├── clouds.json │ │ ├── clouds_2.json │ │ ├── disco.json │ │ ├── fader.json │ │ ├── fireplace.json │ │ ├── fluroscent.json │ │ ├── old_lights.json │ │ ├── pinklounge.json │ │ ├── random.json │ │ ├── redlounge.json │ │ ├── space_explosion.json │ │ └── torch.json │ └── www │ │ ├── de-de │ │ ├── index.html │ │ └── list_efx_tmp.html │ │ ├── index.html │ │ ├── list_efx_light_tmp.html │ │ ├── list_efx_slist_tmp.html │ │ ├── list_efx_tmp.html │ │ ├── list_group_tmp.html │ │ ├── list_lamp_tmp.html │ │ ├── list_scene_tmp.html │ │ └── list_sensor_tmp.html ├── IkeaTradfri │ ├── HM-LC-Bl1PBU-FM_Tradfri.json │ ├── README.md │ ├── TradfriBlind.js │ ├── TradfriBlindGroup.js │ ├── TradfriDevice.js │ ├── TradfriGroup.js │ ├── TradfriPlatform.js │ ├── VIR-LG-DIM_Tradfri.json │ ├── VIR-LG-GROUP_Tradfri.json │ ├── VIR-LG-RGB-DIM_Tradfri.json │ ├── VIR-LG-WHITE-DIM_Tradfri.json │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ ├── list_device_tmp.html │ │ ├── list_groups_tmp.html │ │ └── list_scenes_tmp.html ├── LightifyPlugin │ ├── LightifyPlatform.js │ ├── LightifyRGBDevice.js │ ├── LightifyWhiteDevice.js │ ├── README.md │ ├── VIR-LG-WHITE-DIM.json │ ├── index.js │ ├── package.json │ └── www │ │ └── index.html ├── Logging │ ├── LoggingPlatform.js │ └── index.js ├── LogicPlugin │ ├── LocalStorage.js │ ├── LogicUIHandler.js │ ├── LogicalPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ ├── editor.html │ │ ├── index.html │ │ ├── list_script_tmp.html │ │ └── reinit.html │ │ ├── editor.html │ │ ├── index.html │ │ ├── list_item_tmp.html │ │ ├── list_script_tmp.html │ │ ├── log.html │ │ └── reinit.html ├── LogitechHarmony │ ├── CCUDevice.js │ ├── DispatchedRequest.js │ ├── FakeHueDevice.js │ ├── GuidePluginHarmony.pdf │ ├── HarmonyClient.js │ ├── HarmonyHueServer.js │ ├── HarmonyPlatform.js │ ├── HarmonyRokuManager.js │ ├── HarmonyRokuServer.js │ ├── HueDevice.js │ ├── README.md │ ├── RealHueDevice.js │ ├── index.js │ ├── methods │ │ ├── createuser.js │ │ └── lights.js │ ├── package.json │ └── www │ │ ├── activity.html │ │ ├── app.js │ │ ├── index.html │ │ ├── list.json │ │ ├── list_actions.html │ │ ├── list_lamp_ccu_object.html │ │ ├── list_lamp_ccu_object_edit.html │ │ ├── list_lamp_fake.html │ │ ├── list_lamp_fake_edit.html │ │ ├── list_lamp_real.html │ │ ├── list_tmp_action.html │ │ └── roku.html ├── MQTT │ ├── MQTTPlatform.js │ ├── README.md │ ├── devices │ │ ├── RGB_Pic.json │ │ ├── RGB_Pixel.json │ │ ├── SonoffBasic.json │ │ ├── SonoffPow.json │ │ ├── SonoffTouch.json │ │ ├── WordClock.json │ │ ├── WordClockDimmer.json │ │ └── hmdata │ │ │ ├── HM-ES-PMSw1-Pl.json │ │ │ ├── HM-LC-Dim1T-Pl.json │ │ │ ├── HM-LC-SW1-FM.json │ │ │ └── HM-LC-SW1-FM_Touch.json │ ├── index.js │ ├── package.json │ ├── serviceclasses │ │ ├── DimmerDevice.js │ │ ├── RGBDevice.js │ │ ├── SwitchDevice.js │ │ └── TouchDevice.js │ └── www │ │ ├── de-de │ │ ├── edit_device_tmp.html │ │ └── index.html │ │ ├── dev_type_listItem.html │ │ ├── edit.html │ │ ├── edit_device_tmp.html │ │ ├── index.html │ │ └── list_device_tmp.html ├── NanoleafAurora │ ├── Localizable.strings │ ├── NanoLeafDevice.js │ ├── NanoleafAuroraPlatform.js │ ├── README.md │ ├── index.js │ ├── lib │ │ └── aurora.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ └── list_efx_tmp.html ├── NetAtmoPlugin │ ├── NA_ComboModule.js │ ├── NA_Main.js │ ├── NA_Module1.js │ ├── NA_Module4.js │ ├── NetAtmoDevice.js │ ├── NetAtmoPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ └── list_device_tmp.html ├── OpenWeatherMap │ ├── Localizable.strings │ ├── OpenWeatherMapPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── PhilipsTV │ ├── PhilipsTVPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ └── index.html ├── PiTemp │ ├── PiTempPlatform.js │ ├── README.md │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── PioneerAVR │ ├── PioneerPlatform.js │ ├── PioneerRemote.js │ ├── README.md │ ├── index.js │ ├── package.json │ ├── pioneer-avr.js │ └── www │ │ └── index.html ├── Raumfeld │ ├── HM-RC-19_Raumfeld.json │ ├── README.md │ ├── RaumfeldPlatform.js │ ├── RaumfeldPlayer.js │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ └── list_device_tmp.html ├── SonosPlugin │ ├── README.md │ ├── SonosCoordinator.js │ ├── SonosDevice.js │ ├── SonosPlatform.js │ ├── changelog │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ ├── list_device_new.html │ │ └── list_device_tmp.html ├── WeatherUnderground │ ├── Localizable.strings │ ├── README.md │ ├── WeatherUndergroundPlatform.js │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ └── index.html ├── deConz │ ├── DeConzPlatform.js │ ├── devices │ │ ├── BasicLight.js │ │ ├── ColorTemperatureLight.js │ │ ├── DeConzDevice.js │ │ ├── ExtendedColorLight.js │ │ ├── ZHAPresence.js │ │ ├── ZHASwitch.js │ │ └── definitions │ │ │ ├── HM-LC-Dim1T-Pl.json │ │ │ ├── HM-LC-RGBW-WM.json │ │ │ ├── HM-RC-8.json │ │ │ ├── HM-Sec-MDIR.json │ │ │ └── VIR-LG-WHITE-DIM.json │ ├── index.js │ ├── lib │ │ ├── ApiError.js │ │ ├── Gateway.js │ │ ├── GatewayDeviceError.js │ │ ├── model │ │ │ ├── GatewayObject.js │ │ │ ├── GatewayObjectWithId.js │ │ │ ├── lights │ │ │ │ └── Light.js │ │ │ ├── lightstate │ │ │ │ ├── BaseStates.js │ │ │ │ ├── CommonStates.js │ │ │ │ ├── ConfigToolState.js │ │ │ │ ├── LightState.js │ │ │ │ ├── StateParameters.js │ │ │ │ └── States.js │ │ │ └── sensors │ │ │ │ ├── CLIPGenericStatus.js │ │ │ │ ├── CLIPPresence.js │ │ │ │ ├── CLIPSensor.js │ │ │ │ ├── Daylight.js │ │ │ │ ├── Sensor.js │ │ │ │ ├── ZHAPresence.js │ │ │ │ └── ZHASwitch.js │ │ ├── types │ │ │ └── Types.js │ │ └── util.js │ ├── package.json │ └── www │ │ ├── index.html │ │ └── list_device_tmp.html ├── iCal │ ├── README.md │ ├── iCalPlatform.js │ ├── iCalendar.js │ ├── index.js │ ├── package.json │ └── www │ │ ├── de-de │ │ └── index.html │ │ ├── index.html │ │ ├── list_calendar.html │ │ └── list_calendar_edit.html └── plugins.json ├── raspberrymatic_installer ├── README.md ├── VERSION ├── etc │ ├── config.json.default │ ├── hm_addon.js │ ├── hvl.conf │ ├── hvl_addon.cfg │ ├── hvlrun │ ├── postinstall.sh │ ├── remove_hvl_object │ └── www │ │ └── index.html ├── genscript.sh ├── hvl-raspb-0.0.10.tar.gz ├── hvl-raspb-0.0.11.tar.gz ├── rc.d │ └── hvl └── update_script ├── rc.d └── hvl ├── setup.sh └── www ├── action.html ├── assets ├── css │ ├── application.css │ ├── bootstrap.css │ ├── style.css │ └── toolkit-inverse.css ├── fonts │ └── toolkit-entypo.woff2 ├── icons │ ├── apple-touch-icon-114x114.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-128x128.png │ ├── apple-touch-icon-144x144.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-180x180.png │ ├── apple-touch-icon-57x57.png │ ├── apple-touch-icon-60x60.png │ ├── apple-touch-icon-72x72.png │ ├── apple-touch-icon-76x76.png │ ├── apple-touch-icon-precomposed.png │ ├── apple-touch-icon.png │ ├── favicon-160x160.png │ ├── favicon-16x16.png │ ├── favicon-192x192.png │ ├── favicon-196x196.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.gif │ ├── favicon.ico │ └── favicon.png └── js │ ├── bootstrap.min.js │ └── jquery.min.js ├── corpsed_devices.html ├── daemon.html ├── de-de ├── corpsed_devices.html ├── index.html ├── list_corps_item.html ├── plugin_item.html ├── plugin_item_ws.html ├── plugin_settings.html ├── plugins.html ├── security.html └── service.html ├── index.html ├── list_corps_item.html ├── log.html ├── message.html ├── plugin_item.html ├── plugin_item_wos.html ├── plugin_item_ws.html ├── plugin_settings.html ├── plugins Kopie.html ├── plugins.html ├── removed_device_item.html ├── removed_devices.html ├── restart.html ├── restart_ccu.html ├── security.html ├── service.html ├── settings_option.html ├── settings_text.html └── update.html /addon/VERSION: -------------------------------------------------------------------------------- 1 | 0.7 -------------------------------------------------------------------------------- /addon/generateaddon.sh: -------------------------------------------------------------------------------- 1 | mkdir -p tmp 2 | rm -rf tmp/* 3 | mkdir -p tmp/hvl 4 | 5 | # copy all relevant stuff 6 | cp -a update_script tmp/ 7 | cp -a rc.d tmp/ 8 | cp -a hvl tmp/ 9 | cp -a VERSION tmp/ 10 | 11 | # generate archive 12 | cd tmp 13 | tar --exclude=.* -czvf ../hvl_addon.tar.gz * 14 | cd .. 15 | rm -rf tmp 16 | mv hvl_addon.tar.gz .. -------------------------------------------------------------------------------- /addon/hvl/exec.cgi: -------------------------------------------------------------------------------- 1 | #!/bin/tclsh 2 | 3 | 4 | puts "Content-Type: text/plain" 5 | puts "" 6 | 7 | 8 | 9 | if { [catch { 10 | set content [read stdin] 11 | set fo [open "ip" "w"] 12 | regexp {(\d+)(\D)(\d+)(\D)(\d+)(\D)(\d+)} $content match 13 | puts $fo $match:7000 14 | close $fo 15 | 16 | 17 | } errorMessage] } { 18 | puts $errorMessage 19 | } 20 | -------------------------------------------------------------------------------- /addon/hvl/hvl_addon.cfg: -------------------------------------------------------------------------------- 1 | { 2 | CONFIG_URL /addons/hvl/index.html 3 | CONFIG_DESCRIPTION { 4 | de {
  • Homematic Virtual Layer
  • } 5 | en {
  • Homematic Virtual Layer
  • } 6 | } 7 | ID HVL 8 | CONFIG_NAME HVL 9 | } 10 | -------------------------------------------------------------------------------- /addon/hvl/index.html: -------------------------------------------------------------------------------- 1 | Homematic Virtual Layer
    Ip Adresse Layerserver
    -------------------------------------------------------------------------------- /addon/hvl/update-check.cgi: -------------------------------------------------------------------------------- 1 | #!/bin/tclsh 2 | 3 | set checkURL "https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/master/addon/VERSION" 4 | set downloadURL "https://github.com/thkl/Homematic-Virtual-Interface/raw/master/hvl_addon.tar.gz" 5 | 6 | catch { 7 | set input $env(QUERY_STRING) 8 | set pairs [split $input &] 9 | foreach pair $pairs { 10 | if {0 != [regexp "^(\[^=]*)=(.*)$" $pair dummy varname val]} { 11 | set $varname $val 12 | } 13 | } 14 | } 15 | 16 | if { [info exists cmd ] && $cmd == "download"} { 17 | puts "" 18 | } else { 19 | catch { 20 | set newversion [ exec /usr/bin/wget -qO- --no-check-certificate $checkURL ] 21 | } 22 | if { [info exists newversion] } { 23 | puts $newversion 24 | } else { 25 | puts "n/a" 26 | } 27 | } -------------------------------------------------------------------------------- /addon/hvl/update_addon: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/addon/hvl/update_addon -------------------------------------------------------------------------------- /addon/rc.d/ccu_hvl: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ADDON_NAME=hvl 4 | CONFIG_DIR=/usr/local/etc/config 5 | ADDON_DIR=/usr/local/etc/config/addons/www/${ADDON_NAME} 6 | case "$1" in 7 | 8 | 9 | init) 10 | #make it only when user configurated the ip 11 | if [ -f ${ADDON_DIR}/ip ] 12 | then 13 | if [ $(cat /usr/local/etc/config/InterfacesList.xml | grep 'HVL' | wc -l ) -eq 0 ] 14 | then 15 | echo "Updating InterfaceList.xml" 16 | my_url=$(cat ${ADDON_DIR}/ip) 17 | sed -i /usr/local/etc/config/InterfacesList.xml -e "s/<\/interfaces>/\t\n\t\tHVL<\/name>\n\t\txmlrpc:\/\/${my_url}<\/url>\n\t\tHVL<\/info>\n\t<\/ipc>\n<\/interfaces>/" 18 | fi 19 | fi 20 | ;; 21 | 22 | start) 23 | ;; 24 | 25 | stop) 26 | ;; 27 | 28 | 29 | restart) 30 | ;; 31 | 32 | info) 33 | version=$(cat ${ADDON_DIR}/VERSION) 34 | echo "Info:
    Homematic Virtual Layer
    " 35 | echo "Info:

    Aufruf:
    http://IPAdressederCCU/addons/hvl
    " 36 | echo "Name: Homematic Virtual Layer" 37 | echo "Version: ${version}" 38 | echo "Operations: uninstall" 39 | echo "Config-Url: /addons/${ADDON_NAME}" 40 | echo "Update: /addons/${ADDON_NAME}/update-check.cgi" 41 | ;; 42 | 43 | 44 | uninstall) 45 | logger -t homematic -p user.info "removing homematic virtual layer" 46 | my_url=$(cat ${ADDON_DIR}/ip) 47 | sed -i /usr/local/etc/config/InterfacesList.xml -e "s/\t\n\t\tHVL<\/name>\n\t\txmlrpc:\/\/${my_url}<\/url>\n\t\tHVL<\/info>\n\t<\/ipc>\n//" 48 | rm -r ${ADDON_DIR} 49 | rm -r /usr/local/etc/config/rc.d/ccu_hvl 50 | ;; 51 | 52 | *) 53 | echo "Usage: $0 {init|start|stop|restart|info|uninstall}" >&2 54 | exit 1 55 | ;; 56 | esac 57 | 58 | exit 0 -------------------------------------------------------------------------------- /addon/update_script: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ADDONENAME=hvl 3 | ADDONDIR=/usr/local/etc/config/addons/$ADDONENAME 4 | WWWDIR=/usr/local/etc/config/addons/www/$ADDONENAME 5 | RCD_DIR=/usr/local/etc/config/rc.d 6 | CONFIG_DIR=/usr/local/etc/config 7 | 8 | mkdir -p /mnt 9 | 10 | if [ "$1" = "" ] 11 | then 12 | exit 1 13 | fi 14 | 15 | #www 16 | mkdir -p $WWWDIR 17 | # copy addon 18 | cp -R hvl/* $WWWDIR 19 | cp VERSION $WWWDIR 20 | chmod 775 $WWWDIR 21 | 22 | # copy startup script 23 | cp -R rc.d/* $RCD_DIR 24 | # make it run 25 | chmod +x $RCD_DIR/ccu_hvl 26 | 27 | /usr/local/etc/config/addons/www/hvl/update_addon hvl /usr/local/etc/config/addons/www/hvl/hvl_addon.cfg 28 | 29 | sync 30 | -------------------------------------------------------------------------------- /bin/hmvi: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // 4 | // This executable sets up the environment and runs the Homematic Virtual Interface Core CLI. 5 | // 6 | 7 | 'use strict'; 8 | 9 | process.title = 'homematic_virtual_interface'; 10 | 11 | // Find the lib 12 | var path = require('path'); 13 | var fs = require('fs'); 14 | var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib/'); 15 | 16 | // Run Homematic Interface 17 | require(lib + 'index'); -------------------------------------------------------------------------------- /bin/hmvi.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Homematic Virtual Layer 3 | After=multi-user.target 4 | 5 | [Service] 6 | Type=idle 7 | User=hmvi 8 | ExecStart=/home/hmvi/node_modules/homematic-virtual-interface/bin/hmvi 1> /var/s_hvl.log 2>&1 & 9 | Restart=on-failure 10 | RestartSec=10 11 | KillMode=process 12 | 13 | [Install] 14 | WantedBy=multi-user.target 15 | 16 | 17 | -------------------------------------------------------------------------------- /bin/hmviservice: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // 4 | // This executable sets up the environment and runs the Homematic Virtual Interface Core as a Service. 5 | // 6 | 7 | 'use strict'; 8 | 9 | process.title = 'homematic_virtual_interface'; 10 | 11 | // Find the lib 12 | var path = require('path'); 13 | var fs = require('fs'); 14 | var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib/'); 15 | 16 | var daemon = require("daemonize2").setup({ 17 | main: lib + "index.js", 18 | name: "HMVirtual", 19 | pidfile: "hmvi.pid" 20 | }); 21 | 22 | var fs = require('fs'); 23 | 24 | 25 | daemon 26 | .on("starting", function() { 27 | console.log("Starting daemon..."); 28 | }) 29 | .on("started", function(pid) { 30 | console.log("Daemon started. PID: " + pid); 31 | }) 32 | .on("stopping", function() { 33 | console.log("Stopping daemon..."); 34 | }) 35 | .on("stopped", function(pid) { 36 | console.log("Daemon stopped."); 37 | }) 38 | .on("running", function(pid) { 39 | console.log("Daemon already running. PID: " + pid); 40 | }) 41 | .on("notrunning", function() { 42 | console.log("Daemon is not running"); 43 | }) 44 | .on("error", function(err) { 45 | console.log("Daemon failed to start: " + err.message); 46 | }); 47 | 48 | switch (process.argv[2]) { 49 | 50 | case "start": 51 | daemon.start(); 52 | break; 53 | 54 | case "stop": 55 | daemon.stop(); 56 | break; 57 | 58 | case "kill": 59 | daemon.kill(); 60 | break; 61 | 62 | case "restart": 63 | daemon.stop(function(err) { 64 | daemon.start(); 65 | }); 66 | break; 67 | 68 | case "status": 69 | var pid = daemon.status(); 70 | if (pid) 71 | console.log("Daemon running. PID: " + pid); 72 | else 73 | console.log("Daemon is not running."); 74 | break; 75 | 76 | default: 77 | console.log("Usage: [start|stop|kill|restart|status]"); 78 | } 79 | -------------------------------------------------------------------------------- /devices/HM-CC-SCD.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"remote_dev_master","parameter":[]}],"channels":[{"flags":3,"paramsets":[{"name":"MASTER","id":"maint_ch_master","parameter":[]},{"name":"VALUES","id":"maint_ch_values","parameter":[{"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0},{"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1},{"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2},{"type":"INTEGER","max":127,"min":0,"flags":0,"tab_order":3,"name":"AES_KEY","operations":1},{"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":4},{"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":5}]}],"type":"MAINTENANCE","adress":"0","direction":2},{"flags":1,"paramsets":[{"name":"MASTER","id":"scd_ch_master","parameter":[{"flags":1,"tab_order":0,"name":"MSG_FOR_POS_A","type":"ENUM","valuelist":["NO_MSG","LEVEL_NORMAL"]},{"flags":1,"tab_order":1,"name":"MSG_FOR_POS_B","type":"ENUM","valuelist":["NO_MSG","LEVEL_NORMAL","LEVEL_ADDED_STRONG","LEVEL_ADDED"]},{"flags":1,"tab_order":2,"name":"MSG_FOR_POS_C","type":"ENUM","valuelist":["NO_MSG","LEVEL_NORMAL","LEVEL_ADDED_STRONG","LEVEL_ADDED"]},{"flags":1,"tab_order":3,"name":"MSG_FOR_POS_D","type":"ENUM","valuelist":["NO_MSG","LEVEL_NORMAL","LEVEL_ADDED_STRONG","LEVEL_ADDED"]},{"flags":3,"tab_order":4,"name":"AES_ACTIVE","type":"BOOL","vdefault":0},{"unit":"s","vdefault":600,"min":600,"tab_order":5,"flags":1,"max":1200,"name":"EVENT_FILTERTIME","type":"FLOAT"},{"type":"INTEGER","vdefault":6,"min":1,"flags":1,"max":10,"tab_order":6,"name":"TRANSMIT_TRY_MAX"}]},{"name":"VALUES","id":"scd_ch_values","parameter":[{"flags":1,"tab_order":0,"operations":5,"name":"STATE","type":"ENUM","valuelist":["LEVEL_NORMAL","LEVEL_ADDED","LEVEL_ADDED_STRONG"]},{"flags":3,"operations":4,"name":"INSTALL_TEST","type":"","tab_order":1}]},{"name":"LINK","id":"scd_ch_link","parameter":[{"flags":1,"tab_order":0,"name":"PEER_NEEDS_BURST","type":"BOOL","vdefault":0},{"flags":1,"tab_order":1,"name":"EXPECT_AES","type":"BOOL","vdefault":0}]}],"type":"SENSOR_FOR_CARBON_DIOXIDE","adress":"1","direction":2}],"type":"HM-CC-SCD","version":41} -------------------------------------------------------------------------------- /devices/HM-LC-Dim1T-Pl.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/devices/HM-LC-Dim1T-Pl.json -------------------------------------------------------------------------------- /devices/HM-OU-LED16.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"remote_dev_master","parameter":[{"unit":"s","vdefault":255,"min":0,"tab_order":0,"flags":1,"max":255,"name":"DISPLAY_ENERGYOPTIONS","type":"FLOAT"},{"flags":1,"tab_order":1,"name":"DISPLAY_BRIGHTNESS","type":"ENUM","valuelist":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},{"flags":1,"tab_order":2,"name":"LOCAL_RESET_DISABLE","type":"BOOL","vdefault":0}]}], 2 | "channels":[ 3 | {"flags":3, 4 | "paramsets":[ 5 | {"name":"MASTER","id":"maint_ch_master","parameter":[]}, 6 | {"name":"VALUES","id":"maint_ch_values","parameter":[ 7 | {"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0}, 8 | {"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1}, 9 | {"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2}, 10 | {"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":3}, 11 | {"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":4}, 12 | {"flags":1,"control":"NONE","operations":2,"name":"LED_STATUS","type":"INTEGER","tab_order":5}, 13 | {"type":"INTEGER","max":127,"min":0,"flags":0,"tab_order":6,"name":"AES_KEY","operations":1}, 14 | {"flags":9,"operations":5,"name":"DEVICE_IN_BOOTLOADER","type":"BOOL","tab_order":7}, 15 | {"flags":9,"operations":5,"name":"UPDATE_PENDING","type":"BOOL","tab_order":8}]} 16 | ], 17 | "type":"MAINTENANCE","adress":"0","direction":2 18 | }, 19 | 20 | {"flags":1,"paramsets":[ 21 | {"name":"MASTER","id":"remote_ch_master","parameter":[ 22 | {"flags":3,"tab_order":0,"name":"AES_ACTIVE","type":"BOOL","vdefault":0}]}, 23 | {"name":"VALUES","id":"remote_ch_values","parameter":[ 24 | {"flags":1,"control":"BTN_SHORT_ONLY.SHORT","operations":6,"name":"PRESS_SHORT","type":"","tab_order":0}, 25 | {"operations":7,"type":"ENUM","valuelist":["OFF","RED","GREEN","ORANGE"],"flags":1,"tab_order":1,"name":"LED_STATUS","control":"NONE"}, 26 | {"flags":1,"control":"NONE","operations":2,"name":"ALL_LEDS","type":"STRING","tab_order":2}, 27 | {"operations":2,"type":"ENUM","valuelist":["OFF","ON"],"flags":1,"tab_order":3,"name":"LED_SLEEP_MODE","control":"NONE"}, 28 | {"flags":3,"operations":6,"name":"INSTALL_TEST","type":"","tab_order":4}]}], 29 | "type":"KEY", 30 | "adress":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"], 31 | "direction":2 32 | } 33 | ], 34 | "type":"HM-OU-LED16","version":41 35 | } -------------------------------------------------------------------------------- /devices/HM-WDS10-TH-O.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"ash550_dev_master","parameter":[{"flags":1,"tab_order":0,"name":"BURST_RX","type":"BOOL","vdefault":0}]}],"channels":[{"flags":3,"paramsets":[{"name":"MASTER","id":"maint_ch_master","parameter":[]},{"name":"VALUES","id":"maint_ch_values","parameter":[{"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0},{"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1},{"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2},{"flags":9,"operations":5,"name":"LOWBAT","type":"BOOL","tab_order":3},{"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":4},{"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":5}]}],"type":"MAINTENANCE","adress":"0","direction":2},{"flags":1,"paramsets":[{"name":"MASTER","id":"ash550_ch_master","parameter":[]},{"name":"VALUES","id":"ash550_ch_values","parameter":[{"unit":"°C","max":80,"min":-40,"tab_order":0,"flags":1,"type":"FLOAT","name":"TEMPERATURE","operations":5},{"unit":"%","max":99,"min":0,"tab_order":1,"flags":1,"type":"INTEGER","name":"HUMIDITY","operations":5}]},{"name":"LINK","id":"ash550_ch_link","parameter":[]}],"type":"WEATHER","adress":"1","direction":2}],"type":"HM-WDS20-TH-O","version":41} -------------------------------------------------------------------------------- /devices/HM-WDS40-TH-I-2.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"wds40_th_dev_master","parameter":[{"flags":1,"tab_order":0,"name":"BURST_RX","type":"BOOL","vdefault":0},{"flags":1,"tab_order":1,"name":"LOCAL_RESET_DISABLE","type":"BOOL","vdefault":0}]}],"channels":[{"flags":3,"paramsets":[{"name":"MASTER","id":"maint_ch_master","parameter":[]},{"name":"VALUES","id":"maint_ch_values","parameter":[{"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0},{"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1},{"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2},{"flags":9,"operations":5,"name":"LOWBAT","type":"BOOL","tab_order":3},{"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":4},{"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":5},{"type":"INTEGER","max":127,"min":0,"flags":0,"tab_order":6,"name":"AES_KEY","operations":1}]}],"type":"MAINTENANCE","adress":"0","direction":2},{"flags":1,"paramsets":[{"name":"MASTER","id":"wds40_th_ch_master","parameter":[{"flags":3,"tab_order":0,"name":"AES_ACTIVE","type":"BOOL","vdefault":0}]},{"name":"VALUES","id":"wds40_th_ch_values","parameter":[{"unit":"°C","max":80,"min":-40,"tab_order":0,"flags":1,"type":"FLOAT","name":"TEMPERATURE","operations":5},{"unit":"%","max":99,"min":0,"tab_order":1,"flags":1,"type":"INTEGER","name":"HUMIDITY","operations":5}]},{"name":"LINK","id":"wds40_th_ch_link","parameter":[]}],"type":"WEATHER","adress":"1","direction":2}],"type":"HM-WDS40-TH-I-2","version":41} -------------------------------------------------------------------------------- /hvl_addon.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/hvl_addon.tar.gz -------------------------------------------------------------------------------- /lib/HomematicReqaRequest.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // 3 | // HomematicReqaRequest.js 4 | // Homematic Virtual Interface Core 5 | // 6 | // Created by Thomas Kluge on 15.01.17. 7 | // Copyright � 2016 kSquare.de. All rights reserved. 8 | // 9 | 10 | const http = require('http') 11 | const path = require('path') 12 | const logger = require(path.join(__dirname, '/logger.js')).logger('RegaRequest') 13 | 14 | var HomematicReqaRequest = function (bridge, script, callback) { 15 | var username = bridge.ccu_user 16 | var password = bridge.ccu_pass 17 | var headers = { 18 | 'Content-Type': 'application/x-www-form-urlencoded', 19 | 'Content-Length': script.length 20 | } 21 | 22 | if ((username !== undefined) && (password !== undefined)) { 23 | var auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64') 24 | headers['Authorization'] = auth 25 | } 26 | 27 | var ccuIP = bridge.ccuIP 28 | var post_options = { 29 | host: ccuIP, 30 | port: '8181', 31 | path: '/tclrega.exe', 32 | method: 'POST', 33 | headers: headers 34 | } 35 | 36 | var post_req = http.request(post_options, function (res) { 37 | var data = '' 38 | 39 | res.setEncoding('binary') 40 | 41 | res.on('data', function (chunk) { 42 | data += chunk.toString() 43 | }) 44 | 45 | res.on('end', function () { 46 | var pos = data.lastIndexOf('') 47 | var response = (data.substring(0, pos)) 48 | // logger.debug("Rega Response %s",response); 49 | callback(response) 50 | }) 51 | }) 52 | 53 | post_req.on('error', function (e) { 54 | logger.warn('Error %s while executing rega script %s', e, script) 55 | callback(undefined) 56 | }) 57 | 58 | post_req.on('timeout', function (e) { 59 | logger.warn('timeout from %s while executing rega script %s', bridge.ccuIP, script) 60 | callback(undefined) 61 | }) 62 | 63 | post_req.setTimeout(10000) 64 | // logger.debug("RegaScript %s",script); 65 | post_req.write(script) 66 | post_req.end() 67 | } 68 | 69 | module.exports = HomematicReqaRequest 70 | -------------------------------------------------------------------------------- /lib/HomematicVirtualPlatform.js: -------------------------------------------------------------------------------- 1 | // 2 | // HomematicVirtualPlatform.js 3 | // Homematic Virtual Interface Core 4 | // 5 | // Created by Thomas Kluge on 16.01.17. 6 | // Copyright � 2016 kSquare.de. All rights reserved. 7 | // 8 | 9 | 'use strict' 10 | const path = require('path') 11 | const fs = require('fs') 12 | 13 | function HomematicVirtualPlatform(plugin, name, server, log, instance) { 14 | this.plugin = plugin 15 | this.server = server 16 | this.log = log 17 | this.name = name 18 | this.instance = (instance) || '0' 19 | this.config = this.server.configuration 20 | this.bridge = server.getBridge() 21 | this.upstreamwasinitialized = true 22 | } 23 | 24 | HomematicVirtualPlatform.prototype.myDevices = function() { 25 | return undefined 26 | } 27 | 28 | HomematicVirtualPlatform.prototype.showSettings = undefined 29 | HomematicVirtualPlatform.prototype.saveSettings = undefined 30 | 31 | HomematicVirtualPlatform.prototype.shutdown = function() { 32 | 33 | } 34 | 35 | HomematicVirtualPlatform.prototype.getName = function() { 36 | return this.name 37 | } 38 | 39 | HomematicVirtualPlatform.prototype.restart = function() { 40 | 41 | } 42 | 43 | HomematicVirtualPlatform.prototype.message = function(message, callback) { 44 | 45 | } 46 | 47 | HomematicVirtualPlatform.prototype.getPluginVersion = function() { 48 | var pjPath = path.join(__dirname, './package.json') 49 | var pj = JSON.parse(fs.readFileSync(pjPath)) 50 | return pj.version 51 | } 52 | 53 | module.exports = HomematicVirtualPlatform -------------------------------------------------------------------------------- /lib/Localizable.strings: -------------------------------------------------------------------------------- 1 | {"strings": { 2 | "de-de": { 3 | "all devices published":"Alle Geräte publiziert.", 4 | "You are up to date":"Du bist up to date", 5 | "There is an update available.":"Es gibt ein Udate", 6 | "All connections removed. Please restart your CCU.":"Alle Verbindugen entfernt. Bitte starte die CCU neu.", 7 | "Last Message ":"Letze Meldung ", 8 | "unknow CCU ip":"Unbekannte CCU IP", 9 | "It seems that your ccu does not know anything about the Homematic-Virtual-Layer. If you are sure about the CCU-IP, and the correct settings in your CCU InterfacesList.xml, a CCU reboot may help.":"Es scheint, das die CCU nichts vom Homematic-Virtual-Layer weiss. Wenn Du sicher bist, das die IP richtig ist und die Einstellungen in der InterfacesList.xml der CCU stimmen, dann kann ein CCU Neustart für Abhilfe sorgen.", 10 | "Use https":"HTTPS benutzen", 11 | "Use HTTP Auth":"Authentifizierung einschalten", 12 | "Admin Password":"Admin Passwort", 13 | "If its the first run you have to setup your ccu click here to add HVL":"Wenn dies der erste Start ist muss HVL in der CCU bekannt gemacht werden. Das kann automatisch passieren. Dazu hier klicken um HVL hinzuzufügen", 14 | "Enable HVL launch at boot":"HVL beim Sytemstart starten", 15 | "Disable HVL launch at boot":"HVL Start beim Sytemstart deaktivieren", 16 | "Added as service":"... als Service hinzugefügt", 17 | "removed service":"... Service wurde entfernt", 18 | "Your ccu reboots now.. Time to get a coffee...":"Die CCU startet neu. Zeit für einen Kaffee..", 19 | "Please reboot your ccu":"Bitte CCU hier neu starten" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/Localization.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Localization.js 4 | // Homematic Virtual Interface Plugin 5 | // 6 | // Created by Thomas Kluge on 22.01.17. 7 | // Copyright � 2017 kSquare.de. All rights reserved. 8 | // 9 | var path = require('path') 10 | 11 | module.exports = function (strings) { 12 | var logger = require(path.join(__dirname, '/logger.js')).logger('Homematic Virtual Interface.Server') 13 | var fs = require('fs') 14 | var module = {} 15 | this.language = 'en-en' 16 | 17 | logger.info('Trying to load Localization from %s', strings) 18 | try { 19 | if (fs.existsSync(strings)) { 20 | module.string_obj = JSON.parse(fs.readFileSync(strings, 'binary')) 21 | } 22 | } catch (e) { 23 | // String File not found 24 | logger.error(e.stack) 25 | logger.error('Strings not found %s', strings) 26 | } 27 | 28 | module.setLanguage = function (dispatched_request) { 29 | this.language = dispatched_request.language 30 | } 31 | 32 | module.getLanguage = function () { 33 | return this.language 34 | } 35 | 36 | module.getLocalizedStringFromModuleJSON = function (element) { 37 | if (element[this.language]) { 38 | return element[this.language] 39 | } else { 40 | return element['en-en'] 41 | } 42 | } 43 | 44 | module.localize = function (input) { 45 | var result = input 46 | if (module.string_obj) { 47 | var loc_strings = module.string_obj.strings[this.language] 48 | if (loc_strings) { 49 | var loc = loc_strings[input] 50 | if (loc) { 51 | return loc 52 | } 53 | } 54 | } 55 | 56 | return result 57 | } 58 | 59 | return module 60 | } 61 | -------------------------------------------------------------------------------- /lib/Serialize.js: -------------------------------------------------------------------------------- 1 | var slice = Array.prototype.slice 2 | var queues = [] 3 | 4 | var WorkQueue = function () { 5 | this.running = null 6 | this.pending = [] 7 | } 8 | 9 | WorkQueue.get = function (name) { 10 | var queue = queues[name] 11 | if (!queue) queue = queues[name] = new WorkQueue() 12 | return queue 13 | } 14 | 15 | WorkQueue.prototype.add = function (_this, func, args, noCallback) { 16 | var that = this 17 | 18 | if (noCallback) { 19 | args.push(function (err) { that.next(err) }) 20 | } else { 21 | let callback = args.pop() 22 | args.push(function () { 23 | callback.apply(this, arguments) 24 | that.next(arguments[0]) 25 | }) 26 | } 27 | 28 | var task = function (err) { 29 | if (err instanceof Error) args[args.length - 1].call(global, err) 30 | else func.apply(_this, args) 31 | } 32 | 33 | if (!this.running) (this.running = task)() 34 | else this.pending.push(task) 35 | } 36 | 37 | WorkQueue.prototype.next = function (err) { 38 | var run = this.running = this.pending.shift() 39 | if (run) run(err) 40 | } 41 | 42 | var serialize = function (func, name) { 43 | if (!name) name = 'default' 44 | 45 | var queue = WorkQueue.get(name) 46 | var length = func.length 47 | 48 | var serialized = function () { 49 | queue.add(this, func, slice.call(arguments), arguments.length < length) 50 | } 51 | 52 | serialized.free = function () { return func } 53 | return serialized 54 | } 55 | 56 | module.exports = serialize 57 | -------------------------------------------------------------------------------- /lib/ccu_installer.txt: -------------------------------------------------------------------------------- 1 | wget http://myIP:myPort/settings/?addInterfaceScript --no-check-certificate -O/usr/local/etc/config/rc.d/ccu_hvl 2 | chmod +x /usr/local/etc/config/rc.d/ccu_hvl 3 | mkdir /usr/local/etc/config/addons/www/hvl 4 | echo "" > /usr/local/etc/config/addons/www/hvl/index.html 5 | mount -o remount,rw / 6 | rm /etc/init.d/S59hvl 7 | ln -s /usr/local/etc/config/rc.d/ccu_hvl /etc/init.d/S59hvl 8 | mount -o remount,ro / 9 | ls /usr/local/etc/config/rc.d/ 10 | -------------------------------------------------------------------------------- /lib/ccu_rcscript.txt: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Start HVL Interface Addon 3 | # this addon just changes the InteraceList.xml 4 | # 5 | 6 | case "$1" in 7 | 8 | start) 9 | if [ $(cat /usr/local/etc/config/InterfacesList.xml | grep "HVL" | wc -l ) -eq 0 ] 10 | then 11 | sed -i /usr/local/etc/config/InterfacesList.xml -e "s/<\/interfaces>/HVL<\/name>xmlrpc:\/\/myIP:myIfPort<\/url>HVL<\/info><\/ipc><\/interfaces>/" 12 | fi 13 | ;; 14 | 15 | stop) 16 | ;; 17 | 18 | restart) 19 | ;; 20 | 21 | info) 22 | echo "Info:
    Homematic Virtual Layer
    " 23 | echo "Info:

    Aufruf:
    http://IPAdressederCCU/addons/hvl
    " 24 | echo "Name: Homematic Virtual Layer" 25 | echo "Version: 0.9" 26 | echo "Operations: uninstall" 27 | ;; 28 | 29 | uninstall) 30 | logger -t homematic -p user.info "removing homematic virtual layer" 31 | rm -r /usr/local/etc/config/addons/www/hvl 32 | rm -r /usr/local/etc/config/rc.d/ccu_hvl 33 | mount -o remount,rw / 34 | rm -r /etc/init.d/S59hvl 35 | mount -o remount,ro / 36 | sed -i /usr/local/etc/config/InterfacesList.xml -e "s/HVL<\/name>xmlrpc:\/\/myIP:myIfPort<\/url>HVL<\/info><\/ipc>//" 37 | ;; 38 | 39 | *) 40 | echo "Usage: $0 {start|stop|restart|info|uninstall}" >&2 41 | exit 1 42 | ;; 43 | 44 | esac 45 | 46 | exit 0 47 | -------------------------------------------------------------------------------- /lib/hmvi_npm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ### BEGIN INIT INFO 3 | # Provides: Homematic Virtual Interface 4 | # Required-Start: $remote_fs $syslog 5 | # Required-Stop: $remote_fs $syslog 6 | # Default-Start: 2 3 4 5 7 | # Default-Stop: 0 1 6 8 | # Short-Description: Start daemon at boot time 9 | # Description: Enable service provided by daemon. 10 | ### END INIT INFO 11 | 12 | 13 | dir="/home/hmvi/node_modules/homematic-virtual-interface" 14 | cmd="bin/hmviservice" 15 | user="hmvi" 16 | 17 | sudo -u "$user" $dir/$cmd $1 18 | exit 0 19 | 20 | -------------------------------------------------------------------------------- /lib/homematic-xmlrpc/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011 Brandon Ace Alexander 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | -------------------------------------------------------------------------------- /lib/homematic-xmlrpc/Makefile: -------------------------------------------------------------------------------- 1 | TESTS = test/*.js 2 | 3 | test: 4 | @./node_modules/.bin/vows \ 5 | $(TESTS) 6 | 7 | # Since the target is named `test` and there is a directory named `test`, PHONY 8 | # is needed to keep make from saying: "make: `test' is up to date" 9 | .PHONY: test 10 | 11 | -------------------------------------------------------------------------------- /lib/homematic-xmlrpc/lib/customtype.js: -------------------------------------------------------------------------------- 1 | var CustomType = module.exports = function(raw) { 2 | this.raw = raw 3 | } 4 | 5 | CustomType.prototype.serialize = function(xml) { 6 | return xml.ele(this.tagName).txt(this.raw) 7 | } 8 | 9 | CustomType.prototype.tagName = 'customType' 10 | 11 | -------------------------------------------------------------------------------- /lib/homematic-xmlrpc/lib/xmlrpc.js: -------------------------------------------------------------------------------- 1 | const Client = require('./client') 2 | const Server = require('./server') 3 | const CustomType = require('./customtype') 4 | const dateFormatter = require('./date_formatter') 5 | 6 | var xmlrpc = exports 7 | 8 | /** 9 | * Creates an XML-RPC client. 10 | * 11 | * @param {Object} options - server options to make the HTTP request to 12 | * - {String} host 13 | * - {Number} port 14 | * - {String} url 15 | * - {Boolean} cookies 16 | * @return {Client} 17 | * @see Client 18 | */ 19 | xmlrpc.createClient = function (options) { 20 | return new Client(options, false) 21 | } 22 | 23 | /** 24 | * Creates an XML-RPC client that makes calls using HTTPS. 25 | * 26 | * @param {Object} options - server options to make the HTTP request to 27 | * - {String} host 28 | * - {Number} port 29 | * - {String} url 30 | * - {Boolean} cookies 31 | * @return {Client} 32 | * @see Client 33 | */ 34 | xmlrpc.createSecureClient = function (options) { 35 | return new Client(options, true) 36 | } 37 | 38 | /** 39 | * Creates an XML-RPC server. 40 | * 41 | * @param {Object}options - the HTTP server options 42 | * - {String} host 43 | * - {Number} port 44 | * @return {Server} 45 | * @see Server 46 | */ 47 | xmlrpc.createServer = function (options, callback) { 48 | return new Server(options, false, callback) 49 | } 50 | 51 | /** 52 | * Creates an XML-RPC server that uses HTTPS. 53 | * 54 | * @param {Object}options - the HTTP server options 55 | * - {String} host 56 | * - {Number} port 57 | * @return {Server} 58 | * @see Server 59 | */ 60 | xmlrpc.createSecureServer = function (options, callback) { 61 | return new Server(options, true, callback) 62 | } 63 | 64 | xmlrpc.CustomType = CustomType 65 | xmlrpc.dateFormatter = dateFormatter 66 | -------------------------------------------------------------------------------- /lib/index-server.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable handle-callback-err */ 2 | 3 | var daemon = require('daemonize2').setup({ 4 | main: 'index.js', 5 | name: 'HMVirtual', 6 | pidfile: 'hmvi.pid' 7 | }) 8 | 9 | switch (process.argv[2]) { 10 | case 'start': 11 | daemon.start() 12 | break 13 | 14 | case 'stop': 15 | daemon.stop() 16 | break 17 | 18 | case 'kill': 19 | daemon.kill() 20 | break 21 | 22 | case 'restart': 23 | 24 | daemon.stop(function (err) { 25 | daemon.start() 26 | }) 27 | break 28 | 29 | case 'status': 30 | var pid = daemon.status() 31 | if (pid) { console.log('Daemon running. PID: ' + pid) } else { console.log('Daemon is not running.') } 32 | break 33 | 34 | default: 35 | console.log('Usage: [start|stop|kill|restart|status]') 36 | } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-interface", 3 | "version": "0.2.76", 4 | "description": "Homematic Virtual Interface", 5 | "license": "ISC", 6 | "scripts": { 7 | "start": "node lib/index.js || true", 8 | "dev": "DEBUG=* node lib/index.js -D || true", 9 | "test": "xo --space 4" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git://github.com/thkl/Homematic-Virtual-Interface.git" 14 | }, 15 | "engines": { 16 | "node": ">=7.6.0" 17 | }, 18 | "bin": { 19 | "hmvi": "bin/hmvi" 20 | }, 21 | "dependencies": { 22 | "chalk": "^2.0.0", 23 | "commander": "2.8.1", 24 | "daemonize2": "^0.4.2", 25 | "debug": "^2.2.0", 26 | "group-array": "0.3.1", 27 | "http-headers": "latest", 28 | "iconv-lite": "0.5.1", 29 | "moment": "2.19.3", 30 | "nedb": "1.8.0", 31 | "nedb-logger": "0.1.0", 32 | "node-ssdp": "^4.0.0", 33 | "pem": "latest", 34 | "qs": "6.9.3", 35 | "request": "^2.65.0", 36 | "sax": "0.4.x", 37 | "xml2js": "0.4.17", 38 | "xmlbuilder": "https://github.com/hobbyquaker/xmlbuilder-js/tarball/29fe5030dc6852007dc8d1bfd5109d75f8da58d5" 39 | }, 40 | "config": { 41 | "unsafe-perm": true 42 | }, 43 | "files": [ 44 | "addon/", 45 | "bin/", 46 | "lib/", 47 | "README.md", 48 | "devices/", 49 | "hvl_addon.tar.gz", 50 | "www/" 51 | ], 52 | "devDependencies": { 53 | "eslint": "^5.14.0", 54 | "eslint-config-standard": "^12.0.0", 55 | "eslint-plugin-import": "^2.16.0", 56 | "eslint-plugin-node": "^8.0.1", 57 | "eslint-plugin-promise": "^4.0.1", 58 | "eslint-plugin-standard": "^4.0.0" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /plugins/Alexa/Localizable.strings: -------------------------------------------------------------------------------- 1 | {"strings": { 2 | "de-de": { 3 | "Cloud Api Key":"Cloud Api Key", 4 | "CCU Variable to Enable Alexa (optional)":"CCU Variable um Alexa einzuschalten (optional)", 5 | "Please setup as a boolean variable. All alexa events will be ignored if this variable is set to false (0)":"Erstelle eine Variable vom Typ Logikwert. Solange diese Variable falsch (0) ist werden alle Alexa Events ignoriert.", 6 | "Enable HM IP Usage":"HMIP Benutzung aktivieren", 7 | "Use this to enable Alexa with HMIp-Devices. Please restart until after you change this setting.":"Hiermit kannst Du HMIp Geräte mit Alexa steuern. Bitte mach einen Restart wenn Du diese Einstellung geändert hast.", 8 | "Enable HM Wired Usage":"HMWired Benutzung aktivieren.", 9 | "Use this to enable Alexa with HMWired-Devices. Please restart until after you change this setting.":"Aktiviere diese Einstellung wenn Du HMWired Geräte mit Alexa steuern möchtest.Bitte mach einen Restart wenn Du diese Einstellung geändert hast.", 10 | "Dimmer Ramp Time (s)":"Rampenzeit für Dimmer (s)", 11 | "Use this to set a default ramp time for all dimmers.":"Hier kannst Du die Vorgabe für die Rampenzeit beim Dimmen einstellen." 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /plugins/Alexa/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Amazon Alexa Plugin 2 | 3 | this is work in progess no way to turn it on at this time -------------------------------------------------------------------------------- /plugins/Alexa/index.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module.exports = function(server,name,logger,instance) { 4 | var AlexaPlatform = require(__dirname + '/AlexaPlatform') 5 | this.name = name; 6 | this.instance = instance; 7 | this.initialized = false; 8 | this.platform = new AlexaPlatform(this,name,server,logger,instance); 9 | this.platform.init(); 10 | 11 | 12 | this.handleConfigurationRequest = function(dispatched_request) { 13 | this.platform.handleConfigurationRequest(dispatched_request); 14 | }; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /plugins/Alexa/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-alexa", 3 | "version": "0.0.24", 4 | "description": "Virtual Alexa Bridge", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/Alexa" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.2.2" 19 | }, 20 | 21 | "dependencies": { 22 | "socket.io-client": "^1.5.0", 23 | "uuid":"latest", 24 | "nedb-logger":"0.1.0", 25 | "nedb" : "1.8.0" 26 | }, 27 | 28 | "files": [ 29 | "AlexaPlatform.js", 30 | "service/", 31 | "README.md", 32 | "Localizable.strings", 33 | "index.js", 34 | "www/" 35 | ] 36 | } -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHarmonyActivityService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHarmonyActivityService(homematicDevice,log,hmlayer,name) { 8 | AlexaHarmonyActivityService.super_.apply(this,arguments); 9 | 10 | } 11 | 12 | util.inherits(AlexaHarmonyActivityService, GenericAlexaHomematicService); 13 | 14 | AlexaHarmonyActivityService.prototype.getType = function() { 15 | return "Harmony Scene"; 16 | } 17 | 18 | AlexaHarmonyActivityService.prototype.getActions = function() { 19 | return ["turnOn","turnOff"]; 20 | } 21 | 22 | 23 | AlexaHarmonyActivityService.prototype.handleEvent = function(event,callback) { 24 | 25 | 26 | 27 | switch (event.header.name) { 28 | 29 | case "TurnOnRequest" : 30 | case "TurnOffRequest" : 31 | { 32 | var channelAdress = event.payload.appliance.applianceId; 33 | var channel = this.hm_layer.channelWithAdress(channelAdress); 34 | if (channel) { 35 | channel.updateValue("PRESS_SHORT",true,true,true); 36 | var parameter = channel.getParameterObject("PRESS_SHORT"); 37 | if (parameter) { 38 | parameter["channel"] = channel.adress; 39 | channel.emit('channel_value_change', parameter); 40 | } 41 | 42 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 43 | } else { 44 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 45 | } 46 | } 47 | break; 48 | 49 | default:{ 50 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 51 | } 52 | break; 53 | } 54 | 55 | 56 | } 57 | 58 | 59 | 60 | 61 | module.exports = AlexaHarmonyActivityService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHarmonyDeviceService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHarmonyDeviceService(homematicDevice,log,hmlayer,name) { 8 | AlexaHarmonyDeviceService.super_.apply(this,arguments); 9 | } 10 | 11 | util.inherits(AlexaHarmonyDeviceService, GenericAlexaHomematicService); 12 | 13 | AlexaHarmonyDeviceService.prototype.getType = function() { 14 | return "Harmony Device"; 15 | } 16 | 17 | AlexaHarmonyDeviceService.prototype.getActions = function() { 18 | return ["turnOn","turnOff"]; 19 | } 20 | 21 | 22 | AlexaHarmonyDeviceService.prototype.handleEvent = function(event,callback) { 23 | 24 | 25 | 26 | switch (event.header.name) { 27 | case "TurnOnRequest" : 28 | case "TurnOffRequest" : 29 | { 30 | var command = event.payload.appliance.applianceId; 31 | if (this.server) { 32 | 33 | var cmds = command.split(":"); 34 | if (cmds.length==4) { 35 | var pluginName = cmds[0]; 36 | var splugin = this.server.pluginWithName(pluginName); 37 | if (splugin!=undefined) { 38 | splugin.platform.sendClientAction(command); 39 | callback("Alexa.ConnectedHome.Control",(event.header.name=="TurnOnRequest") ? "TurnOnConfirmation" : "TurnOffConfirmation"); 40 | return; 41 | } 42 | } 43 | } 44 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 45 | } 46 | break; 47 | 48 | default:{ 49 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 50 | } 51 | break; 52 | } 53 | } 54 | 55 | 56 | 57 | module.exports = AlexaHarmonyDeviceService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHomematicColorService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHomematicColorService(homematicDevice,log,hmlayer,name) { 8 | AlexaHomematicColorService.super_.apply(this,arguments); 9 | this.ccuInterface = "BidCos-RF"; 10 | } 11 | 12 | util.inherits(AlexaHomematicColorService, GenericAlexaHomematicService); 13 | 14 | 15 | 16 | AlexaHomematicColorService.prototype.getType = function() { 17 | return "setColor"; 18 | } 19 | 20 | 21 | AlexaHomematicColorService.prototype.getActions = function() { 22 | return ["SetColorRequest"]; 23 | } 24 | 25 | 26 | 27 | AlexaHomematicColorService.prototype.handleEvent = function(event,callback) { 28 | 29 | var that = this; 30 | 31 | 32 | switch (event.header.name) { 33 | 34 | case "SetColorRequest" : { 35 | 36 | this.setState(this.homematicDevice,"COLOR",{"explicitDouble":1}); 37 | callback("Alexa.ConnectedHome.Control","SetColorConfirmation"); 38 | } 39 | break; 40 | 41 | default:{ 42 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 43 | } 44 | break; 45 | 46 | } 47 | 48 | 49 | } 50 | 51 | 52 | AlexaHomematicColorService.prototype.setColorChannelValue = function(sw_channel,newLevel) { 53 | var parameter = sw_channel.getParameterObject("COLOR"); 54 | if (parameter) { 55 | parameter.newValue = newLevel; 56 | parameter["channel"] = sw_channel.adress; 57 | sw_channel.emit('channel_value_change', parameter); 58 | } 59 | } 60 | 61 | module.exports = AlexaHomematicColorService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHomematicHMIPSwitchService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHomematicHMIPSwitchService(homematicDevice,log,hmlayer,name) { 8 | AlexaHomematicHMIPSwitchService.super_.apply(this,arguments); 9 | this.ccuInterface = "HmIP-RF"; 10 | } 11 | 12 | util.inherits(AlexaHomematicHMIPSwitchService, GenericAlexaHomematicService); 13 | 14 | AlexaHomematicHMIPSwitchService.prototype.getType = function() { 15 | return "Licht Aktor"; 16 | } 17 | 18 | AlexaHomematicHMIPSwitchService.prototype.getActions = function() { 19 | return ["turnOn","turnOff"]; 20 | } 21 | 22 | 23 | 24 | AlexaHomematicHMIPSwitchService.prototype.handleEvent = function(event,callback) { 25 | 26 | 27 | switch (event.header.name) { 28 | 29 | case "TurnOnRequest" : { 30 | this.setState(this.homematicDevice,"STATE",true); 31 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 32 | } 33 | break; 34 | 35 | 36 | case "TurnOffRequest" : { 37 | this.setState(this.homematicDevice,"STATE",false); 38 | callback("Alexa.ConnectedHome.Control","TurnOffConfirmation"); 39 | } 40 | break; 41 | 42 | default:{ 43 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 44 | } 45 | break; 46 | } 47 | 48 | 49 | } 50 | 51 | 52 | 53 | 54 | module.exports = AlexaHomematicHMIPSwitchService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHomematicProgramService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHomematicProgramService(homematicDevice,log,hmlayer,name) { 8 | AlexaHomematicProgramService.super_.apply(this,arguments); 9 | } 10 | 11 | util.inherits(AlexaHomematicProgramService, GenericAlexaHomematicService); 12 | 13 | AlexaHomematicProgramService.prototype.getType = function() { 14 | return "Program Service"; 15 | } 16 | 17 | AlexaHomematicProgramService.prototype.getActions = function() { 18 | return ["turnOn","turnOff"]; 19 | } 20 | 21 | 22 | 23 | AlexaHomematicProgramService.prototype.handleEvent = function(event,callback) { 24 | var that = this; 25 | 26 | switch (event.header.name) { 27 | 28 | case "TurnOnRequest" : { 29 | console.log(this.homematicDevice); 30 | if (this.homematicDevice.indexOf("")===0) { 31 | this.sendRega("var x = dom.GetObject('" + this.homematicDevice.slice(2) + "');if (x) {x.ProgramExecute();}",function (result) { 32 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 33 | }); 34 | } 35 | } 36 | break; 37 | 38 | 39 | case "TurnOffRequest" : { 40 | 41 | callback("Alexa.ConnectedHome.Control","TurnOffConfirmation"); 42 | } 43 | break; 44 | 45 | default:{ 46 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 47 | } 48 | break; 49 | } 50 | 51 | 52 | } 53 | 54 | 55 | 56 | 57 | module.exports = AlexaHomematicProgramService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHomematicSwitchService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHomematicSwitchService(homematicDevice,log,hmlayer,name) { 8 | AlexaHomematicSwitchService.super_.apply(this,arguments); 9 | this.ccuInterface = "BidCos-RF"; 10 | } 11 | 12 | util.inherits(AlexaHomematicSwitchService, GenericAlexaHomematicService); 13 | 14 | AlexaHomematicSwitchService.prototype.getType = function() { 15 | return "Licht Aktor"; 16 | } 17 | 18 | AlexaHomematicSwitchService.prototype.getActions = function() { 19 | return ["turnOn","turnOff"]; 20 | } 21 | 22 | 23 | 24 | AlexaHomematicSwitchService.prototype.handleEvent = function(event,callback) { 25 | 26 | 27 | switch (event.header.name) { 28 | 29 | case "TurnOnRequest" : { 30 | this.setState(this.homematicDevice,"STATE",true); 31 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 32 | } 33 | break; 34 | 35 | 36 | case "TurnOffRequest" : { 37 | this.setState(this.homematicDevice,"STATE",false); 38 | callback("Alexa.ConnectedHome.Control","TurnOffConfirmation"); 39 | } 40 | break; 41 | 42 | default:{ 43 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 44 | } 45 | break; 46 | } 47 | 48 | 49 | } 50 | 51 | 52 | 53 | 54 | module.exports = AlexaHomematicSwitchService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHomematicWiredSwitchService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHomematicWiredSwitchService(homematicDevice,log,hmlayer,name) { 8 | AlexaHomematicWiredSwitchService.super_.apply(this,arguments); 9 | this.ccuInterface = "BidCos-Wired"; 10 | } 11 | 12 | util.inherits(AlexaHomematicWiredSwitchService, GenericAlexaHomematicService); 13 | 14 | AlexaHomematicWiredSwitchService.prototype.getType = function() { 15 | return "Licht Aktor"; 16 | } 17 | 18 | AlexaHomematicWiredSwitchService.prototype.getActions = function() { 19 | return ["turnOn","turnOff"]; 20 | } 21 | 22 | 23 | 24 | AlexaHomematicWiredSwitchService.prototype.handleEvent = function(event,callback) { 25 | 26 | 27 | switch (event.header.name) { 28 | 29 | case "TurnOnRequest" : { 30 | this.setState(this.homematicDevice,"STATE",true); 31 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 32 | } 33 | break; 34 | 35 | 36 | case "TurnOffRequest" : { 37 | this.setState(this.homematicDevice,"STATE",false); 38 | callback("Alexa.ConnectedHome.Control","TurnOffConfirmation"); 39 | } 40 | break; 41 | 42 | default:{ 43 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 44 | } 45 | break; 46 | } 47 | 48 | 49 | } 50 | 51 | 52 | 53 | 54 | module.exports = AlexaHomematicWiredSwitchService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaHueSceneService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaHueSceneService(homematicDevice,log,hmlayer,name) { 8 | AlexaHueSceneService.super_.apply(this,arguments); 9 | } 10 | 11 | util.inherits(AlexaHueSceneService, GenericAlexaHomematicService); 12 | 13 | 14 | 15 | AlexaHueSceneService.prototype.getType = function() { 16 | return "Hue Scene"; 17 | } 18 | 19 | 20 | AlexaHueSceneService.prototype.getActions = function() { 21 | return ["turnOn","turnOff"]; 22 | } 23 | 24 | 25 | 26 | AlexaHueSceneService.prototype.handleEvent = function(event,callback) { 27 | 28 | var that = this; 29 | switch (event.header.name) { 30 | case "TurnOnRequest" : 31 | case "TurnOffRequest" : 32 | { 33 | var command = event.payload.appliance.applianceId; 34 | if (this.server) { 35 | 36 | var cmds = command.split(":"); 37 | if (cmds.length==2) { 38 | var pluginName = cmds[0]; 39 | var sceneID = cmds[1]; 40 | var splugin = this.server.pluginWithName(pluginName); 41 | if (splugin!=undefined) { 42 | splugin.platform.runScene(sceneID); 43 | callback("Alexa.ConnectedHome.Control",(event.header.name=="TurnOnRequest") ? "TurnOnConfirmation" : "TurnOffConfirmation"); 44 | return; 45 | } 46 | } 47 | } 48 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 49 | } 50 | break; 51 | 52 | default:{ 53 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 54 | } 55 | break; 56 | } 57 | } 58 | 59 | 60 | module.exports = AlexaHueSceneService; -------------------------------------------------------------------------------- /plugins/Alexa/service/AlexaLogicService.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericAlexaHomematicService = require('./GenericService.js').GenericAlexaHomematicService; 4 | var util = require("util"); 5 | 6 | 7 | function AlexaLogicService(homematicDevice,log,hmlayer,name) { 8 | AlexaLogicService.super_.apply(this,arguments); 9 | } 10 | 11 | util.inherits(AlexaLogicService, GenericAlexaHomematicService); 12 | 13 | AlexaLogicService.prototype.getType = function() { 14 | return "Logic Function"; 15 | } 16 | 17 | 18 | AlexaLogicService.prototype.getActions = function() { 19 | return ["turnOn","turnOff"]; 20 | } 21 | 22 | 23 | AlexaLogicService.prototype.handleEvent = function(event,callback) { 24 | var that = this; 25 | 26 | switch (event.header.name) { 27 | 28 | case "TurnOnRequest" : { 29 | 30 | var sw_channel = this.virtual_device.getChannelWithTypeAndIndex("SWITCH","1"); 31 | sw_channel.updateValue("STATE",true,true,true); 32 | callback("Alexa.ConnectedHome.Control","TurnOnConfirmation"); 33 | } 34 | break; 35 | 36 | 37 | case "TurnOffRequest" : { 38 | var sw_channel = this.virtual_device.getChannelWithTypeAndIndex("SWITCH","1"); 39 | sw_channel.updateValue("STATE",false,true,true); 40 | callback("Alexa.ConnectedHome.Control","TurnOffConfirmation"); 41 | } 42 | break; 43 | 44 | default:{ 45 | callback("Alexa.ConnectedHome.Control","NoSuchTargetError"); 46 | } 47 | break; 48 | } 49 | 50 | } 51 | 52 | 53 | 54 | module.exports = AlexaLogicService; -------------------------------------------------------------------------------- /plugins/Alexa/service/GenericService.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/Alexa/service/GenericService.js -------------------------------------------------------------------------------- /plugins/Alexa/service/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "handler":[ 3 | "AlexaHomematicDimmerService", 4 | "AlexaHomematicSwitchService", 5 | "AlexaHomematicThermostatService", 6 | "AlexaHomematicOldStyleThermostatService", 7 | "AlexaHomematicWiredSwitchService", 8 | "AlexaHomematicWiredDimmerService", 9 | "AlexaLogicService", 10 | "AlexaSonosService", 11 | "AlexaHueService", 12 | "AlexaHomematicProgramService", 13 | "AlexaHarmonyDeviceService", 14 | "AlexaHarmonyActivityService", 15 | "AlexaHueSceneService", 16 | "AlexaHomematicHMIPSwitchService", 17 | "AlexaHomematicHMIPDimmerService", 18 | "AlexaHomematicHMIPThermostatService", 19 | "AlexaTradfriDimmerService" 20 | ], 21 | 22 | "hm_device_settings" : { 23 | "BidCos-RF.SWITCH" : "AlexaHomematicSwitchService", 24 | "BidCos-RF.DIMMER" : "AlexaHomematicDimmerService", 25 | "BidCos-RF.BLIND" : "AlexaHomematicDimmerService", 26 | "BidCos-RF.THERMALCONTROL_TRANSMIT" : "AlexaHomematicThermostatService", 27 | "BidCos-RF.CLIMATECONTROL_REGULATOR": "AlexaHomematicOldStyleThermostatService", 28 | "BidCos-RF.CLIMATECONTROL_RT_TRANSCEIVER": "AlexaHomematicThermostatService", 29 | "HUELIGHT" : "AlexaHueService", 30 | "HUEGROUP" : "AlexaHueService", 31 | "HUESCENE" : "AlexaHueSceneService", 32 | "SONOS" : "AlexaSonosService", 33 | "HARMONY" : "AlexaHarmonyActivityService", 34 | "HARMONYDEVICE" : "AlexaHarmonyDeviceService", 35 | "TRADFRI":"AlexaTradfriDimmerService", 36 | "BidCos-Wired.DIGITAL_OUTPUT" : "AlexaHomematicWiredSwitchService", 37 | "BidCos-Wired.DIGITAL_ANALOG_OUTPUT" : "AlexaHomematicWiredSwitchService", 38 | "BidCos-Wired.SWITCH" : "AlexaHomematicWiredSwitchService", 39 | "BidCos-Wired.DIMMER" : "AlexaHomematicWiredDimmerService", 40 | "BidCos-Wired.BLIND" : "AlexaHomematicWiredDimmerService", 41 | "HmIP-RF.SWITCH_VIRTUAL_RECEIVER" : "AlexaHomematicHMIPSwitchService", 42 | "HmIP-RF.DIMMER_VIRTUAL_RECEIVER":"AlexaHomematicHMIPDimmerService", 43 | "HmIP-RF.HEATING_CLIMATECONTROL_TRANSCEIVER":"AlexaHomematicHMIPThermostatService" 44 | } 45 | } -------------------------------------------------------------------------------- /plugins/Alexa/service/phrases.json: -------------------------------------------------------------------------------- 1 | { 2 | "turnOn" : { 3 | "en-en": "Alexa, turn on the $device$.", 4 | "de-de": "Alexa, schalte $device$ ein." 5 | }, 6 | 7 | "turnOff" : { 8 | "en-en": "Alexa, turn off the $device$.", 9 | "de-de": "Alexa, schalte $device$ aus." 10 | }, 11 | 12 | "setPercentage" : { 13 | "en-en": "Alexa, set $device$ to XX percent.", 14 | "de-de": "Alexa, stelle $device$ auf XX Prozent." 15 | }, 16 | 17 | "incrementPercentage" : { 18 | "en-en": "Alexa, increase $device$ by XX percent.", 19 | "de-de": "Alexa, erhöhe $device$ um XX Prozent." 20 | }, 21 | 22 | "decrementPercentage" : { 23 | "en-en": "Alexa, decrease $device$ name by XX percent.", 24 | "de-de": "Alexa, reduziere $device$ um XX Prozent." 25 | }, 26 | 27 | "decrementTargetTemperature" : { 28 | "en-en": "Alexa, decrease $device$ name by XX degrees.", 29 | "de-de": "Alexa, reduziere $device$ um XX Grad" 30 | }, 31 | 32 | 33 | "incrementTargetTemperature" : { 34 | "en-en": "Alexa, increase the $device$ name by XX degrees", 35 | "de-de": "Alexa, erhöhe $device$ um XX Grad." 36 | }, 37 | 38 | 39 | "setTargetTemperature" : { 40 | "en-en": "Alexa, set the $device$ to XX degrees.", 41 | "de-de": "Alexa, stelle $device$ auf XX Grad." 42 | }, 43 | 44 | "setColor": { 45 | "en-en": "Alexa, set the $device$ to red", 46 | "de-de": "Alexa, setze $device$ auf rosa" 47 | 48 | } 49 | } -------------------------------------------------------------------------------- /plugins/Alexa/skill/cloud/index.js: -------------------------------------------------------------------------------- 1 | var app = require('express')(); 2 | var https = require('https'); 3 | var fs = require('fs'); 4 | 5 | var MessageServer = require(__dirname + '/msg_srv.js').MessageServer; 6 | var clients = []; 7 | 8 | var httpserver = new MessageServer(); 9 | 10 | var options = { 11 | key: fs.readFileSync('/root/.acme.sh/ksquare.de/ksquare.de.key'), 12 | cert: fs.readFileSync('/root/.acme.sh/ksquare.de/ksquare.de.cer') 13 | }; 14 | 15 | var serverPort = 443; 16 | var server = https.createServer(options, app); 17 | var io = require('socket.io')(server); 18 | 19 | function authenticate(socket, data, callback) { 20 | var username = data.username; 21 | var password = data.password; 22 | 23 | return callback(null, username == password); 24 | 25 | } 26 | 27 | function postAuthenticate(socket, data) { 28 | 29 | socket.join(data.username); 30 | 31 | } 32 | 33 | function disconnect(socket) { 34 | console.log(socket.id + ' disconnected'); 35 | } 36 | 37 | require('socketio-auth')(io, { 38 | authenticate: authenticate, 39 | postAuthenticate: postAuthenticate, 40 | disconnect: disconnect, 41 | timeout: 4000 42 | }); 43 | 44 | 45 | io.on('connection', function(client){ 46 | client.on('event', function(data){ 47 | 48 | console.log("Client ID %s",client.id); 49 | // clients.push(client) 50 | 51 | }); 52 | 53 | client.on('disconnect', function(){ 54 | 55 | }); 56 | 57 | client.on('message', function(data,fn){ 58 | 59 | console.log("Message %s from client %s",data,client.id); 60 | try { 61 | 62 | var message = JSON.parse(data); 63 | if (message) { 64 | 65 | Object.keys(message).forEach(function (key) { 66 | 67 | switch (key) { 68 | 69 | case "key": { 70 | client.join(message["key"]); 71 | } 72 | break; 73 | 74 | case "cmd": 75 | { 76 | client.join(message["key"]); 77 | client.to(message["key"]).emit(message["key"], message["cmd"]); 78 | } 79 | 80 | case "result": 81 | { 82 | client.join(message["key"]); 83 | client.to(message["key"]).emit('result', message["result"]); 84 | } 85 | 86 | 87 | break; 88 | 89 | } 90 | 91 | }); 92 | 93 | } 94 | 95 | } catch (e) { 96 | 97 | } 98 | }); 99 | 100 | }); 101 | 102 | server.listen(3000); 103 | 104 | 105 | -------------------------------------------------------------------------------- /plugins/Alexa/skill/cloud/msg_srv.js: -------------------------------------------------------------------------------- 1 | 2 | var http = require('http'); 3 | var qs = require('querystring'); 4 | var port = 53001; 5 | 6 | var clients = []; 7 | 8 | var MessageServer = function () { 9 | 10 | 11 | function handleRequest(request, response){ 12 | 13 | var message = "+OK"; 14 | 15 | if (request.method == 'POST') { 16 | var body = ''; 17 | 18 | request.on('data', function (data) { 19 | body += data; 20 | 21 | if (body.length > 1e6) 22 | request.connection.destroy(); 23 | }); 24 | 25 | request.on('end', function () { 26 | console.log("END"); 27 | var post = qs.parse(body); 28 | console.log(JSON.stringify(post)); 29 | var api_key = post["api_key"]; 30 | var command = post["cmd"]; 31 | if (api_key) { 32 | console.log("Key Found open socket"); 33 | // create a socketIO Client and join the api key channel 34 | var client = require('socket.io-client')('http://localhost:3000'); 35 | clients.push(client); 36 | 37 | client.on('connect', function () { 38 | client.send(JSON.stringify({"key":api_key,"cmd":command}), function (data) { 39 | 40 | }); 41 | }); 42 | 43 | client.on('result', function (data) { 44 | message = JSON.stringify(data); 45 | console.log("Disconnect remove %s from Clients",client.id); 46 | 47 | response.writeHead(200, { 48 | 'Content-Length': Buffer.byteLength(message), 49 | 'Content-Type': 'text/html' }); 50 | response.end(message); 51 | 52 | 53 | var index = clients.indexOf(client); 54 | if (index > -1) { 55 | clients.splice(index, 1); 56 | } 57 | 58 | }); 59 | 60 | 61 | 62 | console.log("We have now %s clients",clients.length); 63 | } 64 | }); 65 | } 66 | 67 | 68 | }; 69 | 70 | 71 | var server = http.createServer(handleRequest); 72 | 73 | server.listen(port, function(){ 74 | console.log("Message Server is listening on: Port %s",port); 75 | }); 76 | 77 | } 78 | 79 | 80 | module.exports = { 81 | MessageServer : MessageServer 82 | } 83 | -------------------------------------------------------------------------------- /plugins/Alexa/skill/cloud/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Alexa-helpder", 3 | "version": "0.0.1", 4 | "description": "Virtual Alexa Bridge", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0" 18 | }, 19 | 20 | "dependencies": { 21 | "express": "^4.10.2", 22 | "socket.io":"latest", 23 | "socket.io-client": "^1.5.0" 24 | }, 25 | 26 | "scripts": { 27 | "start": "node index.js || true", 28 | "dev": "DEBUG=* node index.js -D || true" 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /plugins/Alexa/www/de-de/list_appliance.html: -------------------------------------------------------------------------------- 1 |
    2 | Geräteadresse : $appliance.device$
    3 | Alexa Name : $appliance.name$
    4 | $appliance.service$

    5 | 6 |     7 |
    8 |
    -------------------------------------------------------------------------------- /plugins/Alexa/www/de-de/list_edit.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 |
    6 | Geräteadresse : $appliance.device$ 7 |
    8 |
    9 | Alexa Name :  Dieser Name wird zum Alexa Dienst übertragen. 10 |
    11 |
    12 | Handler : 13 |
    14 |
    15 | 16 |
    17 |
    18 |
    19 | Aktuellen Phrasen sind :

    20 | $appliance.phrases$ 21 |
    22 | 23 |
    24 | 25 |
    -------------------------------------------------------------------------------- /plugins/Alexa/www/list.html: -------------------------------------------------------------------------------- 1 | $list$ -------------------------------------------------------------------------------- /plugins/Alexa/www/list.json: -------------------------------------------------------------------------------- 1 | $list$ -------------------------------------------------------------------------------- /plugins/Alexa/www/list_appliance.html: -------------------------------------------------------------------------------- 1 |
    2 | Device Adress : $appliance.device$
    3 | Alexa Name : $appliance.name$
    4 | $appliance.service$

    5 | 6 |     7 |
    8 |
    -------------------------------------------------------------------------------- /plugins/Alexa/www/list_edit.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 |
    6 | Device Adress : $appliance.device$ 7 |
    8 |
    9 | Alexa Name :  This name will be send to the Alexa service. 10 |
    11 |
    12 | Handler : 13 |
    14 |
    15 | 16 |
    17 |
    18 |
    19 | Current phrase will be :

    20 | $appliance.phrases$ 21 |
    22 | 23 |
    24 | 25 |
    -------------------------------------------------------------------------------- /plugins/BMWConnect/HM-Sec-SCo.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"remote_dev_master","parameter":[{"flags":1,"tab_order":0,"name":"CYCLIC_INFO_MSG","type":"BOOL","vdefault":0},{"flags":1,"tab_order":1,"name":"SABOTAGE_MSG","type":"BOOL","vdefault":0},{"flags":1,"tab_order":2,"name":"LOCAL_RESET_DISABLE","type":"BOOL","vdefault":0},{"type":"INTEGER","vdefault":6,"min":1,"flags":1,"max":10,"tab_order":3,"name":"TRANSMIT_DEV_TRY_MAX"}]}],"channels":[{"flags":3,"paramsets":[{"name":"MASTER","id":"maint_ch_master","parameter":[]},{"name":"VALUES","id":"maint_ch_values","parameter":[{"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0},{"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1},{"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2},{"flags":9,"operations":5,"name":"LOWBAT","type":"BOOL","tab_order":3},{"type":"INTEGER","max":127,"min":0,"flags":0,"tab_order":4,"name":"AES_KEY","operations":1},{"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":5},{"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":6},{"flags":9,"operations":5,"name":"DEVICE_IN_BOOTLOADER","type":"BOOL","tab_order":7},{"flags":9,"operations":5,"name":"UPDATE_PENDING","type":"BOOL","tab_order":8}]}],"type":"MAINTENANCE","adress":"0","direction":2},{"flags":1,"paramsets":[{"name":"MASTER","id":"sc_ch_master","parameter":[{"flags":1,"tab_order":0,"name":"MSG_FOR_POS_B","type":"ENUM","valuelist":["NO_MSG","CLOSED","OPEN"]},{"flags":1,"tab_order":1,"name":"MSG_FOR_POS_A","type":"ENUM","valuelist":["NO_MSG","CLOSED","OPEN"]},{"flags":3,"tab_order":2,"name":"AES_ACTIVE","type":"BOOL","vdefault":0},{"unit":"s","vdefault":0,"min":0,"tab_order":3,"flags":1,"max":7620,"name":"EVENT_DELAYTIME","type":"FLOAT"},{"type":"INTEGER","vdefault":6,"min":1,"flags":1,"max":10,"tab_order":4,"name":"TRANSMIT_TRY_MAX"}]},{"name":"VALUES","id":"sc_ch_values","parameter":[{"flags":1,"control":"DOOR_SENSOR.STATE","operations":5,"name":"STATE","type":"BOOL","tab_order":0},{"operations":5,"type":"ENUM","valuelist":["NO_ERROR","SABOTAGE"],"flags":9,"tab_order":1,"name":"ERROR","control":"NONE"},{"flags":1,"control":"NONE","operations":5,"name":"LOWBAT","type":"BOOL","tab_order":2},{"flags":3,"operations":4,"name":"INSTALL_TEST","type":"","tab_order":3}]},{"name":"LINK","id":"sc_ch_link","parameter":[{"flags":1,"tab_order":0,"name":"PEER_NEEDS_BURST","type":"BOOL","vdefault":0},{"flags":1,"tab_order":1,"name":"EXPECT_AES","type":"BOOL","vdefault":0}]}],"type":"SHUTTER_CONTACT","adress":"1","direction":2}],"type":"HM-Sec-SCo","version":41} -------------------------------------------------------------------------------- /plugins/BMWConnect/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - BMW Connect 2 | 3 | This plugin fetches the battery level of your electical BMW and reports this to the CCU as a filling sensor. 4 | 5 | You have to setup your connected drive credentials at the plugin settings. 6 | The plugin creates a separate filling sensor for each of your vehicles (if you own more than one ;o) -------------------------------------------------------------------------------- /plugins/BMWConnect/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var BMWConnectPlatform = require(path.join(__dirname, '/BMWConnectPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new BMWConnectPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/BMWConnect/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-bmwconnect", 3 | "version": "0.0.3", 4 | "description": "Virtual Plugin - BMW Connect", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/BMWConnect/test.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require("fs"); 3 | const util = require("util"); 4 | const BMWConnectedDrive = require(path.join(__dirname , 'BMWConnectedDrive.js')).BMWConnectedDrive 5 | 6 | let cd = new BMWConnectedDrive('yourMail','yourPassword',console) 7 | cd.login(function(){ 8 | cd.getVehicles(function(list){ 9 | if (list.length > 0) { 10 | let h = list[0] 11 | cd.getVehicleData(h,function(data){ 12 | console.log(h) 13 | }) 14 | } 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /plugins/Backup/index.js: -------------------------------------------------------------------------------- 1 | var BackupPlatform = require(__dirname + '/BackupPlatform.js'); 2 | 3 | 4 | module.exports = function(server, name, logger, instance) { 5 | 6 | this.name = name; 7 | this.instance = instance; 8 | this.initialized = false; 9 | this.platform = new BackupPlatform(this, name, server, logger, instance); 10 | this.platform.init(); 11 | 12 | 13 | this.handleConfigurationRequest = function(dispatched_request) { 14 | this.platform.handleConfigurationRequest(dispatched_request); 15 | }; 16 | } -------------------------------------------------------------------------------- /plugins/Backup/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-backupservice", 3 | "version": "0.0.1", 4 | "description": "A BackupService for HVL", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface": ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "node-schedule": "1.3.2", 23 | "dropbox-v2-api": "2.4.11" 24 | } 25 | } -------------------------------------------------------------------------------- /plugins/CCUDutyCycle/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - CCU DutyCycle 2 | 3 | this plugin fetches and logs the ccu dutycycle -------------------------------------------------------------------------------- /plugins/CCUDutyCycle/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var CCUDutyCycle = require(path.join(__dirname, '/CCUDutyCycle')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new CCUDutyCycle(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/CCUDutyCycle/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-ccudutycylcle", 3 | "version": "0.0.10", 4 | "description": "Virtual Plugin - CCUDutyCycle", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/CCUDutyCycle" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.2.2" 19 | }, 20 | 21 | "dependencies": { 22 | "group-array":"0.3.2", 23 | "moment":"2.19.3", 24 | "nedb-logger":"0.1.0", 25 | "nedb" : "1.8.0" 26 | } 27 | } -------------------------------------------------------------------------------- /plugins/CCUDutyCycle/www/list.json: -------------------------------------------------------------------------------- 1 | $list$ -------------------------------------------------------------------------------- /plugins/CCUDutyCycle/www/list_dc_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 | $adress$ 3 | $type$ 4 | $dutycycle$ 5 | 6 |
    -------------------------------------------------------------------------------- /plugins/CleanOMat980/GuidePluginRoomba980.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/CleanOMat980/GuidePluginRoomba980.pdf -------------------------------------------------------------------------------- /plugins/CleanOMat980/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - CleanOMat980 2 | 3 | this plugin allows you to connect a RoomBa980 to your CCU 4 | -------------------------------------------------------------------------------- /plugins/CleanOMat980/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var CleanOMat980Platform = require(path.join(__dirname, '/CleanOMat980Platform.js')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new CleanOMat980Platform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/CleanOMat980/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-cleanomat980", 3 | "version": "0.0.23", 4 | "description": "Virtual Plugin - CleanOMat980", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.50" 19 | }, 20 | 21 | "dependencies": { 22 | "dorita980":">=3.0.11" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/DashButton/HM-PB-2-FM.json: -------------------------------------------------------------------------------- 1 | {"paramsets":[{"name":"MASTER","id":"remote_dev_master","parameter":[{"flags":1,"tab_order":0,"name":"DEVICE_LED_MODE","type":"ENUM","valuelist":["OFF","ON"]},{"flags":1,"tab_order":1,"name":"LOCAL_RESET_DISABLE","type":"BOOL","vdefault":0}]}],"channels":[{"flags":3,"paramsets":[{"name":"MASTER","id":"maint_ch_master","parameter":[]},{"name":"VALUES","id":"maint_ch_values","parameter":[{"flags":9,"operations":5,"name":"UNREACH","type":"BOOL","tab_order":0},{"flags":24,"operations":7,"name":"STICKY_UNREACH","type":"BOOL","tab_order":1},{"flags":9,"operations":5,"name":"CONFIG_PENDING","type":"BOOL","tab_order":2},{"flags":9,"operations":5,"name":"LOWBAT","type":"BOOL","tab_order":3},{"type":"INTEGER","max":127,"min":0,"flags":0,"tab_order":4,"name":"AES_KEY","operations":1},{"flags":1,"operations":5,"name":"RSSI_DEVICE","type":"INTEGER","tab_order":5},{"flags":1,"operations":5,"name":"RSSI_PEER","type":"INTEGER","tab_order":6},{"flags":9,"operations":5,"name":"DEVICE_IN_BOOTLOADER","type":"BOOL","tab_order":7},{"flags":9,"operations":5,"name":"UPDATE_PENDING","type":"BOOL","tab_order":8}]}],"type":"MAINTENANCE","adress":"0","direction":2},{"flags":1,"paramsets":[{"name":"MASTER","id":"remote_ch_master","parameter":[{"unit":"s","vdefault":0,"min":0,"tab_order":0,"flags":1,"max":1,"name":"LONG_PRESS_TIME","type":"FLOAT"},{"flags":3,"tab_order":1,"name":"AES_ACTIVE","type":"BOOL","vdefault":0}]},{"name":"VALUES","id":"remote_ch_values","parameter":[{"flags":1,"control":"BUTTON.SHORT","operations":6,"name":"PRESS_SHORT","type":"ACTION","tab_order":0},{"flags":1,"control":"BUTTON.LONG","operations":6,"name":"PRESS_LONG","type":"ACTION","tab_order":1},{"flags":3,"operations":4,"name":"PRESS_LONG_RELEASE","type":"","tab_order":2},{"flags":3,"operations":4,"name":"PRESS_CONT","type":"","tab_order":3},{"flags":3,"operations":4,"name":"INSTALL_TEST","type":"","tab_order":4}]},{"name":"LINK","id":"remote_ch_link","parameter":[{"flags":1,"tab_order":0,"name":"PEER_NEEDS_BURST","type":"BOOL","vdefault":0},{"flags":1,"tab_order":1,"name":"EXPECT_AES","type":"BOOL","vdefault":0}]}],"type":"KEY","adress":["1","2"],"direction":2}],"type":"HM-PB-2-FM","version":41} -------------------------------------------------------------------------------- /plugins/DashButton/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Dash Button 2 | 3 | this will currently not work on a Raspberrymatic ! 4 | 5 | first you have to 6 | 7 | ``` 8 | sudo apt-get install libpcap-dev 9 | sudo apt-get install git 10 | sudo setcap 'cap_net_raw,cap_net_admin+eip' $(readlink -f $(which node)) 11 | ``` 12 | 13 | 14 | 15 | #### First Time Dash Setup 16 | 17 | Follow Amazon's instructions to configure your button to send messages when you push them but not actually order anything. When you get a Dash button, Amazon gives you a list of setup instructions to get going. Just follow this list of instructions, but don’t complete the final step (#3 I think) **Do not select a product, just exit the app**. 18 | -------------------------------------------------------------------------------- /plugins/DashButton/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var DashButtonPlatform = require(path.join(__dirname, '/DashButtonPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new DashButtonPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/DashButton/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-dashbutton", 3 | "version": "0.0.4", 4 | "description": "Virtual Plugin - DashButton", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/DashButton" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.58" 19 | }, 20 | 21 | "remark":"Please first read the manual https://github.com/thkl/Homematic-Virtual-Interface/blob/master/plugins/DashButton/README.md", 22 | "dependencies": { 23 | "node-dash-button":"0.6.1", 24 | "pcap": "git+https://github.com/mranney/node_pcap.git#d920204745c8b00ef4b7a3fe27d902b263cdb70f" 25 | } 26 | } -------------------------------------------------------------------------------- /plugins/DashButton/stor.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/DashButton/stor.js -------------------------------------------------------------------------------- /plugins/DashButton/www/de-de/list_device_tmp_new.html: -------------------------------------------------------------------------------- 1 | 2 | $device_id$ 3 | $device_mac$ 4 | 5 | -------------------------------------------------------------------------------- /plugins/DashButton/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $device_id$ 3 | $device_mac$ 4 | 5 | -------------------------------------------------------------------------------- /plugins/DashButton/www/list_device_tmp_new.html: -------------------------------------------------------------------------------- 1 | 2 | $device_id$ 3 | $device_mac$ 4 | 5 | -------------------------------------------------------------------------------- /plugins/DenonAVR/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var DenonAVR = require(path.join(__dirname, '/DenonAVR')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new DenonAVR(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/DenonAVR/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-denonavr", 3 | "version": "0.0.6", 4 | "description": "Virtual Plugin - DenonAVR", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "telnet-client":"1.4.6" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/DenonAVRHTTP/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var DenonAVRHTTP = require(path.join(__dirname, '/DenonAVRHTTP')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new DenonAVRHTTP(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /plugins/DenonAVRHTTP/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-denonavrhttp", 3 | "version": "0.0.5", 4 | "description": "Virtual Plugin - DenonAVRHTTP", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | } 23 | } -------------------------------------------------------------------------------- /plugins/DummyPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Dummy 2 | 3 | this is a good way to start writing a plugin -------------------------------------------------------------------------------- /plugins/DummyPlugin/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var DummyPlatform = require(path.join(__dirname, '/DummyPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new DummyPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/DummyPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-huedevice", 3 | "version": "0.0.4", 4 | "description": "Virtual Plugin - Dummy", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.58" 19 | }, 20 | 21 | "dependencies": { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/FlowerPower/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - FlowerPower 2 | 3 | connect your Parrot Flower Power Sticks to your ccu 4 | 5 | Note: You have to install BT Drivers before activating the plugin 6 | Raspberry : 7 | sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev 8 | and make sure everything is working 9 | hcitool lescan 10 | 11 | you should see some mac like adresses 12 | 13 | if not (operation not permitted) you have to make bt accessible for all users 14 | sudo setcap cap_net_raw+ep /usr/bin/hcitool (see https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=151858) 15 | and 16 | sudo setcap cap_net_raw+eip $(eval readlink -f `which node`) 17 | This grants the node binary cap_net_raw privileges, so it can start/stop BLE advertising. 18 | 19 | -------------------------------------------------------------------------------- /plugins/FlowerPower/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var FlowerPowerPlatform = require(path.join(__dirname, '/FlowerPowerPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new FlowerPowerPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/FlowerPower/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-flowerpowerdevice", 3 | "version": "0.0.3", 4 | "description": "Virtual Plugin - Parot FlowerPower", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "flower-power":"0.3.0", 23 | "async": "^1.4.2" 24 | } 25 | } -------------------------------------------------------------------------------- /plugins/HttpPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - HttpPlatform 2 | 3 | You can add http calls to your ccu as a 19 Key Remote Control 4 | Please note, due to restrictions in CCU WebGUI you have to change some chars in the URL Field 5 | Substitude = with ~61 and & with ~26 6 | 7 | As an example : http://192.168.1.1/url/index.php?cmd=welcome&item=0&room=wz should set as http://192.168.1.1/url/index.php?cmd~61welcome~26item~610~26room~61wz -------------------------------------------------------------------------------- /plugins/HttpPlugin/index.js: -------------------------------------------------------------------------------- 1 | var HttpPlatform = require(__dirname + '/HttpPlatform'); 2 | 3 | 4 | module.exports = function(server,name,logger,instance) { 5 | 6 | this.name = name; 7 | this.instance = instance; 8 | this.initialized = false; 9 | this.platform = new HttpPlatform(this,name,server,logger,instance); 10 | this.platform.init(); 11 | 12 | 13 | this.handleConfigurationRequest = function(dispatched_request) { 14 | this.platform.handleConfigurationRequest(dispatched_request); 15 | }; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /plugins/HttpPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-httpdevice", 3 | "version": "0.0.8", 4 | "description": "Virtual Plugin - HttpPlatform", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/HttpPlugin" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | "remark":"Just a testnote", 21 | 22 | "dependencies": { 23 | 24 | } 25 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/HM-LC-Dim1T-Pl.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/HuePlugin/HM-LC-Dim1T-Pl.json -------------------------------------------------------------------------------- /plugins/HuePlugin/HueDayLightSensor.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var hueconf = require("node-hue-api"); 4 | const EventEmitter = require('events'); 5 | const util = require('util'); 6 | 7 | var HomematicDevice; 8 | 9 | var HueDayLightSensor = function(plugin, hueApi, sensor, serialprefix) { 10 | 11 | 12 | var that = this; 13 | this.api = hueApi; 14 | this.log = plugin.log; 15 | this.bridge = plugin.server.getBridge(); 16 | this.plugin = plugin; 17 | 18 | HomematicDevice = plugin.server.homematicDevice; 19 | 20 | this.sensorId = sensor["id"]; 21 | 22 | this.config = plugin.server.configuration; 23 | this.log.debug("Setup new HUE Daylight Sensor %s", serialprefix + this.lightId); 24 | this.serial = sensor["uniqueid"]; 25 | 26 | // Just a Dummy for Sensor Test 27 | EventEmitter.call(this); 28 | 29 | } 30 | 31 | util.inherits(HueDayLightSensor, EventEmitter); 32 | 33 | 34 | HueDayLightSensor.prototype.refreshSensor = function() { 35 | 36 | 37 | } 38 | 39 | 40 | module.exports = { 41 | HueDayLightSensor: HueDayLightSensor 42 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/Localizable.strings: -------------------------------------------------------------------------------- 1 | {"strings": { 2 | "de-de": { 3 | "The plugin is searching for your bridge ....":"Das Plugin sucht nach der Bridge", 4 | "No Message from your Hue Plugin. Yet ! Last Update : ":"Keine Meldungen vom Hue Plugin. Bis jetzt. Letztes Update : ", 5 | "Currently the plugin is not able to connect to the bridge. Please press the big button on your bridge to authorized the plugin.":"Das Plugin kann sich nicht mit der Hue Bridge verbinden. Drücke den großen Button auf der Bridge um den Zugriff zu genehmigen" 6 | 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Hue Plugin 2 | Add your HUE Lamps as a RGBW Device to HM 3 | 4 | 5 | * all your Hue lamps will shown as a RGBW device at your ccu's inbox 6 | * all your groups will also shown as a RGBW device 7 | * all your scenes will mapped to remote control devices -------------------------------------------------------------------------------- /plugins/HuePlugin/index.js: -------------------------------------------------------------------------------- 1 | var HuePlatform = require(__dirname + '/HuePlatform.js'); 2 | 3 | 4 | module.exports = function(server,name,logger,instance) { 5 | 6 | this.name = name; 7 | this.platform = new HuePlatform(this,name,server,logger,instance); 8 | this.platform.init(); 9 | this.instance = instance; 10 | this.initialized = false; 11 | 12 | 13 | this.handleConfigurationRequest = function(dispatched_request) { 14 | this.platform.handleConfigurationRequest(dispatched_request); 15 | }; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /plugins/HuePlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-huedevice", 3 | "version": "0.0.50", 4 | "description": "Virtual Hue Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/HuePlugin" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface": ">=0.2.60" 19 | }, 20 | 21 | "dependencies": { 22 | "node-hue-api": "4.0.3" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/bluelounge.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"static", 3 | "frames": [ 4 | {"bulbs":0, "transition": 5, "hue": 265, "saturation": 100, "brightness": 20} 5 | ] 6 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/candle.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | {"bulbs":1, "transition":[2,5], "brightness": [30,40], "saturation":85, "hue":[45,50]}, 6 | {"bulbs":0, "pause":[10,30]}, 7 | {"bulbs":1, "transition":[1,4], "brightness": [30,40], "saturation":85, "hue":[50,70]}, 8 | {"bulbs":0, "pause":[30,50]} 9 | ], 10 | 11 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 12 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/cinema.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loops" : false, 4 | "frames" : [ 5 | {"bulbs":0, "pause": 20}, 6 | {"bulbs":0, "transition": 5, "hue": 43, "saturation": 70, "brightness": 80}, 7 | {"bulbs":0, "pause": 200}, 8 | {"bulbs":0, "transition": 20, "brightness": 10, "saturation":70, "hue":43}, 9 | {"bulbs":0, "pause": 400}, 10 | {"bulbs":0, "transition": 1, "brightness": 0, "saturation":70, "hue":43} 11 | ], 12 | "stopframe" : {"bulbs":0, "brightness": 0, "saturation":0, "hue":43, "transition": 20} 13 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/clouds.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | 6 | {"bulbs":0, "transition":[15,75], "brightness": 100, "saturation":63, "hue":43}, 7 | {"bulbs":0, "pause":[200,550]}, 8 | {"bulbs":0, "transition":[15,75], "brightness": 65, "saturation": 72, "hue": 43}, 9 | {"bulbs":0, "pause":[200,550]} 10 | ], 11 | 12 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 13 | 14 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/clouds_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | {"bulbs":0, "transition": [15,50], "brightness": 100, "saturation":65, "hue":18}, 6 | {"bulbs":0, "pause": [200, 550]}, 7 | {"bulbs":0, "transition": [15, 50], "brightness": 70, "saturation":75, "hue":18}, 8 | {"bulbs":0, "pause": [200, 550]} 9 | ], 10 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 11 | 12 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/disco.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | 6 | {"bulbs":1, "transition": 2, "brightness":100, "saturation": 100, "hue": [0, 345]}, 7 | {"bulbs": 0, "pause": 5}, 8 | {"bulbs":1, "transition": 2, "brightness":100, "saturation": 100, "hue": [0, 345]}, 9 | {"bulbs": 0, "pause": 10}, 10 | {"bulbs":1, "transition": 20, "brightness":100, "saturation": 100, "hue": [0, 345]}, 11 | {"bulbs": 0, "pause": 400} 12 | ], 13 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 14 | 15 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/fader.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | 6 | {"bulbs":1, "transition": 2, "brightness":100, "saturation": 100, "hue": [0, 345]}, 7 | {"bulbs": 0, "pause": 45}, 8 | {"bulbs":1, "transition": 50, "brightness":25, "saturation": 100, "hue": [0, 345]}, 9 | {"bulbs": 0, "pause": 100} 10 | 11 | ], 12 | 13 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 14 | 15 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/fireplace.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | {"bulbs":1, "transition":[7,13], "brightness": [30,50], "saturation":100, "hue":[5,60]}, 6 | {"bulbs":0, "pause":[100,500]}, 7 | {"bulbs":0, "transition":[1,3], "brightness": [30,50], "saturation":100, "hue":[30,50]}, 8 | {"bulbs":0, "pause":[5,10]}, 9 | {"bulbs":0, "transition":[5,10], "brightness": [30,50], "saturation":100, "hue":[30,50]}, 10 | {"bulbs":0, "pause":[5,10]}, 11 | {"bulbs":0, "transition":[1,3], "brightness": [30,50], "saturation":100, "hue":[30,50]}, 12 | {"bulbs":0, "pause":[5,10]} 13 | ], 14 | 15 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 16 | 17 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/fluroscent.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":false, 4 | "frames": [ 5 | {"bulbs":0, "pause": 20}, 6 | {"bulbs":1, "transition": 1, "brightness": 5, "hue":265, "saturation":100}, 7 | {"bulbs":0, "pause": [10,25]}, 8 | {"bulbs":1, "transition": 1, "brightness": 40, "hue":225, "saturation":50}, 9 | {"bulbs":0, "pause": [5,10]}, 10 | {"bulbs":1, "transition": 1, "brightness": 70, "hue":225, "saturation":50}, 11 | {"bulbs":0, "pause": [5,10]}, 12 | {"bulbs":1, "transition": 1, "brightness": 100, "hue":225, "saturation":50} 13 | ] 14 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/old_lights.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"static", 3 | "frames": [ 4 | {"bulbs":0, "saturation": 72, "hue": 43, "brightness": 65, "transition": 6} 5 | ] 6 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/pinklounge.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"static", 3 | "frames": [ 4 | {"bulbs":0, "transition": 5, "hue": 310, "saturation": 100, "brightness": 25} 5 | ] 6 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/random.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"static", 3 | "frames": [ 4 | {"bulbs":1, "transition": 5, "hue": [0,360], "saturation": 100, "brightness": 100} 5 | ] 6 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/redlounge.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"static", 3 | "frames": [ 4 | {"bulbs":0, "transition": 5, "hue": 0, "saturation": 100, "brightness": 25} 5 | ] 6 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/space_explosion.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":false, 4 | "frames": [ 5 | {"bulbs":0, "pause": 20}, 6 | {"bulbs":0, "transition": 2, "brightness": 60, "hue":50, "saturation":60}, 7 | {"bulbs":0, "pause": 25}, 8 | {"bulbs":0, "transition": 0, "brightness": 100, "hue":50, "saturation":30}, 9 | {"bulbs":0, "pause": 10}, 10 | {"bulbs":0, "transition": 20, "brightness": 20, "hue":25, "saturation":100}, 11 | {"bulbs":0, "pause": 10}, 12 | {"bulbs":0, "transition": 20, "brightness": 5, "hue":25, "saturation":30} 13 | 14 | ] 15 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/scenes/torch.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode":"fx", 3 | "loop":true, 4 | "frames": [ 5 | {"bulbs":0, "transition":[5,8], "brightness": [33,50], "saturation":100, "hue":[245,260]}, 6 | {"bulbs":0, "pause":50} 7 | ], 8 | "stopframe": {"bulbs":0, "transition":5, "brightness": 0, "saturation":0, "hue":0} 9 | 10 | } -------------------------------------------------------------------------------- /plugins/HuePlugin/www/de-de/list_efx_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 |

    $efxs.name$

    3 | Efx start in der CCU: Gerät HUEFX001:4 Datenpunkt COMMAND mit $efxs.name$.EffektName füllen 4 |
    5 |
    6 | Szene starten 7 | 8 |
    9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 | 17 |
    18 | 19 | 20 | 21 |
    22 |
    23 | Server löschen 24 | 25 |
    26 | 27 |
    28 | Lampen 29 |
    30 | 31 | $efxs.lights$ 32 | 33 |
    -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_efx_light_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 | [$lamp.inuse$] 4 | $lamp.name$ 5 | 6 |
    7 | 8 | -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_efx_slist_tmp.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_efx_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 |

    $efxs.name$

    3 | Efx start from CCU: fill datapoint COMMAND of device HUEFX001:4 with $efxs.name$.nameOfEffect 4 |
    5 |
    6 | Start scene 7 | 8 |
    9 | 10 | 11 | 12 | 13 | 14 |
    15 |
    16 | 17 |
    18 | 19 | 20 | 21 |
    22 |
    23 | Remove Server 24 | 25 |
    26 | 27 |
    28 | Lampen 29 |
    30 | 31 | $efxs.lights$ 32 | 33 |
    -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_group_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 | $published$ $lamp_hmdevice$ 3 | $lamp_name$ 4 | -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_lamp_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $lamp_hmdevice$ 3 | $lamp_name$ 4 | -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_scene_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $published$ $lamp_hmdevice$ 3 | $lamp_name$ 4 | -------------------------------------------------------------------------------- /plugins/HuePlugin/www/list_sensor_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $sensor_hmdevice$ 3 | $sensor_name$ 4 | -------------------------------------------------------------------------------- /plugins/IkeaTradfri/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Ikea Tradfri 2 | 3 | this plugins will allow you to control your Tradfri Bulbs via CCU -------------------------------------------------------------------------------- /plugins/IkeaTradfri/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var TradfriPlatform = require(path.join(__dirname, '/TradfriPlatform.js')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new TradfriPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/IkeaTradfri/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-tradfridevice", 3 | "version": "0.0.21", 4 | "description": "Virtual Plugin - Ikea Tradfri", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/IkeaTradfri" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=6.0.0", 18 | "homematic-virtual-interface": ">=0.2.50" 19 | }, 20 | 21 | "remark": "Version > 0.0.17 Requires NodeJS >= 6.x", 22 | 23 | "dependencies": { 24 | "node-tradfri-client": "2.1.0" 25 | } 26 | } -------------------------------------------------------------------------------- /plugins/IkeaTradfri/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $device_hmdevice$ 3 | $device_name$ 4 | $device_type$ 5 | $device_spectrum$ 6 | -------------------------------------------------------------------------------- /plugins/IkeaTradfri/www/list_groups_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $group_hmdevice$ 3 | $group_name$ 4 | -------------------------------------------------------------------------------- /plugins/IkeaTradfri/www/list_scenes_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $scene_group_id$ 3 | $scene_group_name$ 4 | $group_scene_name$ 5 | $group_hm_ch$ 6 | -------------------------------------------------------------------------------- /plugins/LightifyPlugin/LightifyPlatform.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LightifyPlugin/LightifyPlatform.js -------------------------------------------------------------------------------- /plugins/LightifyPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Lightify Plugin 2 | Add your Lightify Devices HM 3 | 4 | Please setup the following Data in config.json 5 | 6 | "ip": "" 7 | -------------------------------------------------------------------------------- /plugins/LightifyPlugin/index.js: -------------------------------------------------------------------------------- 1 | var LightifyPlatform = require(__dirname + '/LightifyPlatform'); 2 | 3 | module.exports = function(server,name,logger,instance) { 4 | 5 | this.name = name; 6 | this.instance = instance; 7 | this.initialized = false; 8 | this.platform = new LightifyPlatform(this,name,server,logger,instance); 9 | this.platform.init(); 10 | 11 | 12 | this.handleConfigurationRequest = function(dispatched_request) { 13 | this.platform.handleConfigurationRequest(dispatched_request); 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /plugins/LightifyPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-lightifydevice", 3 | "version": "0.0.17", 4 | "description": "Virtual Lightify Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=6.0.0", 18 | "homematic-virtual-interface" : ">=0.2.53" 19 | }, 20 | 21 | "dependencies": { 22 | "node-lightify": "latest" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/Logging/LoggingPlatform.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const path = require('path') 4 | const fs = require('fs') 5 | var appRoot = path.dirname(require.main.filename) 6 | if (appRoot.endsWith('bin')) { 7 | appRoot = appRoot + '/../lib' 8 | } 9 | 10 | if (appRoot.endsWith('node_modules/daemonize2/lib')) { 11 | appRoot = path.join(appRoot, '..', '..', '..', 'lib') 12 | 13 | if (!fs.existsSync(path.join(appRoot, 'HomematicVirtualPlatform.js'))) { 14 | appRoot = path.join(path.dirname(require.main.filename), '..', '..', '..', 'node_modules', 'homematic-virtual-interface', 'lib') 15 | } 16 | } 17 | 18 | appRoot = path.normalize(appRoot); 19 | 20 | var HomematicVirtualPlatform = require(appRoot + '/HomematicVirtualPlatform.js') 21 | 22 | var util = require('util') 23 | var HomematicDevice 24 | var url = require('url') 25 | const sqlite3 = require('sqlite3') 26 | const uuidv4 = require('uuid/v4') 27 | 28 | function LoggingPlatform(plugin, name, server, log, instance) { 29 | LoggingPlatform.super_.apply(this, arguments) 30 | HomematicDevice = server.homematicDevice 31 | } 32 | 33 | util.inherits(LoggingPlatform, HomematicVirtualPlatform) 34 | 35 | 36 | LoggingPlatform.prototype.init = function() { 37 | // Open Database 38 | 39 | let that = this 40 | this.configuration = this.server.configuration 41 | this.hm_layer = this.server.getBridge() 42 | this.log.info('Init %s', this.name) 43 | 44 | let dbPath = path.join(this.configuration.storagePath(), 'logging.db') 45 | this.db = new sqlite3.Database(dbPath, (err) => { 46 | if (err) { 47 | that.log.error('Could not connect to database', err) 48 | } else { 49 | that.log.info('Connected to database') 50 | } 51 | }) 52 | // Check Tables 53 | this.db.run('CREATE TABLE IF NOT EXISTS "log" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "ts" datetime, "if" varchar (10) ,"address" varchar(30),"datap" varchar(20),"value" varchar(128));') 54 | let sql = 'INSERT INTO "log" ("ts", "if", "address", "datap", "value") VALUES (?, ?, ?, ?, ?);' 55 | this.bridge.addRPCClient('BidCos-RF') 56 | 57 | this.hm_layer.addEventNotifier(function() { 58 | that.hm_layer.on('ccu_datapointchange_event', function(strIf, channel, datapoint, value) { 59 | // Add Data 60 | that.db.run(sql, [new Date().toISOString(), strIf, channel, datapoint, value]) 61 | }) 62 | that.log.debug('Done adding Event Listener') 63 | }) 64 | 65 | } 66 | 67 | module.exports = LoggingPlatform -------------------------------------------------------------------------------- /plugins/Logging/index.js: -------------------------------------------------------------------------------- 1 | var LoggingPlatform = require(__dirname + '/LoggingPlatform.js'); 2 | 3 | 4 | module.exports = function(server, name, logger, instance) { 5 | 6 | this.name = name; 7 | this.instance = instance; 8 | this.initialized = false; 9 | this.platform = new LoggingPlatform(this, name, server, logger, instance); 10 | this.platform.init(); 11 | 12 | 13 | this.handleConfigurationRequest = function(dispatched_request) { 14 | this.platform.handleConfigurationRequest(dispatched_request); 15 | }; 16 | } -------------------------------------------------------------------------------- /plugins/LogicPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface 2 | Logic Bridge 3 | 4 | adapted from https://github.com/hobbyquaker/mqtt-scripts/ 5 | 6 | put your .js scripts into home/pi/.hm_virtual_interface/scripts 7 | 8 | -------------------------------------------------------------------------------- /plugins/LogicPlugin/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogicPlugin/index.js -------------------------------------------------------------------------------- /plugins/LogicPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-logicmanager", 3 | "version": "0.0.20", 4 | "description": "Virtual Logic Manager", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/LogicPlugin" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface": ">=0.2.2" 19 | }, 20 | 21 | "dependencies": { 22 | "node-schedule": "latest", 23 | "suncalc": "1.8.0", 24 | "promise": "latest", 25 | "moment": "2.19.3", 26 | "nedb-logger": "0.1.0", 27 | "nedb": "1.8.0", 28 | "uuid": "latest", 29 | "better-sqlite3": "5.4.3" 30 | }, 31 | 32 | "files": [ 33 | "LogicalPlatform.js", 34 | "README.md", 35 | "index.js", 36 | "www/" 37 | ] 38 | 39 | } -------------------------------------------------------------------------------- /plugins/LogicPlugin/www/de-de/list_script_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 | $script.name$ 3 | $script.desc$ 4 | 5 | 6 |
    -------------------------------------------------------------------------------- /plugins/LogicPlugin/www/list_item_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $item$ 3 | -------------------------------------------------------------------------------- /plugins/LogicPlugin/www/list_script_tmp.html: -------------------------------------------------------------------------------- 1 |
    2 | $script.name$ 3 | $script.desc$ 4 | 5 | 6 |
    -------------------------------------------------------------------------------- /plugins/LogitechHarmony/DispatchedRequest.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogitechHarmony/DispatchedRequest.js -------------------------------------------------------------------------------- /plugins/LogitechHarmony/FakeHueDevice.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogitechHarmony/FakeHueDevice.js -------------------------------------------------------------------------------- /plugins/LogitechHarmony/GuidePluginHarmony.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogitechHarmony/GuidePluginHarmony.pdf -------------------------------------------------------------------------------- /plugins/LogitechHarmony/HarmonyClient.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogitechHarmony/HarmonyClient.js -------------------------------------------------------------------------------- /plugins/LogitechHarmony/HarmonyRokuManager.js: -------------------------------------------------------------------------------- 1 | // 2 | // HarmonyRokuManager.js 3 | // Homematic Virtual Interface Plugin 4 | // 5 | 6 | 7 | 8 | "use strict"; 9 | 10 | var http = require('http'); 11 | var http = require('http'); 12 | var httpHeaders = require('http-headers'); 13 | 14 | var HarmonyRokuManager = function (plugin) { 15 | this.log = plugin.log; 16 | this.plugin = plugin; 17 | this.server = this.plugin.server; 18 | this.log.debug("RokuManager init") 19 | } 20 | 21 | HarmonyRokuManager.prototype.addRoku = function(roku) { 22 | this.log.info("RokuManager add Roku %s",roku.rokuInstance) 23 | this.server.addSSDPService({"owner":"roku","st":"urn:schemas-upnp-org:device:basic:1","payload":roku.ssdp_response}) 24 | } 25 | 26 | HarmonyRokuManager.prototype.startDiscovery = function() { 27 | this.log.debug("RokuManager gtfo") 28 | } 29 | 30 | HarmonyRokuManager.prototype.unref = function() { 31 | } 32 | 33 | HarmonyRokuManager.prototype.stopDiscovery = function() { 34 | 35 | } 36 | 37 | 38 | module.exports = { 39 | HarmonyRokuManager : HarmonyRokuManager 40 | } -------------------------------------------------------------------------------- /plugins/LogitechHarmony/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface Harmony Plugin 2 | 3 | 4 | * provides a Harmony Client to map all activities into a HM Remote 5 | * provides a transparent HUE Bridge for fake lights which are mapped as dimmer or switch to your ccu. you can control theese devices via your remote 6 | 7 | ``` 8 | { 9 | "type":"LogitechHarmony", 10 | "name":"Harmony", 11 | "port":7001, 12 | "hue_plugin_name":"HueMain", 13 | "hub_ip":"192.168.foobar" 14 | } 15 | ``` 16 | 17 | If you got a real HUE Bridge, setup the hue_plugin_name to the name of the hue plugin of this layer. So all your lights will also be mapped. This is because the Harmony Hub can only handle on HUE Bridge. -------------------------------------------------------------------------------- /plugins/LogitechHarmony/index.js: -------------------------------------------------------------------------------- 1 | var HarmonyPlatform = require(__dirname + '/HarmonyPlatform'); 2 | 3 | 4 | 5 | module.exports = function(server,name,logger,instance) { 6 | 7 | this.name = name; 8 | this.instance = instance; 9 | this.platform = new HarmonyPlatform(this,name,server,logger,instance); 10 | this.platform.init(); 11 | 12 | this.handleConfigurationRequest = function(dispatched_request) { 13 | this.platform.handleConfigurationRequest(dispatched_request); 14 | }; 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/methods/createuser.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/LogitechHarmony/methods/createuser.js -------------------------------------------------------------------------------- /plugins/LogitechHarmony/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-harmonydevice", 3 | "version": "0.0.40", 4 | "description": "Virtual Harmony Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/LogitechHarmony" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface": ">=0.2.51" 19 | }, 20 | 21 | "dependencies": { 22 | "@harmonyhub/client": "1.0.5", 23 | "@harmonyhub/discover": "1.0.5", 24 | "http-headers": "latest", 25 | "uuid": "latest" 26 | } 27 | } -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/activity.html: -------------------------------------------------------------------------------- 1 | 2 | $ac_index$ - 3 | $ac_name$ 4 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/app.js: -------------------------------------------------------------------------------- 1 | var devicelist; 2 | var selectedtype; 3 | 4 | function loadObjects() { 5 | 6 | $("#devicelist").empty(); 7 | 8 | if ($("#type").val()==3) { 9 | 10 | selectedtype = 3; 11 | $.getJSON( "?do=device.list", function( data ) { 12 | var items = []; 13 | devicelist = data; 14 | $.each( data, function( key, val ) { 15 | items.push( "
  • " + val.device + " / " + val.name + "
  • " ); 16 | }); 17 | 18 | var list = $( "
      ", { 19 | "class": "my-new-list", 20 | html: items.join( "" ) 21 | }); 22 | $("#devicelist").append($("
      ",{"class":"ph"}).append(list)); 23 | }); 24 | 25 | 26 | 27 | } 28 | 29 | if ($("#type").val()==4) { 30 | 31 | selectedtype = 4; 32 | $.getJSON( "?do=device.listprograms", function( data ) { 33 | var items = []; 34 | devicelist = data; 35 | $.each( data, function( key, val ) { 36 | items.push( "
    • " + val.device + " / " + val.name + "
    • " ); 37 | }); 38 | 39 | var list = $( "
        ", { 40 | "class": "my-new-list", 41 | html: items.join( "" ) 42 | }); 43 | $("#devicelist").append($("
        ",{"class":"ph"}).append(list)); 44 | }); 45 | 46 | 47 | } 48 | 49 | 50 | if ($("#type").val()==5) { 51 | 52 | selectedtype=5; 53 | $.getJSON( "?do=device.listvariables", function( data ) { 54 | var items = []; 55 | devicelist = data; 56 | $.each( data, function( key, val ) { 57 | items.push( "
      • " + val.device + " / " + val.name + "
      • " ); 58 | }); 59 | 60 | var list = $( "
          ", { 61 | "class": "my-new-list", 62 | html: items.join( "" ) 63 | }); 64 | $("#devicelist").append($("
          ",{"class":"ph"}).append(list)); 65 | }); 66 | 67 | 68 | } 69 | 70 | 71 | } 72 | 73 | function select_item(key) { 74 | var device = devicelist[key]; 75 | if (device) { 76 | if ((selectedtype==4) || (selectedtype==5)) { 77 | document.getElementById("device.device_2").innerHTML = device.name 78 | } else { 79 | document.getElementById("device.device_2").innerHTML = device.address 80 | document.getElementById("device.ctype").value = device.type; 81 | } 82 | document.getElementById("device.adress").value = device.address; 83 | document.getElementById("device.name").value = device.name; 84 | 85 | } else { 86 | console.log("No Device found for",key); 87 | } 88 | } -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list.json: -------------------------------------------------------------------------------- 1 | $list$ -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_lamp_ccu_object.html: -------------------------------------------------------------------------------- 1 | 2 | $lamp_index$ - 3 | $lamp_name$ 4 | $hm_device_type$ 5 | $adress$ 6 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_lamp_ccu_object_edit.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 |
          4 | 5 | 6 | 7 | 8 | 9 | $lamp_index$ - 10 | Name 11 | 16 | $adress$ [...] 17 | 18 | 19 | 20 |
          21 |
          22 | 23 |
          -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_lamp_fake.html: -------------------------------------------------------------------------------- 1 | 2 | $lamp_index$ - 3 | $lamp_name$ 4 | $hm_device_type$ 5 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_lamp_fake_edit.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 |
          4 | 5 | 6 | 7 | $lamp_index$ - 8 | Name 9 | Hm Type 13 | 14 | 15 |
          16 |
          17 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_lamp_real.html: -------------------------------------------------------------------------------- 1 | 2 | $lamp_index$ - 3 | $lamp_name$ 4 | -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/list_tmp_action.html: -------------------------------------------------------------------------------- 1 |
        • $action$
        • -------------------------------------------------------------------------------- /plugins/LogitechHarmony/www/roku.html: -------------------------------------------------------------------------------- 1 |
          2 |

          Harmony Fake Roku

          3 | $rokuList$ 4 |
          5 | -------------------------------------------------------------------------------- /plugins/MQTT/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - MQTT Plugin 2 | 3 | currently there is support for 4 | 5 | * Sonoff Basic 6 | * Sonoff Pow 7 | * Sonoff Touch 8 | 9 | Important: this plugin needs a connection to a mqtt broker for communication. You can install a node version on to the same Pi running HVL. 10 | See : http://www.mosca.io -------------------------------------------------------------------------------- /plugins/MQTT/devices/RGB_Pic.json: -------------------------------------------------------------------------------- 1 | { 2 | "subscribe" : ["%name%/group/$properties","%name%/stat","%name%/result"], 3 | "clazztype" : "SwitchDevice", 4 | "type" : "Switch", 5 | "hmdevice" : "HM-LC-SW1-FM", 6 | "channels" : { 7 | "0" : { 8 | "hm_channeltype" : "MAINTENANCE", 9 | "hm_datapoints" : ["UNREACH"], 10 | "settings" : { 11 | 12 | "UNREACH" : { 13 | "mqtt_topic_state" : "%name%/tele/LWT", 14 | "mqtt_payload_state" : "", 15 | "mqtt_representation_state" : {"online":false, "offline":true} 16 | } 17 | } 18 | }, 19 | "1" : { 20 | "hm_channeltype" : "SWITCH", 21 | "hm_datapoints" : ["STATE"], 22 | "settings" : { 23 | 24 | "STATE" : { 25 | 26 | "mqtt_payload_get" : "0|r", 27 | "mqtt_topic_get" : "%name%/result/0/RGB", 28 | "mqtt_representation_get" : {"127":true, "0":false}, 29 | 30 | 31 | "mqtt_topic_set" : "%name%/cmnd/0/RGB", 32 | "mqtt_representation_set" : {"true": "127,255,0,1" , "false": "0,0,0,1"}, 33 | 34 | "mqtt_topic_state" : "%name%/group/", 35 | "mqtt_payload_state" : "0|r", 36 | "mqtt_representation_state" : {"127":true, "0":false}, 37 | 38 | "mqtt_command_getstate" : "%name%/stat/0/RGB", 39 | "mqtt_topic_getstate" : "%name%/result/0/RGB", 40 | "mqtt_payload_getstate" : "r", 41 | "mqtt_representation_getstate" : {"127" : true , "0": false} 42 | 43 | 44 | 45 | } 46 | } 47 | 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /plugins/MQTT/devices/SonoffBasic.json: -------------------------------------------------------------------------------- 1 | { 2 | "subscribe" : ["stat/%name%","tele/%name%"], 3 | "clazztype" : "SwitchDevice", 4 | "type" : "Switch", 5 | "hmdevice" : "HM-LC-SW1-FM", 6 | "channels" : { 7 | "0" : { 8 | "hm_channeltype" : "MAINTENANCE", 9 | "hm_datapoints" : ["UNREACH"], 10 | "settings" : { 11 | 12 | "UNREACH" : { 13 | "mqtt_topic_state" : "tele/%name%/LWT", 14 | "mqtt_payload_state" : "", 15 | "mqtt_representation_state" : {"online":false, "offline":true} 16 | } 17 | } 18 | }, 19 | "1" : { 20 | "hm_channeltype" : "SWITCH", 21 | "hm_datapoints" : ["STATE"], 22 | "settings" : { 23 | 24 | "STATE" : { 25 | 26 | "mqtt_payload_get" : "POWER", 27 | "mqtt_topic_get" : "stat/%name%/RESULT", 28 | "mqtt_representation_get" : {"ON":true, "OFF":false}, 29 | 30 | "mqtt_topic_set" : "cmnd/%name%/POWER", 31 | "mqtt_representation_set" : {"true": "ON" , "false": "OFF"}, 32 | 33 | "mqtt_topic_state" : ".*/%name%/STATE", 34 | "mqtt_payload_state" : "POWER", 35 | "mqtt_representation_state" : {"ON":true, "OFF":false}, 36 | 37 | "mqtt_command_getstate" : "cmnd/%name%/status", 38 | "mqtt_topic_getstate" : ".*/%name%/STATUS", 39 | "mqtt_payload_getstate" : "Status|Power", 40 | "mqtt_representation_getstate" : {"1" : true , "0": false} 41 | 42 | 43 | 44 | } 45 | } 46 | 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /plugins/MQTT/devices/SonoffTouch.json: -------------------------------------------------------------------------------- 1 | { 2 | "subscribe" : ["cmnd/%name%","tele/%name%","cmnd/%name%_Button"], 3 | "clazztype" : "TouchDevice", 4 | "type" : "TouchKey", 5 | "hmdevice" : "HM-LC-SW1-FM_Touch", 6 | "channels" : { 7 | "0" : { 8 | "hm_channeltype" : "MAINTENANCE", 9 | "hm_datapoints" : ["UNREACH"], 10 | "settings" : { 11 | 12 | "UNREACH" : { 13 | "mqtt_topic_state" : "tele/%name%/LWT", 14 | "mqtt_payload_state" : "", 15 | "mqtt_representation_state" : {"online":false, "offline":true} 16 | } 17 | } 18 | }, 19 | 20 | "1" : { 21 | "hm_channeltype" : "SWITCH", 22 | "hm_datapoints" : ["STATE"], 23 | "settings" : { 24 | 25 | "STATE" : { 26 | 27 | "mqtt_payload_get" : "POWER", 28 | "mqtt_topic_get" : "stat/%name%/RESULT", 29 | "mqtt_representation_get" : {"ON":true, "OFF":false}, 30 | 31 | "mqtt_topic_set" : "cmnd/%name%/POWER", 32 | "mqtt_representation_set" : {"true": "ON" , "false": "OFF"}, 33 | 34 | "mqtt_topic_state" : ".*/%name%/STATE", 35 | "mqtt_payload_state" : "POWER", 36 | "mqtt_representation_state" : {"ON":true, "OFF":false}, 37 | 38 | "mqtt_command_getstate" : "cmnd/%name%/status", 39 | "mqtt_topic_getstate" : ".*/%name%/STATUS", 40 | "mqtt_payload_getstate" : "Status|Power", 41 | "mqtt_representation_getstate" : {"1" : true , "0": false} 42 | 43 | 44 | 45 | } 46 | } 47 | 48 | }, 49 | 50 | "2" : { 51 | "hm_channeltype" : "KEY", 52 | "hm_datapoints" : ["PRESS_SHORT"], 53 | "settings" : { 54 | 55 | "PRESS_SHORT" : { 56 | 57 | "mqtt_topic_state" : ".*/%name%_Button/POWER", 58 | "mqtt_payload_state" : "TOGGLE", 59 | "mqtt_representation_state" : {"TOGGLE" : true } 60 | 61 | } 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /plugins/MQTT/devices/WordClock.json: -------------------------------------------------------------------------------- 1 | { 2 | "subscribe" : ["%name%/stat","%name%/tele"], 3 | "clazztype" : "SwitchDevice", 4 | "type" : "Switch", 5 | "hmdevice" : "HM-LC-SW1-FM", 6 | "channels" : { 7 | "0" : { 8 | "hm_channeltype" : "MAINTENANCE", 9 | "hm_datapoints" : ["UNREACH"], 10 | "settings" : { 11 | 12 | "UNREACH" : { 13 | "mqtt_topic_state" : "%name%/tele/LWT", 14 | "mqtt_payload_state" : "", 15 | "mqtt_representation_state" : {"online":false, "offline":true} 16 | } 17 | } 18 | }, 19 | "1" : { 20 | "hm_channeltype" : "SWITCH", 21 | "hm_datapoints" : ["STATE"], 22 | "settings" : { 23 | 24 | "STATE" : { 25 | 26 | "mqtt_payload_get" : "Power", 27 | "mqtt_topic_get" : "%name%/stat/Result", 28 | "mqtt_representation_get" : {"On":true, "Off":false}, 29 | 30 | "mqtt_topic_set" : "%name%/cmnd/Power", 31 | "mqtt_representation_set" : {"true": "On" , "false": "Off"}, 32 | 33 | "mqtt_topic_state" : "%name%/tele/STATE", 34 | "mqtt_payload_state" : "Power", 35 | "mqtt_representation_state" : {"On":true, "Off":false}, 36 | 37 | "mqtt_command_getstate" : "%name%/cmnd/State", 38 | "mqtt_topic_getstate" : "%name%/stat/Result", 39 | "mqtt_payload_getstate" : "Power", 40 | "mqtt_representation_getstate" : {"1" : true , "0": false} 41 | 42 | 43 | 44 | } 45 | } 46 | 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /plugins/MQTT/devices/WordClockDimmer.json: -------------------------------------------------------------------------------- 1 | { 2 | "subscribe" : ["%name%/stat","%name%/tele/STATE"], 3 | "clazztype" : "DimmerDevice", 4 | "type" : "Dimmer", 5 | "hmdevice" : "HM-LC-Dim1T-Pl", 6 | "channels" : { 7 | "0" : { 8 | "hm_channeltype" : "MAINTENANCE", 9 | "hm_datapoints" : ["UNREACH"], 10 | "settings" : { 11 | 12 | "UNREACH" : { 13 | "mqtt_topic_state" : "%name%/tele/LWT", 14 | "mqtt_payload_state" : "", 15 | "mqtt_representation_state" : {"online":false, "offline":true} 16 | } 17 | } 18 | }, 19 | "1" : { 20 | "hm_channeltype" : "DIMMER", 21 | "hm_datapoints" : ["LEVEL"], 22 | "settings" : { 23 | 24 | "LEVEL" : { 25 | 26 | "mqtt_payload_get" : "Level", 27 | "mqtt_topic_get" : "%name%/stat/Level", 28 | 29 | "mqtt_topic_set" : "%name%/cmnd/Level", 30 | 31 | "mqtt_topic_state" : "%name%/tele/STATE", 32 | "mqtt_payload_state" : "Brightness", 33 | 34 | "mqtt_command_getstate" : "%name%/cmnd/State", 35 | "mqtt_topic_getstate" : "%name%/stat/Result", 36 | "mqtt_payload_getstate" : "Brightness" 37 | 38 | } 39 | } 40 | 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /plugins/MQTT/devices/hmdata/HM-LC-Dim1T-Pl.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/MQTT/devices/hmdata/HM-LC-Dim1T-Pl.json -------------------------------------------------------------------------------- /plugins/MQTT/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var MQTTPlatform = require(path.join(__dirname, '/MQTTPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new MQTTPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/MQTT/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-mqttdevice", 3 | "version": "0.0.15", 4 | "description": "Virtual Plugin - MQTT", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.58" 19 | }, 20 | 21 | "dependencies": { 22 | "mqtt" : "^2.15.1" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/MQTT/www/de-de/edit_device_tmp.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 |
          4 | MQTT Gerät 5 | 6 |
          7 |
          8 | Gerätetyp Type 9 | 10 |
          11 |
          12 | CCU Seriennummer 13 | $device_hmdevice$ 14 |
          15 |
          16 | 17 | 18 |
          19 |
          20 |
          21 | 22 | Hilfe 23 |
          -------------------------------------------------------------------------------- /plugins/MQTT/www/dev_type_listItem.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plugins/MQTT/www/edit_device_tmp.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 |
          4 | MQTT Device 5 | 6 |
          7 |
          8 | Device Type 9 | 10 |
          11 |
          12 | CCU Device Serial 13 | $device_hmdevice$ 14 |
          15 |
          16 | 17 | 18 |
          19 |
          20 |
          21 | 22 | Help 23 |
          -------------------------------------------------------------------------------- /plugins/MQTT/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 |
          2 | $device_name$ 3 | $device_hmdevice$ 4 | $device_type$ 5 | Delete 6 |
          -------------------------------------------------------------------------------- /plugins/NanoleafAurora/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | 3 | {"strings": { 4 | "de-de": { 5 | "Holding the on-off button down for 5-7 seconds until the LED starts flashing in a pattern. Please use a clock to help because pressing the button more then 7 seconds may end up an a reset to defaults action.":"Halte den Ein/Aus Button für 5-7 Sekunden gedrückt bis die LED anfängt zu blinken. Bitte nimm eine Uhr zu Hilfe, denn wenn der Button mehr als 7 Sekunden gedrückt wird, könnte das zu einem Werksreset führen.", 6 | "IP of your leaf":"IP Deines Leaf", 7 | "IP Adress":"IP Adresse", 8 | "Refresh":"Aktualisierung", 9 | "Refresh state every xx seconds.":"Status alle xx Sekunden aktualisieren." 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /plugins/NanoleafAurora/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - NanoLeaf Aurora 2 | 3 | there is no readme .. at this time ... -------------------------------------------------------------------------------- /plugins/NanoleafAurora/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var NanoleafAuroraPlatform = require(path.join(__dirname, '/NanoleafAuroraPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new NanoleafAuroraPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/NanoleafAurora/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-nanoleafauroradevice", 3 | "version": "0.0.7", 4 | "description": "Virtual Plugin - NanoleafAurora", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/NanoleafAurora" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "promise":"latest" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/NanoleafAurora/www/list_efx_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | RGBW Effect 3 | $efx.num$ 4 | 5 | -------------------------------------------------------------------------------- /plugins/NetAtmoPlugin/NetAtmoDevice.js: -------------------------------------------------------------------------------- 1 | 2 | var HomematicDevice; 3 | 4 | var NetAtmoDevice = function(plugin, netAtmoApi ,naDevice,serialprefix) { 5 | this.name = naDevice["station_name"]; 6 | } 7 | 8 | 9 | 10 | NetAtmoDevice.prototype.refreshDevice = function() { 11 | 12 | } 13 | 14 | 15 | NetAtmoDevice.prototype.parseModuleData = function (measurement,channel) { 16 | 17 | } 18 | 19 | 20 | 21 | // calculations from https://www.wetterochs.de/wetter/feuchte.html 22 | NetAtmoDevice.prototype.saturation_vapor_pressure = function(temperature) 23 | { 24 | var a, b; 25 | if(temperature >= 0) 26 | { 27 | a = 7.5; 28 | b = 237.3; 29 | } 30 | else 31 | { 32 | a = 7.6; 33 | b = 240.7; 34 | } 35 | 36 | var saturation_vapor_pressure = 6.1078 * Math.exp(((a*temperature)/(b+temperature))/Math.LOG10E); 37 | 38 | return saturation_vapor_pressure; 39 | } 40 | 41 | NetAtmoDevice.prototype.vapor_pressure = function (temperature, relative_humidity) 42 | { 43 | var saturation_vapor_pressure = this.saturation_vapor_pressure(temperature); 44 | var vapor_pressure = relative_humidity/100 * saturation_vapor_pressure; 45 | return vapor_pressure; 46 | } 47 | 48 | 49 | NetAtmoDevice.prototype.dew_point = function (temperature, relative_humidity) 50 | { 51 | var vapor_pressure = this.vapor_pressure(temperature, relative_humidity); 52 | var a, b; 53 | 54 | if(temperature >= 0) 55 | { 56 | a = 7.5; 57 | b = 237.3; 58 | } 59 | else 60 | { 61 | a = 7.6; 62 | b = 240.7; 63 | } 64 | var c = Math.log(vapor_pressure/6.1078) * Math.LOG10E; 65 | var dew_point = (b * c) / (a - c); 66 | return dew_point; 67 | } 68 | 69 | NetAtmoDevice.prototype.absolute_humidity = function (temperature, relative_humidity) { 70 | var mw = 18.016; 71 | var r_star = 8314.3; 72 | var vapor_pressure = 100 * this.vapor_pressure(temperature, relative_humidity); 73 | var absolute_humidity = 1000 * mw/r_star * vapor_pressure/this.CelsiusToKelvin(temperature); 74 | return absolute_humidity; 75 | } 76 | 77 | NetAtmoDevice.prototype.CelsiusToKelvin = function (temperature) 78 | { 79 | return temperature + 273.15; 80 | } 81 | 82 | module.exports = { 83 | NetAtmoDevice : NetAtmoDevice 84 | } 85 | -------------------------------------------------------------------------------- /plugins/NetAtmoPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - NetAtmo Plugin 2 | Add your NetAtmo Weather Devices HM 3 | 4 | Please setup the following Credential Data in config.json 5 | 6 | "client_id": "" 7 | "client_secret": "" 8 | "username": "" 9 | "password": "" 10 | 11 | This plugin will autodetect a rain or wind gauge and switch to a combo KS500 Sensor. -------------------------------------------------------------------------------- /plugins/NetAtmoPlugin/index.js: -------------------------------------------------------------------------------- 1 | var NetAtmoPlatform = require(__dirname + '/NetAtmoPlatform'); 2 | 3 | module.exports = function(server,name,logger,instance) { 4 | 5 | this.name = name; 6 | this.instance = instance; 7 | this.platform = new NetAtmoPlatform(this,name,server,logger,instance); 8 | this.platform.init(); 9 | 10 | 11 | this.handleConfigurationRequest = function(dispatched_request) { 12 | this.platform.handleConfigurationRequest(dispatched_request); 13 | }; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/NetAtmoPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-netatmodevice", 3 | "version": "0.0.18", 4 | "description": "Virtual Netatmo Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/NetAtmoPlugin" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "netatmo":"latest" 23 | }, 24 | 25 | "files": [ 26 | "NetAtmoDevice.js", 27 | "NetAtmoPlatform.js", 28 | "NA_ComboModule.js", 29 | "NA_Main.js", 30 | "NA_Module1.js", 31 | "NA_Module4.js", 32 | "README.md", 33 | "index.js", 34 | "www/" 35 | ] 36 | 37 | } -------------------------------------------------------------------------------- /plugins/NetAtmoPlugin/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $device_hmdevice$ 3 | $device_name$ 4 | -------------------------------------------------------------------------------- /plugins/OpenWeatherMap/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/OpenWeatherMap/Localizable.strings -------------------------------------------------------------------------------- /plugins/OpenWeatherMap/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Open Weather Map 2 | 3 | You have to register for an API Key at : http://openweathermap.org/appid -------------------------------------------------------------------------------- /plugins/OpenWeatherMap/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var OpenWeatherMapPlatform = require(path.join(__dirname, '/OpenWeatherMapPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new OpenWeatherMapPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/OpenWeatherMap/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-openweathermapdevice", 3 | "version": "0.0.7", 4 | "description": "Virtual Plugin - OpenWeatherMap", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/PhilipsTV/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Hue Plugin 2 | Add your Philips TV Ambilight as RGB Device to your CCU 3 | 4 | config : 5 | 6 | ``` 7 | { 8 | "type": "PhilipsTV", 9 | "name": "Philips TV Ambilight", 10 | "tv_ip": "192.168.xx.xx" 11 | } 12 | 13 | ``` 14 | 15 | The TV has to switched on while the plugin is initializing. Otherwise the API ID cannot be fetched from the TV. 16 | 17 | You can setup the Ambilight if the TV is on using the Dimmer and RGB settings. 18 | You can switch to loung-mode by set the automatic program of the RGB Device to slow cycle. 19 | You can switch back to internal mode (Ambilight controled by tv image) by set the automatic program to "TV-Simmulation" -------------------------------------------------------------------------------- /plugins/PhilipsTV/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var PhilipsTVPlatform = require(path.join(__dirname, '/PhilipsTVPlatform.js')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new PhilipsTVPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/PhilipsTV/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-PhilipsTV", 3 | "version": "0.0.5", 4 | "description": "Virtual Hue Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | "request":"latest", 23 | "onecolor":"latest" 24 | } 25 | } -------------------------------------------------------------------------------- /plugins/PiTemp/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Pi Core Temp 2 | 3 | creates a Temperature sensor and reports the cpu core temperature of your Pi running HVL -------------------------------------------------------------------------------- /plugins/PiTemp/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var PiTempPlatform = require(path.join(__dirname, '/PiTempPlatform')) 3 | 4 | module.exports = function(server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new PiTempPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function(dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } -------------------------------------------------------------------------------- /plugins/PiTemp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-picoretempdevice", 3 | "version": "0.0.1", 4 | "description": "Virtual Plugin - Pi Core Temp Sensor", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface": ">=0.2.58" 19 | }, 20 | 21 | "dependencies": { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/PioneerAVR/PioneerPlatform.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/PioneerAVR/PioneerPlatform.js -------------------------------------------------------------------------------- /plugins/PioneerAVR/PioneerRemote.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/PioneerAVR/PioneerRemote.js -------------------------------------------------------------------------------- /plugins/PioneerAVR/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface Pioneer Plugin 2 | 3 | This plugin creates a 19Key Remote for your Pioneer AVR 4 | 5 | The Keys are : 6 | Channel 1 : Power ON 7 | Channel 2 : Power OFF 8 | Channel 3 : Volume Up 9 | Channel 4 : Volume Dn 10 | Channel 5 : Mute 11 | 12 | You may Configure the other Channels via WebGUI. There is a Parameter CMD_PRESS_SHORT where you can put in the Codes to do other actions . see your manual. 13 | 14 | In Config.json please setup the host and port 15 | 16 | { 17 | "type": "PioneerAVR", 18 | "name": "Pioneer", 19 | "options" : { 20 | "host":"192.168......", 21 | "port":23 22 | } 23 | } -------------------------------------------------------------------------------- /plugins/PioneerAVR/index.js: -------------------------------------------------------------------------------- 1 | var PioneerPlatform = require(__dirname + '/PioneerPlatform'); 2 | 3 | 4 | 5 | module.exports = function(server,name,logger,instance) { 6 | 7 | this.name = name; 8 | this.instance = instance; 9 | this.platform = new PioneerPlatform(this,name,server,logger,instance); 10 | this.platform.init(); 11 | 12 | this.handleConfigurationRequest = function(dispatched_request) { 13 | this.platform.handleConfigurationRequest(dispatched_request); 14 | }; 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /plugins/PioneerAVR/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-pioneeravrdevice", 3 | "version": "0.0.6", 4 | "description": "Virtual Pioneer Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface" : ">=0.0.4" 19 | }, 20 | 21 | "dependencies": { 22 | } 23 | } -------------------------------------------------------------------------------- /plugins/Raumfeld/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - Raumfeld 2 | 3 | 4 | Node > 7.6 is needed 5 | 6 | curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - 7 | sudo apt-get install nodejs -------------------------------------------------------------------------------- /plugins/Raumfeld/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var RaumfeldPlatform = require(path.join(__dirname, '/RaumfeldPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new RaumfeldPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/Raumfeld/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-raumfelddevice", 3 | "version": "0.1.3", 4 | "description": "Virtual Plugin - Raumfeld", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/thkl/Homematic-Virtual-Interface/plugins/Raumfeld" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=7.6.0", 18 | "homematic-virtual-interface" : ">=0.2.56" 19 | }, 20 | 21 | "dependencies": { 22 | "node-raumkernel": ">=1.1.8", 23 | "xml2js": "0.4.17" 24 | } 25 | } -------------------------------------------------------------------------------- /plugins/Raumfeld/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $device_hmdevice$ 3 | $device_name$ 4 | -------------------------------------------------------------------------------- /plugins/SonosPlugin/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface Sonos Plugin 2 | 3 | This plugin creates a 19Key Remote for every Sonos ZonePlayer 4 | Map the first 18 Keys in the device settings to sonos commands: 5 | 6 | Play, Pause, Next, Prev, VolUp, VolDn, Spotify 7 | 8 | To do that open the device settings in webgui there is a field called CMD_PRESS_SHORT. setup the commands there for the specified key. 9 | The spotiy command is a little special. Setup the playlist you with to play in the CMD_PRESS_LONG field for that key. 10 | 11 | Press the key and the plugin will execute the command. 12 | 13 | There is a special Channel 19 and it will change in the future. 14 | This channel contains currently 2 parameters 15 | 16 | TARGET_VOLUME, PLAYLIST 17 | 18 | you may set the PLAYLIST Parameter with a playlist url (currently spotify only is supported -> eg : spotify:user:spotify_germany:playlist:1dPjXhd0s7DBTCuaolLVSm) 19 | and the current queue will replaced by this playlist and the zoneplayer will play that list. 20 | 21 | 22 | 23 | Sonos Coordinator: 24 | 25 | There is a virtual device named SONOS_Coordinator. 26 | You can group players and create meshes thru this coordinator. There is a channel with number 4 and a datapoint named COMMAND. 27 | This is where the magic happens. 28 | 29 | 30 | remove player from group: standalone|playername 31 | groups players : createmesh|player1,player2... 32 | toggle group : toggle|playername 33 | 34 | there is also a command to select and play on of your Sonos favs: playFav|Playername|FavName 35 | 36 | you may also combine commands with a * as separator, so the coordinator will execute them in a row. 37 | -------------------------------------------------------------------------------- /plugins/SonosPlugin/changelog: -------------------------------------------------------------------------------- 1 | 0.0.27 2 | 3 | variable steps for inc and decrease the volume 4 | 5 | 0.0.26 6 | 7 | fixed enableSub Command -------------------------------------------------------------------------------- /plugins/SonosPlugin/index.js: -------------------------------------------------------------------------------- 1 | var SonosPlatform = require(__dirname + '/SonosPlatform'); 2 | 3 | 4 | 5 | module.exports = function(server,name,logger,instance) { 6 | 7 | this.initialized = false; 8 | this.name = name; 9 | this.instance = instance; 10 | this.platform = new SonosPlatform(this,name,server,logger); 11 | this.platform.init(); 12 | 13 | this.handleConfigurationRequest = function(dispatched_request) { 14 | this.platform.handleConfigurationRequest(dispatched_request); 15 | }; 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/SonosPlugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-sonosdevice", 3 | "version": "0.0.29", 4 | "description": "Virtual Sonos Device", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/tree/master/plugins/SonosPlugin" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/thkl/Homematic-Virtual-Interface/issues" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface": ">=0.2.2" 19 | }, 20 | 21 | "dependencies": { 22 | "node-sonos": ">=0.12.6", 23 | "async": "latest", 24 | "underscore": "latest" 25 | } 26 | } -------------------------------------------------------------------------------- /plugins/SonosPlugin/www/de-de/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/plugins/SonosPlugin/www/de-de/index.html -------------------------------------------------------------------------------- /plugins/SonosPlugin/www/list_device_new.html: -------------------------------------------------------------------------------- 1 |
          2 | $device_name$ 3 | $host$ 4 | 5 | 6 |
          -------------------------------------------------------------------------------- /plugins/SonosPlugin/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 |
          2 | $device_hmdevice$ 3 | $device_name$ 4 | Remove 5 |
          -------------------------------------------------------------------------------- /plugins/WeatherUnderground/Localizable.strings: -------------------------------------------------------------------------------- 1 | {"strings": { 2 | "de-de": { 3 | "register your app key at https://www.wunderground.com/":"Ein API Key muss hier erstellt werden: https://www.wunderground.com/", 4 | "WeatherUnderground API Key":"WeatherUnderground API Key", 5 | "see https://www.wunderground.com/wundermap for StationID":"Suche die StationsID hier herraus: https://www.wunderground.com/wundermap", 6 | "Station ID":"StationsID" 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /plugins/WeatherUnderground/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - WeatherUnderground 2 | 3 | You have to register for an API Key at : https://www.wunderground.com/ -------------------------------------------------------------------------------- /plugins/WeatherUnderground/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var WeatherUndergroundPlatform = require(path.join(__dirname, '/WeatherUndergroundPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new WeatherUndergroundPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/WeatherUnderground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-weatherundergrounddevice", 3 | "version": "0.0.7", 4 | "description": "Virtual Plugin - WeatherUnderground", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=0.12.0", 18 | "homematic-virtual-interface": ">=0.2.43" 19 | }, 20 | 21 | "dependencies": { 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/deConz/devices/ColorTemperatureLight.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const BasicLight = require(path.join(__dirname, 'BasicLight.js')) 3 | 4 | class ColorTemperatureLight extends BasicLight { 5 | constructor (plugin, light) { 6 | super(plugin, light, 'VIR-LG-WHITE-DIM') 7 | } 8 | 9 | async handleCCUEvent (parameter) { 10 | let changed = await super.handleCCUEvent(parameter) 11 | 12 | var newValue = parameter.newValue 13 | var channel = this.hmDevice.getChannel(parameter.channel) 14 | 15 | if (parameter.name === 'WHITE') { 16 | let colorTemp = Number(parseInt(newValue) / 10).toFixed(0) 17 | this.currentState.ct(colorTemp) 18 | channel.updateValue('WHITE', newValue, true, true) 19 | changed = true 20 | } 21 | return changed 22 | } 23 | 24 | handleLightChangeEvent (light) { 25 | let self = this 26 | super.handleLightChangeEvent(light, 'VIR-LG_WHITE-DIM-CH') 27 | 28 | let state = light.lightState 29 | let cChannel = self.hmDevice.getChannelWithTypeAndIndex('VIR-LG_WHITE-DIM-CH', 1) 30 | if (cChannel) { 31 | cChannel.startUpdating('WHITE') 32 | let colorTemp = state.ct() 33 | cChannel.updateValue('WHITE', (colorTemp * 10), true) 34 | cChannel.endUpdating('WHITE') 35 | } else { 36 | this.log.warn('Channel %s %s not found', 1, 'VIR-LG_WHITE-DIM-CH') 37 | } 38 | } 39 | } 40 | 41 | module.exports = ColorTemperatureLight 42 | -------------------------------------------------------------------------------- /plugins/deConz/devices/DeConzDevice.js: -------------------------------------------------------------------------------- 1 | /* 2 | * File: DeConzDevice.js 3 | * Project: homematic-virtual-deConz 4 | * File Created: Sunday, 27th September 2020 1:48:28 pm 5 | * Author: Thomas Kluge (th.kluge@me.com) 6 | * ----- 7 | * The MIT License (MIT) 8 | * 9 | * Copyright (c) Thomas Kluge (https://github.com/thkl) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | * ========================================================================== 29 | */ 30 | 31 | const path = require('path') 32 | 33 | class DeConzDevice { 34 | constructor (plugin, device, hmType) { 35 | var devfile = path.join(__dirname, 'definitions', hmType + '.json') 36 | plugin.server.publishHMDevice(plugin.getName(), hmType, devfile, 1) 37 | let dSer = 'DEC' + device.uniqueid.substring(13, 22).replace(/[.:#_()-]/g, '') 38 | this.hmDevice = plugin.bridge.initDevice(plugin.getName(), dSer, hmType, dSer) 39 | this.gwDevice = device 40 | this.log = plugin.log 41 | this.plugin = plugin 42 | this.gateway = plugin.gateway 43 | this.log.debug('adding %s of type %s', dSer, hmType) 44 | } 45 | } 46 | 47 | module.exports = DeConzDevice 48 | -------------------------------------------------------------------------------- /plugins/deConz/devices/ZHAPresence.js: -------------------------------------------------------------------------------- 1 | /* 2 | * File: ZHAPresence.js 3 | * Project: homematic-virtual-deConz 4 | * File Created: Saturday, 26th September 2020 8:15:36 pm 5 | * Author: Thomas Kluge (th.kluge@me.com) 6 | * ----- 7 | * The MIT License (MIT) 8 | * 9 | * Copyright (c) Thomas Kluge (https://github.com/thkl) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | * ========================================================================== 29 | */ 30 | 31 | const path = require('path') 32 | const DeConzDevice = require(path.join(__dirname, 'DeConzDevice.js')) 33 | 34 | class ZHAPresence extends DeConzDevice { 35 | constructor (plugin, sensor) { 36 | super(plugin, sensor, 'HM-Sec-MDIR') 37 | let self = this 38 | sensor.on('change', () => { 39 | let channel = self.hmDevice.getChannelWithTypeAndIndex('MOTION_DETECTOR', 1) 40 | channel.updateValue('MOTION', sensor.presence, true, true) 41 | }) 42 | } 43 | } 44 | 45 | module.exports = ZHAPresence 46 | -------------------------------------------------------------------------------- /plugins/deConz/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var DeConzPlatform = require(path.join(__dirname, '/DeConzPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new DeConzPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/deConz/lib/ApiError.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const GatewayDeviceError = require(path.join(__dirname, 'GatewayDeviceError.js')) 4 | 5 | module.exports = class ApiError extends Error { 6 | constructor (...args) { 7 | super(...args) 8 | Error.captureStackTrace(this, ApiError) 9 | 10 | // TODO need handling of the Phillips Hue error types as leaving necessary information behind 11 | // let errorMessage 12 | // , errorType; 13 | // 14 | // if (typeof (error) === 'string') { 15 | // errorMessage = error; 16 | // errorType = 0; 17 | // } else { 18 | // //TODO add better handling for hue error types 19 | // errorMessage = error.message || error.description; 20 | // errorType = error.type; 21 | // } 22 | // this.type = errorType; 23 | 24 | if (args[0] instanceof GatewayDeviceError) { 25 | this._hueError = args[0] 26 | this.message = this._hueError.message 27 | } else if (args[1] && args[1] instanceof GatewayDeviceError) { 28 | this._hueError = args[1] 29 | } 30 | } 31 | 32 | getHueError () { 33 | return this._hueError 34 | } 35 | 36 | /** 37 | * @returns {number} 38 | */ 39 | getHueErrorType () { 40 | return this._hueError ? this._hueError.type : -1 41 | } 42 | 43 | /** 44 | * @returns {string | null} 45 | */ 46 | getHueErrorAddress () { 47 | return this._hueError ? this._hueError.address : null 48 | } 49 | 50 | /** 51 | * @returns {string | null} 52 | */ 53 | getHueErrorDescription () { 54 | return this._hueError ? this._hueError.description : null 55 | } 56 | 57 | /** 58 | * @returns {string | null} 59 | */ 60 | getHueErrorMessage () { 61 | return this._hueError ? this._hueError.message : null 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /plugins/deConz/lib/GatewayDeviceError.js: -------------------------------------------------------------------------------- 1 | 2 | // TODO create wrapper types 3 | const ERROR_TYPES = { 4 | 1: 'unauthorized user', 5 | 2: 'body contains invalid JSON', 6 | 3: 'resource not found', 7 | 4: 'method not available for resource', 8 | 5: 'missing paramters in body', 9 | 6: 'parameter not available', 10 | 7: 'invalid value for parameter', 11 | 8: 'parameter not modifiable', 12 | 11: 'too many items in list', 13 | 12: 'portal connection is required', 14 | 901: 'bridge internal error' 15 | } 16 | 17 | module.exports = class GatewayDeviceError { 18 | constructor (payload) { 19 | this.payload = payload 20 | } 21 | 22 | /** 23 | * @returns {number} 24 | */ 25 | get type () { 26 | return this.payload.type || -1 27 | } 28 | 29 | /** 30 | * @returns {string} 31 | */ 32 | get address () { 33 | return this.payload.address 34 | } 35 | 36 | /** 37 | * @returns {string} 38 | */ 39 | get description () { 40 | return this.payload.description 41 | } 42 | 43 | /** 44 | * @returns {string} 45 | */ 46 | get message () { 47 | let str = this.payload.message 48 | let type = this.type 49 | 50 | if (type === 5 || type === 6) { 51 | // The address makes the error more meaningful 52 | str = `${str}: ${this.address}` 53 | } 54 | 55 | return str 56 | } 57 | 58 | /** 59 | * @returns {*} 60 | */ 61 | get rawError () { 62 | return this.payload 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/GatewayObject.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const ApiError = require(path.join(__dirname, '..', 'ApiError.js')) 3 | const EventEmitter = require('events') 4 | 5 | module.exports = class GatewayObject extends EventEmitter { 6 | constructor (attributes) { 7 | super() 8 | this._attributes = {} 9 | this._data = {} 10 | 11 | attributes.forEach(attr => { 12 | this._attributes[attr.name] = attr 13 | }) 14 | } 15 | 16 | _populate (data) { 17 | const self = this 18 | 19 | if (data) { 20 | Object.keys(data).forEach(key => { 21 | if (self._attributes[key]) { 22 | self.setAttributeValue(key, data[key]) 23 | } 24 | }) 25 | } 26 | 27 | this._populationData = data 28 | return self 29 | } 30 | 31 | getAttributeValue (name) { 32 | const definition = this._attributes[name] 33 | 34 | if (definition) { 35 | return definition.getValue(this._data[name]) 36 | } else { 37 | throw new ApiError(`Requesting value for invalid attribute '${name}'`) 38 | } 39 | } 40 | 41 | setAttributeValue (name, value) { 42 | const definition = this._attributes[name] 43 | 44 | if (definition) { 45 | this._data[definition.name] = definition.getValue(value) 46 | } else { 47 | throw new ApiError(`Attempted to set attribute '${name}', but do not have a definition registered`) 48 | } 49 | 50 | return this 51 | } 52 | 53 | toString () { 54 | return `${this.constructor.name}` 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/GatewayObjectWithId.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const GatewayObject = require(path.join(__dirname, 'GatewayObject.js')) 3 | 4 | module.exports = class GatewayObjectWithId extends GatewayObject { 5 | constructor (attributes, id) { 6 | super(attributes) 7 | this.setAttributeValue('id', id) 8 | } 9 | 10 | get id () { 11 | return this.getAttributeValue('id') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/lights/Light.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const LightState = require('../lightstate/LightState') 3 | const GatewayObjectWithId = require(path.join(__dirname, '..', 'GatewayObjectWithId.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const ATTRIBUTES = [ 7 | types.uint16({name: 'id'}), 8 | types.string({name: 'name', min: 0, max: 32}), 9 | types.string({name: 'type'}), 10 | types.string({name: 'modelid'}), 11 | types.string({name: 'manufacturername'}), 12 | types.string({name: 'uniqueid'}), 13 | types.object({name: 'colorcapabilities'}), 14 | types.object({name: 'config'}), 15 | types.string({name: 'swversion'}), 16 | types.uint16({name: 'ctmax'}), 17 | types.uint16({name: 'ctmin'}), 18 | types.boolean({name: 'hascolor'}) 19 | ] 20 | 21 | module.exports = class Light extends GatewayObjectWithId { 22 | constructor (id) { 23 | super(ATTRIBUTES, id) 24 | this._lightState = null 25 | } 26 | get id () { 27 | return this.getAttributeValue('id') 28 | } 29 | get name () { 30 | return this.getAttributeValue('name') 31 | } 32 | set name (value) { 33 | return this.setAttributeValue('name', value) 34 | } 35 | get type () { 36 | return this.getAttributeValue('type') 37 | } 38 | get modelid () { 39 | return this.getAttributeValue('modelid') 40 | } 41 | get manufacturername () { 42 | return this.getAttributeValue('manufacturername') 43 | } 44 | get uniqueid () { 45 | return this.getAttributeValue('uniqueid') 46 | } 47 | get productname () { 48 | return this.getAttributeValue('productname') 49 | } 50 | get swversion () { 51 | return this.getAttributeValue('swversion') 52 | } 53 | 54 | get lightState () { 55 | return this._lightState 56 | } 57 | 58 | set lightState (newState) { 59 | if (newState instanceof LightState) { 60 | this._lightState = newState 61 | // send this to the Gateway 62 | this.emit('populate', this._lightState) 63 | } else { 64 | this._populateState(newState) 65 | } 66 | } 67 | 68 | updateFromGateway (newState) { 69 | this._populateState(newState) 70 | this.emit('change') 71 | } 72 | 73 | _populate (light) { 74 | super._populate(light) 75 | if (light.state) { 76 | this._populateState(light.state) 77 | } 78 | } 79 | 80 | _populateState (newState) { 81 | let ls = new LightState() 82 | ls.populate(newState) 83 | this._lightState = ls 84 | return ls 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/lightstate/CommonStates.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const BaseStates = require(path.join(__dirname, 'BaseStates.js')) 3 | 4 | class CommonStates extends BaseStates { 5 | constructor () { 6 | super( 7 | 'alert', 8 | Array.from(arguments) 9 | ) 10 | } 11 | 12 | alert (value) { 13 | return this._setStateValue('alert', value) 14 | } 15 | 16 | alertLong () { 17 | return this.alert('lselect') 18 | } 19 | 20 | alertShort () { 21 | return this.alert('select') 22 | } 23 | 24 | alertNone () { 25 | return this.alert('none') 26 | } 27 | 28 | increment (state, inc) { 29 | let stateDefinition = this._getStateDefinition(state) 30 | let value = this._getStateValue(state) 31 | value = value + inc 32 | if (value > stateDefinition.max) { 33 | value = stateDefinition.max 34 | } 35 | this._setStateValue(state, value) 36 | } 37 | 38 | decrement (state, inc) { 39 | let stateDefinition = this._getStateDefinition(state) 40 | let value = this._getStateValue(state) 41 | value = value - inc 42 | if (value < stateDefinition.min) { 43 | value = stateDefinition.min 44 | } 45 | this._setStateValue(state, value) 46 | } 47 | 48 | incrementBrightness (inc) { 49 | this.increment('bri', inc) 50 | } 51 | 52 | decrementBrightness (inc) { 53 | this.decrement('bri', inc) 54 | } 55 | 56 | incrementHue (inc) { 57 | this.increment('hue', inc) 58 | } 59 | 60 | decrementHue (inc) { 61 | this.decrement('hue', inc) 62 | } 63 | } 64 | 65 | module.exports = CommonStates 66 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/lightstate/ConfigToolState.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const States = require(path.join(__dirname, 'States.js')) 3 | 4 | module.exports = class ConfigToolState extends States { 5 | constructor () { 6 | super( 7 | 'reachable', 8 | Array.from(arguments) 9 | ) 10 | } 11 | 12 | reachable () { 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/lightstate/LightState.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const CommonStates = require(path.join(__dirname, 'CommonStates.js')) 3 | 4 | module.exports = class LightState extends CommonStates { 5 | constructor () { 6 | super('rgb') 7 | } 8 | 9 | /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | // 11 | // Helper States that get converted into the standard light state values 12 | // 13 | /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | 15 | white (temp, bri) { 16 | this.ct(temp) 17 | this.brightness(bri) 18 | return this 19 | } 20 | 21 | hsb (hue, saturation, brightness) { 22 | this.hue(this._convertDegreesToStateValue(hue, 'hue')) 23 | this.brightness(brightness) 24 | this.saturation(saturation) 25 | return this 26 | } 27 | 28 | hsl (hue, saturation, luminosity) { 29 | const temp = saturation * (luminosity < 50 ? luminosity : 100 - luminosity) / 100 30 | const satValue = Math.round(200 * temp / (luminosity + temp)) | 0 31 | const bri = Math.round(temp + luminosity) 32 | 33 | this.brightness(bri) 34 | this.hue(this._convertDegreesToStateValue(hue, 'hue')) 35 | this.sat(this._convertPercentageToStateValue(satValue, 'sat')) 36 | 37 | return this 38 | } 39 | 40 | rgb (red, green, blue) { 41 | // The conversion to rgb is now done in the xy space, but to do so requires knowledge of the limits of the light's 42 | // color gamut. 43 | // To cater for this, we store the rgb value requested, and convert it to xy when the user applies it. 44 | 45 | if (Array.isArray(red)) { 46 | return this._setStateValue('rgb', red) 47 | } else { 48 | return this._setStateValue('rgb', [red, green, blue]) 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/CLIPGenericStatus.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const Sensor = require(path.join(__dirname,'Sensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const STATE_ATTRIBUTES = [ 7 | types.int16({name: 'status'}), 8 | types.string({name: 'lastupdated'}) 9 | ] 10 | 11 | module.exports = class CLIPGenericStatus extends Sensor { 12 | constructor (id) { 13 | super(STATE_ATTRIBUTES, id) 14 | } 15 | 16 | get status () { 17 | return this.getStateAttributeValue('status') 18 | } 19 | 20 | set status (value) { 21 | return this._updateStateAttributeValue('status', value) 22 | } 23 | 24 | updateFromGateway (newState) { 25 | super.updateFromGateway(newState) 26 | 27 | if ((newState) && (newState.status !== undefined)) { 28 | let last = this.status 29 | let changed = (last !== newState.status) 30 | this.status = newState.status 31 | if (changed === true) { 32 | this.emit('change') 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/CLIPPresence.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const ClipSensor = require(path.join(__dirname,'CLIPSensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const STATE_ATTRIBUTES = [ 7 | types.boolean({name: 'presence', defaultValue: false}), 8 | types.string({name: 'lastupdated'}) 9 | ] 10 | 11 | module.exports = class CLIPPresence extends ClipSensor { 12 | constructor (id) { 13 | super(STATE_ATTRIBUTES, id) 14 | } 15 | 16 | get presence () { 17 | return this.getStateAttributeValue('presence') 18 | } 19 | 20 | set presence (value) { 21 | return this._updateStateAttributeValue('presence', value) 22 | } 23 | 24 | updateFromGateway (newState) { 25 | super.updateFromGateway(newState) 26 | 27 | if ((newState) && (newState.presence !== undefined)) { 28 | let last = this.presence 29 | let changed = (last !== newState.presence) 30 | this.presence = newState.presence 31 | if (changed === true) { 32 | this.emit('change') 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/CLIPSensor.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const Sensor = require(path.join(__dirname,'Sensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | module.exports = class CLIPSensor extends Sensor { 7 | updateFromGateway (newState) { 8 | super.updateFromGateway(newState) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/Daylight.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const Sensor = require(path.join(__dirname,'Sensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const STATE_ATTRIBUTES = [ 7 | types.boolean({name: 'daylight'}), 8 | types.string({name: 'lastupdated'}) 9 | ] 10 | 11 | module.exports = class Daylight extends Sensor { 12 | constructor (id) { 13 | super(STATE_ATTRIBUTES, id) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/ZHAPresence.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const Sensor = require(path.join(__dirname,'Sensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const STATE_ATTRIBUTES = [ 7 | types.boolean({name: 'presence', defaultValue: false}), 8 | types.string({name: 'lastupdated'}) 9 | ] 10 | 11 | module.exports = class ZHAPresence extends Sensor { 12 | constructor (id) { 13 | super(STATE_ATTRIBUTES, id) 14 | } 15 | 16 | get presence () { 17 | return this.getStateAttributeValue('presence') 18 | } 19 | 20 | set presence (value) { 21 | return this._updateStateAttributeValue('presence', value) 22 | } 23 | 24 | updateFromGateway (newState) { 25 | super.updateFromGateway(newState) 26 | 27 | if ((newState) && (newState.presence !== undefined)) { 28 | let last = this.presence 29 | let changed = (last !== newState.presence) 30 | this.presence = newState.presence 31 | if (changed === true) { 32 | this.emit('change') 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /plugins/deConz/lib/model/sensors/ZHASwitch.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const Sensor = require(path.join(__dirname,'Sensor.js')) 4 | const types = require(path.join(__dirname, '..', '..', 'types', 'Types.js')) 5 | 6 | const STATE_ATTRIBUTES = [ 7 | types.uint16({name: 'buttonevent'}), 8 | types.string({name: 'lastupdated'}) 9 | ] 10 | 11 | module.exports = class ZHASwitch extends Sensor { 12 | constructor (id) { 13 | super(STATE_ATTRIBUTES, id) 14 | } 15 | 16 | get buttonevent () { 17 | return this.getStateAttributeValue('buttonevent') 18 | } 19 | 20 | set buttonevent (value) { 21 | return this._updateStateAttributeValue('buttonevent', value) 22 | } 23 | 24 | updateFromGateway (newState) { 25 | super.updateFromGateway(newState) 26 | if ((newState) && (newState.buttonevent !== undefined)) { 27 | this.buttonevent = newState.buttonevent 28 | this.emit('change') 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /plugins/deConz/lib/util.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | mergeArrays: mergeArrays 4 | } 5 | 6 | function mergeArrays () { 7 | let result = [] 8 | 9 | Array.from(arguments).forEach(arg => { 10 | if (arg) { 11 | result = result.concat(arg) 12 | } 13 | }) 14 | 15 | return result 16 | } 17 | -------------------------------------------------------------------------------- /plugins/deConz/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-deConz", 3 | "version": "0.0.4", 4 | "description": "Virtual Plugin - deConz", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.58" 19 | }, 20 | 21 | "dependencies": { 22 | "ws": "7.3.1" 23 | } 24 | } -------------------------------------------------------------------------------- /plugins/deConz/www/list_device_tmp.html: -------------------------------------------------------------------------------- 1 | 2 | $device_id$ 3 | 4 | -------------------------------------------------------------------------------- /plugins/iCal/README.md: -------------------------------------------------------------------------------- 1 | # Homematic-Virtual-Interface - iCal 2 | 3 | setup one or more calendars ( google or so) to show your next appointments in ccu system variables -------------------------------------------------------------------------------- /plugins/iCal/index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var iCalPlatform = require(path.join(__dirname, '/iCalPlatform')) 3 | 4 | module.exports = function (server, name, logger, instance) { 5 | this.name = name 6 | this.instance = instance 7 | this.initialized = false 8 | this.platform = new iCalPlatform(this, name, server, logger, instance) 9 | this.platform.init() 10 | 11 | this.handleConfigurationRequest = function (dispatchedRequest) { 12 | this.platform.handleConfigurationRequest(dispatchedRequest) 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /plugins/iCal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homematic-virtual-ical", 3 | "version": "0.0.6", 4 | "description": "Virtual Plugin - iCal", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homematic-virtual-plugin" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/" 12 | }, 13 | "bugs": { 14 | "url": "http://" 15 | }, 16 | "engines": { 17 | "node": ">=4.5.0", 18 | "homematic-virtual-interface" : ">=0.2.60" 19 | }, 20 | 21 | "dependencies": { 22 | "ical":"0.5.0", 23 | "moment":"2.19.3", 24 | "uuid":"latest" 25 | } 26 | } -------------------------------------------------------------------------------- /plugins/iCal/www/list_calendar.html: -------------------------------------------------------------------------------- 1 | 2 | $calendar.prefix$ 3 | $calendar.icount$ 4 | 5 | 6 |
          7 | $calendar.url$ 8 |
          9 | -------------------------------------------------------------------------------- /plugins/iCal/www/list_calendar_edit.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
          10 | 11 |
          12 |
          -------------------------------------------------------------------------------- /raspberrymatic_installer/README.md: -------------------------------------------------------------------------------- 1 | If you want to use this on an Raspberrymatic CCU , please use this CCU Addon. The addon will fetch all necessary files from the web at the first launch. So please note: You will need internet access on your CCU. 2 | 3 | The Raspberrymatic Version does not need any manual setup. Just use the WebInterface to fetch new plugins and set them up. 4 | 5 | 0.0.6 -> Rebuild .npmrc on every boot -------------------------------------------------------------------------------- /raspberrymatic_installer/VERSION: -------------------------------------------------------------------------------- 1 | 0.0.11 2 | -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/config.json.default: -------------------------------------------------------------------------------- 1 | { 2 | "ccu_ip": "127.0.0.1", 3 | "local_ip": "127.0.0.1", 4 | "local_rpc_port": 8301, 5 | "web_http_port":8300, 6 | "restart_command":"/etc/init.d/S51hvl restart", 7 | "npm_command":"npm", 8 | "plugins": [] 9 | } 10 | -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/hm_addon.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | let cfgFileName = '/etc/config/hm_addons.cfg' 3 | let regex = /(.*?) \{CONFIG_URL (.*?) CONFIG_DESCRIPTION \{de (.*?) en (.*?)\} ID (.*?) CONFIG_NAME (.*?)\} /g 4 | var strcnf = '' 5 | var m; 6 | var items = {} 7 | var addItem = undefined 8 | // First parameter is the uid second the config 9 | var myArgs = process.argv.slice(2); 10 | if (myArgs.length === 0)  { 11 | console.log('usage : hm_addon.js uid [configfile]') 12 | process.exit(-1) 13 | } 14 | 15 | let uid = myArgs[0] 16 | if (myArgs.length === 2) { 17 | if (fs.existsSync(myArgs[1])) { 18 | var buffer = fs.readFileSync(myArgs[1], 'utf8') 19 | let tmp = JSON.parse(buffer.toString()) 20 | addItem = { 21 | 'uid': uid.toLocaleLowerCase(), 22 | 'url': tmp.CONFIG_URL, 23 | 'de': tmp.CONFIG_DESCRIPTION.de, 24 | 'en': tmp.CONFIG_DESCRIPTION.en, 25 | 'id': tmp.ID, 26 | 'name': tmp.CONFIG_NAME 27 | } 28 | } else { 29 | 30 | } 31 | } 32 | 33 | if (fs.existsSync(cfgFileName)) { 34 | let contents = fs.readFileSync(cfgFileName, 'utf8') 35 | if (contents.slice(-1) != ' ') { 36 | contents = contents + ' ' // add a space for easyer parsing 37 | } 38 | do { 39 | m = regex.exec(contents); 40 | if (m) { 41 | let item = { 42 | 'uid': m[1].toLocaleLowerCase(), 43 | 'url': m[2], 44 | 'de': m[3], 45 | 'en': m[4], 46 | 'id': m[5], 47 | 'name': m[6] 48 | } 49 | items[m[1]] = item 50 | } 51 | } while (m); 52 | } 53 | 54 | if (addItem !== undefined) { 55 | items[uid] = addItem 56 | console.log('add %s', uid) 57 | } else { 58 | delete items[uid] 59 | console.log('remove %s', uid) 60 | } 61 | var strout = '' 62 | Object.keys(items).forEach(key => { 63 | let item = items[key] 64 | // check remove config there is no config and the uid did not match the given uid 65 | strout = strout + item.uid.toLocaleLowerCase() + ' {CONFIG_URL ' + item.url + ' CONFIG_DESCRIPTION {de ' + item.de 66 | strout = strout + ' en ' + item.en + '} ID ' + item.id + ' CONFIG_NAME ' + item.name + '} ' 67 | }); 68 | fs.writeFileSync(cfgFileName, strout, 'utf8') -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/hvl.conf: -------------------------------------------------------------------------------- 1 | /var/log/hvl.log { 2 | size 2M 3 | copytruncate 4 | rotate 1 5 | compress 6 | missingok 7 | } 8 | -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/hvl_addon.cfg: -------------------------------------------------------------------------------- 1 | { 2 | "CONFIG_URL":"/addons/hvl/index.html", 3 | "CONFIG_DESCRIPTION": { 4 | "de":"{
        • Stellt einen virtuellen Layer für die Nutzung div. Geräte (Hue, Sonos etc) direkt aus der CCU zur Verfügung
        • }", 5 | "en":"{
        • provides a virtual layer to control other devices from CCU (eg Hue or Sonos etc).
        • }" 6 | }, 7 | "ID":"hvl", 8 | "CONFIG_NAME":"HVL" 9 | } -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/hvlrun: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | HVLDIR=/usr/local/addons/hvl 3 | CONFIG_DIR=/usr/local/etc/config 4 | node $HVLDIR/node_modules/homematic-virtual-interface/lib/index.js -C $CONFIG_DIR/hvl/ -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/remove_hvl_object: -------------------------------------------------------------------------------- 1 | #!/bin/tclsh 2 | load tclrega.so 3 | rega_script "dom.DeleteObject(dom.GetObject('HVL'));" -------------------------------------------------------------------------------- /raspberrymatic_installer/etc/www/index.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /raspberrymatic_installer/genscript.sh: -------------------------------------------------------------------------------- 1 | mkdir -p tmp 2 | rm -rf tmp/* 3 | mkdir -p tmp/hvl 4 | mkdir -p tmp/www 5 | 6 | # copy all relevant stuff 7 | cp -a update_script tmp/ 8 | cp -a rc.d tmp/ 9 | #cp -a node tmp/hvl 10 | cp -a VERSION tmp/www/ 11 | #cp -a node_modules tmp/hvl 12 | cp -a etc tmp/hvl 13 | 14 | # generate archive 15 | cd tmp 16 | #tar --owner=root --group=root --exclude=.*.* -czvf ../hvl-raspb-$(cat ../VERSION).tar.gz * 17 | tar --exclude=._* -czvf ../hvl-raspb-$(cat ../VERSION).tar.gz * 18 | cd .. 19 | rm -rf tmp 20 | -------------------------------------------------------------------------------- /raspberrymatic_installer/hvl-raspb-0.0.10.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/raspberrymatic_installer/hvl-raspb-0.0.10.tar.gz -------------------------------------------------------------------------------- /raspberrymatic_installer/hvl-raspb-0.0.11.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/raspberrymatic_installer/hvl-raspb-0.0.11.tar.gz -------------------------------------------------------------------------------- /raspberrymatic_installer/update_script: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ADDONNAME=hvl 4 | CONFIG_DIR=/usr/local/etc/config 5 | ADDON_DIR=/usr/local/addons/${ADDONNAME} 6 | RCD_DIR=${CONFIG_DIR}/rc.d 7 | 8 | # make sure this addon is only executed on 9 | # supported platforms 10 | 11 | if [ "$1" == "HM-RASPBERRYMATIC" ]; then 12 | 13 | mount | grep /usr/local 2>&1 >/dev/null 14 | if [ $? -eq 1 ]; then 15 | mount /usr/local 16 | fi 17 | 18 | # create necessary directories 19 | mkdir -p ${ADDON_DIR} 20 | chmod 755 ${ADDON_DIR} 21 | mkdir -p ${RCD_DIR} 22 | chmod 755 ${RCD_DIR} 23 | 24 | # copy addon 25 | mkdir -p ${ADDON_DIR}/etc 26 | mkdir -p ${CONFIG_DIR}/hvl 27 | 28 | cp -af hvl/etc/* ${ADDON_DIR}/etc 29 | 30 | # copy startup script 31 | cp -af rc.d/* ${RCD_DIR} 32 | 33 | #build system launcher 34 | chmod +x ${RCD_DIR}/hvl 35 | chmod +x ${RCD_DIR}/hvlrun 36 | 37 | #make postinstall executable / will launch via rc.d 38 | chmod +x ${ADDON_DIR}/etc/postinstall.sh 39 | 40 | 41 | fi 42 | 43 | # synchronize filesystem before performing a reboot 44 | # afterwards 45 | sync 46 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | USER_HOME=$(eval echo ~${SUDO_USER}) 4 | path="$PWD" 5 | plugins=() 6 | for f in plugins/*; do 7 | if [ -d $f ]; then 8 | plugins+=($f) 9 | fi 10 | done 11 | 12 | echo "Root path is ${path}" 13 | echo "Installing root dependencies in " ${path} 14 | cd ${path} 15 | npm install 16 | 17 | for ppath in "${plugins[@]}" 18 | do 19 | echo "Installing dependencies for plugin in " ${ppath} 20 | cd ${path}/${ppath} 21 | npm install 22 | cd ${path} 23 | done 24 | 25 | if [ ! -d "${USER_HOME}/.hm_virtual_interface" ]; then 26 | echo "build new configuration directory and config" 27 | mkdir ${USER_HOME}/.hm_virtual_interface 28 | touch ${USER_HOME}/.hm_virtual_interface/config.json 29 | else 30 | echo "Config is here skipping this step" 31 | fi -------------------------------------------------------------------------------- /www/assets/css/application.css: -------------------------------------------------------------------------------- 1 | /* global body padding */ 2 | body { 3 | padding-top: 20px; 4 | padding-bottom: 20px; 5 | } 6 | 7 | @media (min-width: 768px) { 8 | body { 9 | padding-top: 50px; 10 | padding-bottom: 50px; 11 | } 12 | } 13 | 14 | /* global spacing overrides */ 15 | h1, h2, h3, h4, h5, h6, 16 | .a, .b, .c, .d, .e, .f { 17 | margin-top: 0; 18 | } 19 | 20 | hr { 21 | margin-top: 30px; 22 | margin-bottom: 30px; 23 | } 24 | 25 | .g, 26 | .h { 27 | border-bottom: 0; 28 | } 29 | 30 | 31 | #devicelist { 32 | 33 | height: 100%; 34 | max-height: 200px; 35 | overflow: auto; 36 | 37 | } -------------------------------------------------------------------------------- /www/assets/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: white; 3 | font-family: 'Helvetica', sans-serif; 4 | -webkit-overflow-scrolling:touch; 5 | } 6 | -------------------------------------------------------------------------------- /www/assets/fonts/toolkit-entypo.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/fonts/toolkit-entypo.woff2 -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-128x128.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /www/assets/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-160x160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-160x160.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-16x16.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-192x192.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-196x196.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-32x32.png -------------------------------------------------------------------------------- /www/assets/icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon-96x96.png -------------------------------------------------------------------------------- /www/assets/icons/favicon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon.gif -------------------------------------------------------------------------------- /www/assets/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon.ico -------------------------------------------------------------------------------- /www/assets/icons/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/assets/icons/favicon.png -------------------------------------------------------------------------------- /www/de-de/list_corps_item.html: -------------------------------------------------------------------------------- 1 | 2 | $device_address$ 3 | $rega_id$ 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /www/de-de/plugin_item.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | $plugin.installed$ 4 | $plugin.active$ 5 | $plugin.type$
          Lokal $plugin.version$ - Zentral: ...
          6 | 7 | 8 | 9 |
          10 |
          11 | 12 | 13 | $plugin.description$ 14 |
          15 |
          16 | 17 | 18 | 19 |
          20 |
          21 | -------------------------------------------------------------------------------- /www/de-de/plugin_item_ws.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 | 4 | 5 | 6 | $plugin.name$ Plugin ($plugin.version$)
          7 |
          -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thkl/Homematic-Virtual-Interface/45ea16281e72005fec8df7bf48bda42f5078b3f1/www/index.html -------------------------------------------------------------------------------- /www/list_corps_item.html: -------------------------------------------------------------------------------- 1 | 2 | $device_address$ 3 | $rega_id$ 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /www/plugin_item.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | $plugin.installed$ 4 | $plugin.active$ 5 | $plugin.type$
          Local $plugin.version$ - Central: ...
          6 | 7 | 8 | 9 |
          10 |
          11 | 12 | 13 | $plugin.description$ 14 |
          15 |
          16 | 17 | 18 | 19 |
          20 |
          21 | -------------------------------------------------------------------------------- /www/plugin_item_wos.html: -------------------------------------------------------------------------------- 1 |
          2 | $plugin.name$ Plugin ($plugin.version$) 3 |
          -------------------------------------------------------------------------------- /www/plugin_item_ws.html: -------------------------------------------------------------------------------- 1 |
          2 | 3 | 4 | 5 | $plugin.name$ Plugin ($plugin.version$)
          6 |
          -------------------------------------------------------------------------------- /www/removed_device_item.html: -------------------------------------------------------------------------------- 1 | 2 | $device.adress$ 3 | 4 | 5 | -------------------------------------------------------------------------------- /www/settings_option.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | $control.label$ 4 | 5 |
          6 |
          7 | $control.description$ 8 |
          9 |
          -------------------------------------------------------------------------------- /www/settings_text.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | $control.label$ 4 | 5 |
          6 |
          7 | $control.description$ 8 |
          9 |
          --------------------------------------------------------------------------------