├── .browserslistrc ├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── angular.json ├── assets ├── icon.png └── splash.png ├── blinker.jks ├── blinker.jks.txt ├── capacitor.config.ts ├── ionic.config.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── readme.md ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── configs │ │ ├── api.config.ts │ │ ├── app.config.ts │ │ ├── devices.config.ts │ │ ├── i18n │ │ │ ├── ch.ts │ │ │ └── en.ts │ │ └── menu.config.ts │ ├── core │ │ ├── charts │ │ │ ├── charts.module.ts │ │ │ └── line-chart-area │ │ │ │ ├── line-chart-area.component.html │ │ │ │ ├── line-chart-area.component.scss │ │ │ │ └── line-chart-area.component.ts │ │ ├── components │ │ │ ├── b-actcmd-list │ │ │ │ ├── b-actcmd-list.component.html │ │ │ │ ├── b-actcmd-list.component.scss │ │ │ │ ├── b-actcmd-list.component.ts │ │ │ │ └── b-actcmd-list.module.ts │ │ │ ├── b-bottom-btn │ │ │ │ ├── b-bottom-btn.component.html │ │ │ │ ├── b-bottom-btn.component.scss │ │ │ │ └── b-bottom-btn.component.ts │ │ │ ├── b-chart │ │ │ │ ├── b-chart.component.html │ │ │ │ ├── b-chart.component.scss │ │ │ │ └── b-chart.component.ts │ │ │ ├── b-colorpicker-btns │ │ │ │ ├── b-colorpicker-btns.component.html │ │ │ │ ├── b-colorpicker-btns.component.scss │ │ │ │ └── b-colorpicker-btns.component.ts │ │ │ ├── b-colorpicker-disc │ │ │ │ ├── b-colorpicker-disc.component.html │ │ │ │ ├── b-colorpicker-disc.component.scss │ │ │ │ └── b-colorpicker-disc.component.ts │ │ │ ├── b-colorpicker │ │ │ │ ├── b-colorpicker.html │ │ │ │ ├── b-colorpicker.scss │ │ │ │ └── b-colorpicker.ts │ │ │ ├── b-device-img │ │ │ │ ├── b-device-img.component.html │ │ │ │ ├── b-device-img.component.scss │ │ │ │ └── b-device-img.component.ts │ │ │ ├── b-device-list │ │ │ │ ├── b-device-list.component.html │ │ │ │ ├── b-device-list.component.scss │ │ │ │ └── b-device-list.component.ts │ │ │ ├── b-item-list │ │ │ │ ├── b-item-list.component.html │ │ │ │ ├── b-item-list.component.scss │ │ │ │ ├── b-item-list.component.ts │ │ │ │ ├── b-item │ │ │ │ │ ├── b-item.html │ │ │ │ │ ├── b-item.scss │ │ │ │ │ └── b-item.ts │ │ │ │ └── readme.md │ │ │ ├── b-progressbar │ │ │ │ ├── b-progressbar.component.html │ │ │ │ ├── b-progressbar.component.scss │ │ │ │ └── b-progressbar.component.ts │ │ │ ├── b-range │ │ │ │ ├── b-range.html │ │ │ │ ├── b-range.scss │ │ │ │ └── b-range.ts │ │ │ ├── b-timepicker │ │ │ │ ├── b-timepicker.component.html │ │ │ │ ├── b-timepicker.component.scss │ │ │ │ └── b-timepicker.component.ts │ │ │ ├── b-tip │ │ │ │ ├── b-tip.component.html │ │ │ │ ├── b-tip.component.scss │ │ │ │ └── b-tip.component.ts │ │ │ ├── b-toast │ │ │ │ ├── b-toast.component.html │ │ │ │ ├── b-toast.component.scss │ │ │ │ └── b-toast.component.ts │ │ │ ├── b-toggle │ │ │ │ ├── b-toggle.component.html │ │ │ │ ├── b-toggle.component.scss │ │ │ │ └── b-toggle.component.ts │ │ │ ├── b-top-box │ │ │ │ ├── b-top-box.component.html │ │ │ │ ├── b-top-box.component.scss │ │ │ │ └── b-top-box.component.ts │ │ │ ├── components.module.ts │ │ │ ├── deviceblock-list2 │ │ │ │ ├── deviceblock-list2.html │ │ │ │ ├── deviceblock-list2.scss │ │ │ │ └── deviceblock-list2.ts │ │ │ ├── lang-selector │ │ │ │ ├── lang-selector.component.html │ │ │ │ ├── lang-selector.component.scss │ │ │ │ ├── lang-selector.component.ts │ │ │ │ └── lang-selector.module.ts │ │ │ └── scene-button-group │ │ │ │ ├── scene-button-group.html │ │ │ │ ├── scene-button-group.scss │ │ │ │ ├── scene-button-group.ts │ │ │ │ └── scene-button │ │ │ │ ├── scene-button.html │ │ │ │ ├── scene-button.scss │ │ │ │ └── scene-button.ts │ │ ├── directives │ │ │ ├── directives.module.ts │ │ │ └── overlay-padding.directive.ts │ │ ├── functions │ │ │ ├── check.ts │ │ │ └── func.ts │ │ ├── guard │ │ │ └── auth.guard.ts │ │ ├── injectable │ │ │ └── server.interceptor.ts │ │ ├── modals │ │ │ ├── action-selector-modal │ │ │ │ ├── action-selector-modal.component.html │ │ │ │ ├── action-selector-modal.component.scss │ │ │ │ └── action-selector-modal.component.ts │ │ │ ├── device-selector-modal │ │ │ │ ├── device-selector-modal.component.html │ │ │ │ ├── device-selector-modal.component.scss │ │ │ │ └── device-selector-modal.component.ts │ │ │ ├── modals.module.ts │ │ │ ├── repeat-selector-modal │ │ │ │ ├── repeat-selector-modal.component.html │ │ │ │ ├── repeat-selector-modal.component.scss │ │ │ │ └── repeat-selector-modal.component.ts │ │ │ ├── selector-modal │ │ │ │ ├── selector-modal.component.html │ │ │ │ ├── selector-modal.component.scss │ │ │ │ └── selector-modal.component.ts │ │ │ └── time-selector-modal │ │ │ │ ├── time-selector-modal.component.html │ │ │ │ ├── time-selector-modal.component.scss │ │ │ │ └── time-selector-modal.component.ts │ │ ├── model │ │ │ ├── broker.model.ts │ │ │ ├── data.model.ts │ │ │ ├── device-config.model.ts │ │ │ ├── device.model.ts │ │ │ ├── response.model.ts │ │ │ ├── tip.model.ts │ │ │ └── toast.model.ts │ │ ├── pages │ │ │ ├── avatar │ │ │ │ ├── avatar-picker.component.html │ │ │ │ ├── avatar-picker.component.scss │ │ │ │ ├── avatar-picker.component.ts │ │ │ │ └── avatar-picker.module.ts │ │ │ ├── device-icon │ │ │ │ ├── device-icon.html │ │ │ │ ├── device-icon.module.ts │ │ │ │ ├── device-icon.scss │ │ │ │ └── device-icon.ts │ │ │ ├── doc │ │ │ │ ├── doc.module.ts │ │ │ │ ├── doc.page.html │ │ │ │ ├── doc.page.scss │ │ │ │ └── doc.page.ts │ │ │ └── icon-list │ │ │ │ ├── icon-list.html │ │ │ │ ├── icon-list.module.ts │ │ │ │ ├── icon-list.scss │ │ │ │ └── icon-list.ts │ │ ├── pipes │ │ │ ├── actcmd2text.ts │ │ │ ├── days2text.ts │ │ │ ├── device2name.ts │ │ │ ├── html.pipe.ts │ │ │ ├── minute-to-time.ts │ │ │ ├── ms-to-date.ts │ │ │ ├── obj-to-str.ts │ │ │ ├── ownplug-act2str.ts │ │ │ ├── pipes.module.ts │ │ │ └── wrap.pipe.ts │ │ └── services │ │ │ ├── audio.service.ts │ │ │ ├── auth.service.ts │ │ │ ├── cloudStorage.service.ts │ │ │ ├── data.service.ts │ │ │ ├── device-config.service.ts │ │ │ ├── device.service.ts │ │ │ ├── doc.service.ts │ │ │ ├── geolocation.service.ts │ │ │ ├── image.service.ts │ │ │ ├── native.service.ts │ │ │ ├── network.service.ts │ │ │ ├── notice.service.ts │ │ │ ├── permission.service.ts │ │ │ ├── pusher.service.ts │ │ │ ├── tip.service.ts │ │ │ ├── toast.service.ts │ │ │ ├── translation.service.ts │ │ │ ├── update.service.ts │ │ │ ├── user.service.ts │ │ │ └── view.service.ts │ ├── debug │ │ ├── debug.component.html │ │ ├── debug.component.scss │ │ ├── debug.component.ts │ │ ├── debug.module.ts │ │ └── debug.service.ts │ ├── device │ │ ├── device.module.ts │ │ ├── device.page.html │ │ ├── device.page.scss │ │ ├── device.page.ts │ │ └── layouter2 │ │ │ ├── config-editor │ │ │ ├── config-editor.component.html │ │ │ ├── config-editor.component.scss │ │ │ └── config-editor.component.ts │ │ │ ├── guide │ │ │ ├── esptouch │ │ │ │ ├── esptouch.component.html │ │ │ │ ├── esptouch.component.scss │ │ │ │ └── esptouch.component.ts │ │ │ ├── examples │ │ │ │ ├── examples.component.html │ │ │ │ ├── examples.component.scss │ │ │ │ └── examples.component.ts │ │ │ ├── guide.html │ │ │ ├── guide.module.ts │ │ │ ├── guide.scss │ │ │ └── guide.ts │ │ │ ├── ieconfig │ │ │ ├── ieconfig.component.html │ │ │ ├── ieconfig.component.scss │ │ │ ├── ieconfig.component.ts │ │ │ └── ieconfig.module.ts │ │ │ ├── layouter.config.ts │ │ │ ├── layouter.guard.ts │ │ │ ├── layouter.interface.ts │ │ │ ├── layouter2.html │ │ │ ├── layouter2.module.ts │ │ │ ├── layouter2.scss │ │ │ ├── layouter2.service.ts │ │ │ ├── layouter2.ts │ │ │ ├── newui │ │ │ ├── bottom-btn │ │ │ │ ├── bottom-btn.component.html │ │ │ │ ├── bottom-btn.component.scss │ │ │ │ └── bottom-btn.component.ts │ │ │ ├── item-list │ │ │ │ ├── item-list.component.html │ │ │ │ ├── item-list.component.scss │ │ │ │ └── item-list.component.ts │ │ │ ├── item │ │ │ │ ├── item.component.html │ │ │ │ ├── item.component.scss │ │ │ │ └── item.component.ts │ │ │ ├── newui.module.ts │ │ │ └── newui.service.ts │ │ │ ├── widget-buttonlist │ │ │ ├── widget-buttonlist.html │ │ │ ├── widget-buttonlist.module.ts │ │ │ ├── widget-buttonlist.scss │ │ │ └── widget-buttonlist.ts │ │ │ ├── widget-editor2 │ │ │ ├── background-edit │ │ │ │ ├── background-edit.component.html │ │ │ │ ├── background-edit.component.scss │ │ │ │ └── background-edit.component.ts │ │ │ ├── base-edit │ │ │ │ ├── base-edit.component.html │ │ │ │ ├── base-edit.component.scss │ │ │ │ └── base-edit.component.ts │ │ │ ├── edit-components │ │ │ │ ├── align-selector │ │ │ │ │ ├── align-selector.component.html │ │ │ │ │ ├── align-selector.component.scss │ │ │ │ │ └── align-selector.component.ts │ │ │ │ ├── check-list │ │ │ │ │ ├── check-list.component.html │ │ │ │ │ ├── check-list.component.scss │ │ │ │ │ └── check-list.component.ts │ │ │ │ ├── color-picker │ │ │ │ │ ├── color-picker.component.html │ │ │ │ │ ├── color-picker.component.scss │ │ │ │ │ └── color-picker.component.ts │ │ │ │ ├── double-number-input │ │ │ │ │ ├── double-number-input.component.html │ │ │ │ │ ├── double-number-input.component.scss │ │ │ │ │ └── double-number-input.component.ts │ │ │ │ ├── edit-components.module.ts │ │ │ │ ├── icon-picker │ │ │ │ │ ├── icon-picker.component.html │ │ │ │ │ ├── icon-picker.component.scss │ │ │ │ │ └── icon-picker.component.ts │ │ │ │ └── number-input │ │ │ │ │ ├── number-input.component.html │ │ │ │ │ ├── number-input.component.scss │ │ │ │ │ └── number-input.component.ts │ │ │ ├── widget-button-edit │ │ │ │ ├── widget-button-edit.component.html │ │ │ │ ├── widget-button-edit.component.scss │ │ │ │ └── widget-button-edit.component.ts │ │ │ ├── widget-chart-edit │ │ │ │ ├── widget-chart-edit.component.html │ │ │ │ ├── widget-chart-edit.component.scss │ │ │ │ └── widget-chart-edit.component.ts │ │ │ ├── widget-custom-edit │ │ │ │ ├── widget-custom-edit.component.html │ │ │ │ ├── widget-custom-edit.component.scss │ │ │ │ └── widget-custom-edit.component.ts │ │ │ ├── widget-debug-edit │ │ │ │ ├── widget-debug-edit.component.html │ │ │ │ ├── widget-debug-edit.component.scss │ │ │ │ └── widget-debug-edit.component.ts │ │ │ ├── widget-editor.html │ │ │ ├── widget-editor.module.ts │ │ │ ├── widget-editor.scss │ │ │ ├── widget-editor.ts │ │ │ ├── widget-icon-edit │ │ │ │ ├── widget-icon-edit.component.html │ │ │ │ ├── widget-icon-edit.component.scss │ │ │ │ └── widget-icon-edit.component.ts │ │ │ ├── widget-image-edit │ │ │ │ ├── widget-image-edit.component.html │ │ │ │ ├── widget-image-edit.component.scss │ │ │ │ └── widget-image-edit.component.ts │ │ │ ├── widget-number-edit │ │ │ │ ├── widget-number-edit.component.html │ │ │ │ ├── widget-number-edit.component.scss │ │ │ │ └── widget-number-edit.component.ts │ │ │ ├── widget-select-edit │ │ │ │ ├── widget-select-edit.component.html │ │ │ │ ├── widget-select-edit.component.scss │ │ │ │ └── widget-select-edit.component.ts │ │ │ ├── widget-slider-edit │ │ │ │ ├── widget-slider-edit.component.html │ │ │ │ ├── widget-slider-edit.component.scss │ │ │ │ └── widget-slider-edit.component.ts │ │ │ ├── widget-text-edit │ │ │ │ ├── widget-text-edit.component.html │ │ │ │ ├── widget-text-edit.component.scss │ │ │ │ └── widget-text-edit.component.ts │ │ │ └── widget-video-edit │ │ │ │ ├── widget-video-edit.component.html │ │ │ │ ├── widget-video-edit.component.scss │ │ │ │ └── widget-video-edit.component.ts │ │ │ ├── widget-listbar │ │ │ ├── widget-listbar.component.html │ │ │ ├── widget-listbar.component.scss │ │ │ ├── widget-listbar.component.ts │ │ │ └── widget-listbar.module.ts │ │ │ ├── widget-toolbar │ │ │ ├── widget-toolbar.component.html │ │ │ ├── widget-toolbar.component.scss │ │ │ └── widget-toolbar.component.ts │ │ │ └── widgets │ │ │ ├── config.ts │ │ │ ├── parentDynamic.component.html │ │ │ ├── parentDynamic.component.scss │ │ │ ├── parentDynamic.component.ts │ │ │ ├── widget-button │ │ │ ├── widget-button.html │ │ │ ├── widget-button.scss │ │ │ └── widget-button.ts │ │ │ ├── widget-chart │ │ │ ├── widget-chart.html │ │ │ ├── widget-chart.scss │ │ │ └── widget-chart.ts │ │ │ ├── widget-color │ │ │ ├── widget-color.html │ │ │ ├── widget-color.scss │ │ │ └── widget-color.ts │ │ │ ├── widget-custom │ │ │ ├── widget-custom.html │ │ │ ├── widget-custom.scss │ │ │ └── widget-custom.ts │ │ │ ├── widget-debug │ │ │ ├── widget-debug.html │ │ │ ├── widget-debug.scss │ │ │ └── widget-debug.ts │ │ │ ├── widget-image │ │ │ ├── widget-image.html │ │ │ ├── widget-image.scss │ │ │ └── widget-image.ts │ │ │ ├── widget-input │ │ │ ├── widget-input.html │ │ │ ├── widget-input.scss │ │ │ └── widget-input.ts │ │ │ ├── widget-joystick │ │ │ ├── widget-joystick.html │ │ │ ├── widget-joystick.scss │ │ │ └── widget-joystick.ts │ │ │ ├── widget-map │ │ │ ├── widget-map.component.html │ │ │ ├── widget-map.component.scss │ │ │ └── widget-map.component.ts │ │ │ ├── widget-number │ │ │ ├── widget-number.html │ │ │ ├── widget-number.scss │ │ │ └── widget-number.ts │ │ │ ├── widget-range │ │ │ ├── widget-range.html │ │ │ ├── widget-range.scss │ │ │ └── widget-range.ts │ │ │ ├── widget-select │ │ │ ├── widget-select.html │ │ │ ├── widget-select.scss │ │ │ └── widget-select.ts │ │ │ ├── widget-text │ │ │ ├── widget-text.html │ │ │ ├── widget-text.scss │ │ │ └── widget-text.ts │ │ │ ├── widget-timer │ │ │ ├── widget-timer.html │ │ │ ├── widget-timer.scss │ │ │ └── widget-timer.ts │ │ │ ├── widget-video │ │ │ ├── widget-video.html │ │ │ ├── widget-video.scss │ │ │ └── widget-video.ts │ │ │ ├── widget.directive.ts │ │ │ └── widgets.module.ts │ ├── sections │ │ ├── about │ │ │ ├── about.module.ts │ │ │ ├── about.page.html │ │ │ ├── about.page.scss │ │ │ └── about.page.ts │ │ ├── account │ │ │ ├── account-routing.module.ts │ │ │ ├── account.scss │ │ │ ├── first-modal │ │ │ │ ├── first-modal.component.html │ │ │ │ ├── first-modal.component.scss │ │ │ │ ├── first-modal.component.ts │ │ │ │ └── first-modal.module.ts │ │ │ ├── login │ │ │ │ ├── login.html │ │ │ │ ├── login.module.ts │ │ │ │ ├── login.scss │ │ │ │ └── login.ts │ │ │ ├── register │ │ │ │ ├── register.html │ │ │ │ ├── register.module.ts │ │ │ │ ├── register.scss │ │ │ │ └── register.ts │ │ │ └── retrieve │ │ │ │ ├── retrieve.html │ │ │ │ ├── retrieve.module.ts │ │ │ │ ├── retrieve.scss │ │ │ │ └── retrieve.ts │ │ ├── adddevice │ │ │ ├── adddevice.html │ │ │ ├── adddevice.module.ts │ │ │ ├── adddevice.scss │ │ │ ├── adddevice.service.ts │ │ │ ├── adddevice.ts │ │ │ ├── apconfig │ │ │ │ ├── apconfig.html │ │ │ │ ├── apconfig.module.ts │ │ │ │ ├── apconfig.ts │ │ │ │ ├── components │ │ │ │ │ └── ios-guide │ │ │ │ │ │ ├── ios-guide.component.html │ │ │ │ │ │ ├── ios-guide.component.scss │ │ │ │ │ │ └── ios-guide.component.ts │ │ │ │ ├── config-state │ │ │ │ │ ├── config-state.html │ │ │ │ │ ├── config-state.scss │ │ │ │ │ └── config-state.ts │ │ │ │ └── readme.md │ │ │ ├── bleconfig │ │ │ │ ├── bleconfig.component.html │ │ │ │ ├── bleconfig.component.scss │ │ │ │ ├── bleconfig.component.ts │ │ │ │ └── bleconfig.module.ts │ │ │ ├── bwconfig │ │ │ │ ├── bwconfig.html │ │ │ │ ├── bwconfig.module.ts │ │ │ │ ├── bwconfig.scss │ │ │ │ ├── bwconfig.ts │ │ │ │ └── config-state │ │ │ │ │ ├── config-state.component.html │ │ │ │ │ ├── config-state.component.scss │ │ │ │ │ └── config-state.component.ts │ │ │ ├── config-state.scss │ │ │ ├── config.scss │ │ │ ├── esptouch │ │ │ │ ├── config-state │ │ │ │ │ ├── config-state.html │ │ │ │ │ ├── config-state.module.ts │ │ │ │ │ ├── config-state.scss │ │ │ │ │ └── config-state.ts │ │ │ │ ├── esptouch.html │ │ │ │ ├── esptouch.module.ts │ │ │ │ └── esptouch.ts │ │ │ ├── guide │ │ │ │ ├── guide.html │ │ │ │ ├── guide.module.ts │ │ │ │ ├── guide.scss │ │ │ │ └── guide.ts │ │ │ ├── mqttkey │ │ │ │ ├── mqttkey.html │ │ │ │ ├── mqttkey.module.ts │ │ │ │ ├── mqttkey.scss │ │ │ │ └── mqttkey.ts │ │ │ └── qrscanner │ │ │ │ ├── qrscanner.module.ts │ │ │ │ ├── qrscanner.page.html │ │ │ │ ├── qrscanner.page.scss │ │ │ │ ├── qrscanner.page.ts │ │ │ │ └── readme.md │ │ ├── devcenter │ │ │ ├── components │ │ │ │ ├── authentication │ │ │ │ │ ├── authentication.component.html │ │ │ │ │ ├── authentication.component.scss │ │ │ │ │ └── authentication.component.ts │ │ │ │ ├── components.module.ts │ │ │ │ ├── datakey │ │ │ │ │ ├── datakey.component.html │ │ │ │ │ ├── datakey.component.scss │ │ │ │ │ └── datakey.component.ts │ │ │ │ ├── devtool │ │ │ │ │ ├── devtool.component.html │ │ │ │ │ ├── devtool.component.scss │ │ │ │ │ └── devtool.component.ts │ │ │ │ ├── prodevice-info │ │ │ │ │ ├── prodevice-info.component.html │ │ │ │ │ ├── prodevice-info.component.scss │ │ │ │ │ └── prodevice-info.component.ts │ │ │ │ └── prodevice │ │ │ │ │ ├── prodevice.component.html │ │ │ │ │ ├── prodevice.component.scss │ │ │ │ │ └── prodevice.component.ts │ │ │ ├── devcenter.module.ts │ │ │ ├── devcenter.page.html │ │ │ ├── devcenter.page.scss │ │ │ ├── devcenter.page.ts │ │ │ ├── devcenter.service.ts │ │ │ ├── pages │ │ │ │ ├── addprodevice │ │ │ │ │ ├── addprodevice.module.ts │ │ │ │ │ ├── addprodevice.page.html │ │ │ │ │ ├── addprodevice.page.scss │ │ │ │ │ └── addprodevice.page.ts │ │ │ │ ├── editinfo │ │ │ │ │ ├── editinfo.module.ts │ │ │ │ │ ├── editinfo.page.html │ │ │ │ │ ├── editinfo.page.scss │ │ │ │ │ └── editinfo.page.ts │ │ │ │ ├── editlayouter │ │ │ │ │ ├── editlayouter.module.ts │ │ │ │ │ ├── editlayouter.page.html │ │ │ │ │ ├── editlayouter.page.scss │ │ │ │ │ ├── editlayouter.page.ts │ │ │ │ │ └── ieconfig │ │ │ │ │ │ ├── ieconfig.module.ts │ │ │ │ │ │ ├── ieconfig.page.html │ │ │ │ │ │ ├── ieconfig.page.scss │ │ │ │ │ │ └── ieconfig.page.ts │ │ │ │ ├── publicprodevice │ │ │ │ │ ├── publicprodevice.module.ts │ │ │ │ │ ├── publicprodevice.page.html │ │ │ │ │ ├── publicprodevice.page.scss │ │ │ │ │ └── publicprodevice.page.ts │ │ │ │ └── settings │ │ │ │ │ ├── settings.module.ts │ │ │ │ │ ├── settings.page.html │ │ │ │ │ ├── settings.page.scss │ │ │ │ │ └── settings.page.ts │ │ │ └── readme.md │ │ ├── device │ │ │ ├── device-location │ │ │ │ ├── device-location.page.html │ │ │ │ ├── device-location.page.scss │ │ │ │ └── device-location.page.ts │ │ │ ├── device-log │ │ │ │ ├── device-log.component.html │ │ │ │ ├── device-log.component.scss │ │ │ │ └── device-log.component.ts │ │ │ ├── device-manager-routing.module.ts │ │ │ ├── device-manager │ │ │ │ ├── device-manager.html │ │ │ │ ├── device-manager.module.ts │ │ │ │ ├── device-manager.scss │ │ │ │ └── device-manager.ts │ │ │ ├── device-settings │ │ │ │ ├── device-settings.html │ │ │ │ ├── device-settings.scss │ │ │ │ └── device-settings.ts │ │ │ ├── device-share │ │ │ │ ├── device-share.html │ │ │ │ ├── device-share.scss │ │ │ │ ├── device-share.ts │ │ │ │ └── share.service.ts │ │ │ ├── device-storage │ │ │ │ ├── device-storage.page.html │ │ │ │ ├── device-storage.page.scss │ │ │ │ └── device-storage.page.ts │ │ │ ├── device-timer │ │ │ │ ├── device-timer.page.html │ │ │ │ ├── device-timer.page.scss │ │ │ │ ├── device-timer.page.ts │ │ │ │ ├── readme.md │ │ │ │ ├── timer.service.ts │ │ │ │ └── timing-edit │ │ │ │ │ ├── timing-edit.html │ │ │ │ │ ├── timing-edit.scss │ │ │ │ │ └── timing-edit.ts │ │ │ └── device-update │ │ │ │ ├── device-update.html │ │ │ │ ├── device-update.scss │ │ │ │ └── device-update.ts │ │ ├── feedback │ │ │ ├── feedback.component.html │ │ │ ├── feedback.component.scss │ │ │ ├── feedback.component.ts │ │ │ ├── feedback.module.ts │ │ │ └── feedback.service.ts │ │ ├── message │ │ │ ├── message.model.ts │ │ │ ├── message.module.ts │ │ │ ├── message.page.html │ │ │ ├── message.page.scss │ │ │ ├── message.page.ts │ │ │ ├── message.service.ts │ │ │ └── readme.md │ │ ├── room │ │ │ ├── room-edit │ │ │ │ ├── room-edit.html │ │ │ │ ├── room-edit.module.ts │ │ │ │ ├── room-edit.scss │ │ │ │ └── room-edit.ts │ │ │ ├── room-manager-routing.module.ts │ │ │ ├── room-manager │ │ │ │ ├── room-manager.html │ │ │ │ ├── room-manager.module.ts │ │ │ │ ├── room-manager.scss │ │ │ │ └── room-manager.ts │ │ │ └── room.service.ts │ │ ├── scene │ │ │ ├── components │ │ │ │ └── scene-editor-addact │ │ │ │ │ ├── scene-edit-addact.html │ │ │ │ │ ├── scene-edit-addact.scss │ │ │ │ │ └── scene-edit-addact.ts │ │ │ ├── scene-editor │ │ │ │ ├── scene-edit.html │ │ │ │ ├── scene-edit.scss │ │ │ │ └── scene-edit.ts │ │ │ ├── scene-manager │ │ │ │ ├── scene-manager.html │ │ │ │ ├── scene-manager.scss │ │ │ │ └── scene-manager.ts │ │ │ ├── scene.module.ts │ │ │ └── scene.service.ts │ │ ├── speech │ │ │ ├── speech-button │ │ │ │ ├── speech-button.html │ │ │ │ ├── speech-button.scss │ │ │ │ └── speech-button.ts │ │ │ ├── speech.html │ │ │ ├── speech.module.ts │ │ │ ├── speech.scss │ │ │ ├── speech.service.ts │ │ │ └── speech.ts │ │ └── user │ │ │ ├── user.module.ts │ │ │ ├── user.page.html │ │ │ ├── user.page.scss │ │ │ └── user.page.ts │ └── view │ │ ├── home │ │ ├── components │ │ │ ├── deviceblock-list │ │ │ │ ├── deviceblock-list.html │ │ │ │ ├── deviceblock-list.scss │ │ │ │ └── deviceblock-list.ts │ │ │ ├── deviceblock-zone │ │ │ │ ├── deviceblock-zone.html │ │ │ │ ├── deviceblock-zone.scss │ │ │ │ └── deviceblock-zone.ts │ │ │ ├── deviceblock │ │ │ │ ├── deviceblock.html │ │ │ │ ├── deviceblock.scss │ │ │ │ └── deviceblock.ts │ │ │ └── room-list │ │ │ │ ├── room-list.html │ │ │ │ ├── room-list.scss │ │ │ │ └── room-list.ts │ │ ├── view-home.module.ts │ │ ├── view-home.page.html │ │ ├── view-home.page.scss │ │ └── view-home.page.ts │ │ ├── menu │ │ ├── menu.html │ │ ├── menu.module.ts │ │ ├── menu.scss │ │ └── menu.ts │ │ ├── view.module.ts │ │ ├── view.page.html │ │ ├── view.page.scss │ │ └── view.page.ts ├── assets │ ├── aac │ │ ├── Click.aac │ │ ├── Speech_Begin.aac │ │ ├── Speech_Boot.aac │ │ ├── Speech_CannotControl.aac │ │ ├── Speech_ChoseDevice.aac │ │ ├── Speech_Closed1.aac │ │ ├── Speech_Closed2.aac │ │ ├── Speech_Closing1.aac │ │ ├── Speech_Closing2.aac │ │ ├── Speech_DevMode.aac │ │ ├── Speech_DeviceClosed.aac │ │ ├── Speech_DeviceOpened.aac │ │ ├── Speech_Doing.aac │ │ ├── Speech_Done.aac │ │ ├── Speech_End.aac │ │ ├── Speech_Error1.aac │ │ ├── Speech_Error2.aac │ │ ├── Speech_Error3.aac │ │ ├── Speech_Get1.aac │ │ ├── Speech_Get2.aac │ │ ├── Speech_Get3.aac │ │ ├── Speech_Get4.aac │ │ ├── Speech_Help.aac │ │ ├── Speech_NetError.aac │ │ ├── Speech_NotFound1.aac │ │ ├── Speech_NotFound2.aac │ │ ├── Speech_Opened1.aac │ │ ├── Speech_Opened2.aac │ │ ├── Speech_Opening1.aac │ │ ├── Speech_Opening2.aac │ │ ├── Speech_Unsupport.aac │ │ ├── Speech_Wait1.aac │ │ ├── Speech_Wait2.aac │ │ ├── Switch_Off.aac │ │ ├── Switch_On.aac │ │ ├── Warning_Higest.aac │ │ ├── Warning_High.aac │ │ ├── Warning_Low.aac │ │ └── Warning_Mid.aac │ ├── fontawesome6 │ │ ├── css │ │ │ ├── all.css │ │ │ ├── all.min.css │ │ │ ├── brands.css │ │ │ ├── brands.min.css │ │ │ ├── duotone.css │ │ │ ├── duotone.min.css │ │ │ ├── fontawesome.css │ │ │ ├── fontawesome.min.css │ │ │ ├── light.css │ │ │ ├── light.min.css │ │ │ ├── regular.css │ │ │ ├── regular.min.css │ │ │ ├── sharp-regular.css │ │ │ ├── sharp-regular.min.css │ │ │ ├── sharp-solid.css │ │ │ ├── sharp-solid.min.css │ │ │ ├── solid.css │ │ │ ├── solid.min.css │ │ │ ├── svg-with-js.css │ │ │ ├── svg-with-js.min.css │ │ │ ├── thin.css │ │ │ ├── thin.min.css │ │ │ ├── v4-font-face.css │ │ │ ├── v4-font-face.min.css │ │ │ ├── v4-shims.css │ │ │ ├── v4-shims.min.css │ │ │ ├── v5-font-face.css │ │ │ └── v5-font-face.min.css │ │ └── webfonts │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-duotone-900.ttf │ │ │ ├── fa-duotone-900.woff2 │ │ │ ├── fa-light-300.ttf │ │ │ ├── fa-light-300.woff2 │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-sharp-regular-400.ttf │ │ │ ├── fa-sharp-regular-400.woff2 │ │ │ ├── fa-sharp-solid-900.ttf │ │ │ ├── fa-sharp-solid-900.woff2 │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff2 │ │ │ ├── fa-thin-100.ttf │ │ │ ├── fa-thin-100.woff2 │ │ │ ├── fa-v4compatibility.ttf │ │ │ └── fa-v4compatibility.woff2 │ ├── fonts │ │ ├── MiSans-Demibold.woff2 │ │ └── MiSans-Regular.woff2 │ ├── html │ │ ├── button-3d.html │ │ └── button.html │ ├── icons │ │ ├── icon-128.webp │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192.webp │ │ ├── icon-192x192.png │ │ ├── icon-256.webp │ │ ├── icon-384x384.png │ │ ├── icon-48.webp │ │ ├── icon-512.webp │ │ ├── icon-512x512.png │ │ ├── icon-72.webp │ │ ├── icon-72x72.png │ │ ├── icon-96.webp │ │ └── icon-96x96.png │ ├── img │ │ ├── apconfig-ios.png │ │ ├── avatar.png │ │ ├── bg │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ ├── 5.jpg │ │ │ ├── f1.jpg │ │ │ ├── f2.jpg │ │ │ ├── f3.jpg │ │ │ ├── f4.jpg │ │ │ ├── f5.jpg │ │ │ ├── test.png │ │ │ ├── test2.png │ │ │ └── thumbnail │ │ │ │ ├── 0.jpg │ │ │ │ ├── 1.jpg │ │ │ │ ├── 2.jpg │ │ │ │ ├── 3.jpg │ │ │ │ ├── 4.jpg │ │ │ │ ├── 5.jpg │ │ │ │ ├── 99.jpg │ │ │ │ ├── f1.jpg │ │ │ │ ├── f2.jpg │ │ │ │ ├── f3.jpg │ │ │ │ ├── f4.jpg │ │ │ │ └── f5.jpg │ │ ├── blinker-icon.jpg │ │ ├── blinker-icon.png │ │ ├── blinker-logo-white.png │ │ ├── blue-led.png │ │ ├── devices │ │ │ ├── airstation │ │ │ │ ├── co.svg │ │ │ │ ├── no2.svg │ │ │ │ ├── o3.svg │ │ │ │ ├── pm10.svg │ │ │ │ ├── pm2_5.svg │ │ │ │ └── so2.svg │ │ │ ├── icon │ │ │ │ ├── airconditioner.png │ │ │ │ ├── aligenie.png │ │ │ │ ├── arduino-mega.png │ │ │ │ ├── arduino-red.png │ │ │ │ ├── baiduspeaker.png │ │ │ │ ├── birdcage.png │ │ │ │ ├── cat.png │ │ │ │ ├── catfood.png │ │ │ │ ├── cathouse.png │ │ │ │ ├── diyarduino.png │ │ │ │ ├── diylinux.png │ │ │ │ ├── dog.png │ │ │ │ ├── dogfood.png │ │ │ │ ├── doghouse.png │ │ │ │ ├── esp32.png │ │ │ │ ├── fan.png │ │ │ │ ├── fishtank.png │ │ │ │ ├── heater.png │ │ │ │ ├── humidifier.png │ │ │ │ ├── hygrothermograph.png │ │ │ │ ├── linux-logo.png │ │ │ │ ├── openjumperfeeder.png │ │ │ │ ├── ownairdetector.png │ │ │ │ ├── ownbulb.png │ │ │ │ ├── ownledstrip.png │ │ │ │ ├── ownlight.png │ │ │ │ ├── ownlight2.png │ │ │ │ ├── ownlight3.png │ │ │ │ ├── ownlight4.png │ │ │ │ ├── ownplug.png │ │ │ │ ├── plant1.png │ │ │ │ ├── plant2.png │ │ │ │ ├── plant3.png │ │ │ │ ├── raspberrypi-blue.png │ │ │ │ ├── raspberrypi-logo.png │ │ │ │ ├── raspberrypi-pico.png │ │ │ │ ├── raspberrypi-zero.png │ │ │ │ ├── station.png │ │ │ │ ├── unknown.png │ │ │ │ ├── warninglight.png │ │ │ │ ├── wifiduino-blue.png │ │ │ │ └── wifiduino.png │ │ │ └── ownlight │ │ │ │ ├── auto.png │ │ │ │ ├── bg.jpg │ │ │ │ ├── bg.png │ │ │ │ ├── blink.png │ │ │ │ ├── breath.png │ │ │ │ ├── colorpicker.png │ │ │ │ ├── cool.png │ │ │ │ ├── gradient.png │ │ │ │ ├── solid.png │ │ │ │ ├── speed-f.png │ │ │ │ ├── speed-h.png │ │ │ │ ├── stream.png │ │ │ │ ├── sun-f.png │ │ │ │ ├── sun-h.png │ │ │ │ ├── sun.png │ │ │ │ ├── timing.png │ │ │ │ └── warm.png │ │ ├── diandeng-logo.png │ │ ├── headerbg.jpg │ │ ├── icon │ │ │ ├── add.svg │ │ │ ├── apconfig.png │ │ │ ├── arrow-gray.svg │ │ │ ├── arrow.png │ │ │ ├── arrow.svg │ │ │ ├── ble-w.png │ │ │ ├── ble.png │ │ │ ├── esp-logo.png │ │ │ ├── leaf.png │ │ │ ├── link.png │ │ │ ├── menu.svg │ │ │ ├── message.svg │ │ │ ├── room.png │ │ │ ├── thermometer.png │ │ │ ├── tint.png │ │ │ ├── tool-bleconfig.png │ │ │ ├── tool-qrscanner.png │ │ │ ├── update-blue.png │ │ │ ├── update-done.png │ │ │ ├── update-fail.png │ │ │ ├── update-gray.png │ │ │ ├── viewmode.svg │ │ │ ├── warning.png │ │ │ ├── wifi-w.png │ │ │ └── wifi.png │ │ ├── language │ │ │ ├── chinese.jpg │ │ │ └── english.jpg │ │ ├── layouter │ │ │ ├── btn-bg.png │ │ │ ├── colorpicker.png │ │ │ ├── colorpicker2.png │ │ │ ├── joyin.png │ │ │ ├── joyout.png │ │ │ └── joystick.png │ │ ├── login-logo.png │ │ ├── map │ │ │ ├── device.png │ │ │ ├── map-device.png │ │ │ ├── map-marker.png │ │ │ ├── map-me.png │ │ │ ├── marker.png │ │ │ └── user.png │ │ ├── new.png │ │ ├── nodevice.svg │ │ ├── red-led.png │ │ ├── scanner.png │ │ ├── url-error.png │ │ └── widget-img.png │ ├── lib │ │ └── loader.css │ │ │ └── loaders.min.css │ ├── ownfonts │ │ ├── demo.css │ │ ├── demo_index.html │ │ ├── iconfont.css │ │ ├── iconfont.eot │ │ ├── iconfont.js │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ └── svg │ │ ├── circles.svg │ │ ├── puff.svg │ │ ├── speech.svg │ │ └── tail-spin.svg ├── blinker.scss ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── global.scss ├── index.html ├── main.ts ├── manifest.webmanifest ├── polyfills.ts ├── test.ts ├── theme │ └── variables.scss └── zone-flags.ts ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | Chrome >=79 12 | ChromeAndroid >=79 13 | Firefox >=70 14 | Edge >=79 15 | Safari >=14 16 | iOS >=14 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/assets/icon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/assets/splash.png -------------------------------------------------------------------------------- /blinker.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/blinker.jks -------------------------------------------------------------------------------- /blinker.jks.txt: -------------------------------------------------------------------------------- 1 | alias:bM1}lF0!yQ7) 2 | password:bM1}lF0!yQ7) -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "diandeng-app", 3 | "integrations": { 4 | "capacitor": {} 5 | }, 6 | "type": "angular" 7 | } 8 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Blinker APP 2 | 这是blinker app 2.8.0-alpha版本,为最新测试行版本 3 | 本软件版本使用 GPL v3 协议开源,不可用于商业用途 4 | 5 | 对于普通用户,我们推荐您使用官网发布的2.6.5版本 6 | 7 | # 关于2.8.0 8 | blinker App 2.8.0 是使用ionic 7、angular17、capacitor5重构的全新版本 9 | 部分功能仍然在重构中,待重构完成,即会更新到github 10 | 11 | # 开发环境 12 | 推荐使用 Visual Studio Code 13 | 主要框架 http://ionicframework.com/ 14 | 涉及技术 ionic 7、angular17、capacitor5 15 | 16 | # 其他说明 17 | 本项目版本中提供的图片、音频及其他资源由原作者或点灯科技所有,不可用于其他项目 -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { path: '', redirectTo: 'view/home', pathMatch: 'full' }, 6 | ]; 7 | 8 | @NgModule({ 9 | imports: [ 10 | RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) 11 | ], 12 | exports: [RouterModule] 13 | }) 14 | export class AppRoutingModule { } 15 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | .tip-box { 2 | z-index: 99999; 3 | } 4 | 5 | .toast-box { 6 | z-index: 99999; 7 | } -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2 | import { TestBed } from '@angular/core/testing'; 3 | 4 | import { AppComponent } from './app.component'; 5 | 6 | describe('AppComponent', () => { 7 | 8 | beforeEach(async () => { 9 | await TestBed.configureTestingModule({ 10 | declarations: [AppComponent], 11 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 12 | }).compileComponents(); 13 | }); 14 | 15 | it('should create the app', () => { 16 | const fixture = TestBed.createComponent(AppComponent); 17 | const app = fixture.componentInstance; 18 | expect(app).toBeTruthy(); 19 | }); 20 | 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/configs/devices.config.ts: -------------------------------------------------------------------------------- 1 | export var deviceTypes = { 2 | DiyArduino: { 3 | vender: "点灯", 4 | deviceType: "DiyArduino", 5 | name: "独立设备", 6 | image: "diyarduino.png", 7 | configurator: ["bleConfig", "KeyConfig"], 8 | description: ` 9 | 支持多种独立设备接入 10 | 如Arduino、ESP8266、ESP32开发板或其他Linux设备`, 11 | guide: ` 12 | ## 点灯服务使用须知 13 | 1.您使用的是blinker开发者版本,我们会不定期更新支持库、App及服务器端程序,请确认您使用的是最新版本,才能正常使用blinker各功能。 14 | 2.点灯不对开发者版本做稳定性承诺。 15 | 3.有商业使用、或独立部署需求,请联系点灯购买企业版。 16 | 17 | *** 18 | 详细接入方法可见官网文档 https://diandeng.tech/doc 19 | ***`, 20 | component: "Layouter2", 21 | headerStyle: "dark", 22 | }, 23 | }; -------------------------------------------------------------------------------- /src/app/core/charts/charts.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { LineChartAreaComponent } from './line-chart-area/line-chart-area.component'; 4 | // import { NgxEchartsModule } from 'ngx-echarts'; 5 | // import * as echarts from 'echarts/core'; 6 | // import { SVGRenderer } from 'echarts/renderers'; 7 | 8 | // echarts.use([SVGRenderer]); 9 | 10 | @NgModule({ 11 | declarations: [LineChartAreaComponent], 12 | imports: [ 13 | CommonModule, 14 | // NgxEchartsModule.forRoot({ 15 | // echarts: () => import('echarts'), 16 | // }) 17 | ], 18 | exports: [ 19 | LineChartAreaComponent 20 | ] 21 | }) 22 | export class ChartsModule { } 23 | -------------------------------------------------------------------------------- /src/app/core/charts/line-chart-area/line-chart-area.component.html: -------------------------------------------------------------------------------- 1 | 2 |
-------------------------------------------------------------------------------- /src/app/core/charts/line-chart-area/line-chart-area.component.scss: -------------------------------------------------------------------------------- 1 | // :host { 2 | // width: 100%; 3 | // height: 100%; 4 | // position: relative; 5 | 6 | // [echarts] { 7 | // width: 100%; 8 | // height: 100%; 9 | // } 10 | 11 | // } 12 | 13 | .chart-box { 14 | margin: 10px; 15 | height: calc(100% - 10px); 16 | width: calc(100% - 5px); 17 | border-radius: 10px; 18 | overflow: hidden; 19 | display: flex; 20 | justify-content: center; 21 | align-items: center; 22 | color: #ccc; 23 | 24 | ::ng-deep { 25 | #tv-attr-logo { 26 | visibility: hidden; 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/app/core/components/b-actcmd-list/b-actcmd-list.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 |
10 | {{item.cmd | actcmd2text:device.id}} 11 |
12 |
13 |
14 |
15 |
-------------------------------------------------------------------------------- /src/app/core/components/b-actcmd-list/b-actcmd-list.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { BActcmdListComponent } from './b-actcmd-list.component'; 4 | import { IonicModule } from '@ionic/angular'; 5 | import { PipesModule } from '../../pipes/pipes.module'; 6 | import { widgetButtonListModule } from 'src/app/device/layouter2/widget-buttonlist/widget-buttonlist.module'; 7 | 8 | @NgModule({ 9 | declarations: [ 10 | BActcmdListComponent 11 | ], 12 | imports: [ 13 | IonicModule, 14 | CommonModule, 15 | PipesModule, 16 | widgetButtonListModule 17 | ], 18 | exports: [ 19 | BActcmdListComponent 20 | ] 21 | }) 22 | export class BActcmdListModule { } 23 | -------------------------------------------------------------------------------- /src/app/core/components/b-bottom-btn/b-bottom-btn.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/app/core/components/b-bottom-btn/b-bottom-btn.component.scss: -------------------------------------------------------------------------------- 1 | .bottom-btn { 2 | position: fixed; 3 | bottom: 0; 4 | left: 15px; 5 | 6 | box-shadow: 0 0 10px #ccc; 7 | border-radius: 8px 8px 0 0; 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | padding: 10px 20px 10px 20px; 12 | background-color: #fff; 13 | color: #389bee; 14 | width: calc(100% - 32px); 15 | height: 60px; 16 | font-size: 15px; 17 | } 18 | 19 | .isios{ 20 | height: 70px; 21 | padding-bottom:20px; 22 | } 23 | -------------------------------------------------------------------------------- /src/app/core/components/b-bottom-btn/b-bottom-btn.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { ViewService } from '../../services/view.service'; 3 | 4 | @Component({ 5 | selector: 'b-bottom-btn', 6 | templateUrl: './b-bottom-btn.component.html', 7 | styleUrls: ['./b-bottom-btn.component.scss'], 8 | }) 9 | export class BBottomBtnComponent implements OnInit { 10 | 11 | get isIos() { 12 | return this.viewService.isIos 13 | } 14 | 15 | constructor( 16 | private viewService: ViewService 17 | ) { } 18 | 19 | ngOnInit() { } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/app/core/components/b-chart/b-chart.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 暂无数据 7 |
8 | 15 |
-------------------------------------------------------------------------------- /src/app/core/components/b-chart/b-chart.component.scss: -------------------------------------------------------------------------------- 1 | .chart-box { 2 | width: 100%; 3 | height: 100%; 4 | position: relative; 5 | } 6 | 7 | .canvas-box { 8 | width: 100%; 9 | height: 100%; 10 | } 11 | 12 | 13 | .nodata { 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | width: 100%; 18 | height: 100%; 19 | display: flex; 20 | align-items: center; 21 | justify-content: center; 22 | font-size: 13px; 23 | color: #CCCCCC; 24 | margin-top: 2%; 25 | } 26 | 27 | select { 28 | position: absolute; 29 | top: 10px; 30 | right: 10px; 31 | height: 22px; 32 | border: 1px solid #CCCCCC; 33 | border-radius: 4px; 34 | font-size: 13px; 35 | background-color: #fff0; 36 | option{ 37 | color: #000; 38 | } 39 | } 40 | 41 | select.black{ 42 | color: #000; 43 | } 44 | 45 | select.white{ 46 | color: #FFF; 47 | } -------------------------------------------------------------------------------- /src/app/core/components/b-colorpicker-btns/b-colorpicker-btns.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 |
-------------------------------------------------------------------------------- /src/app/core/components/b-colorpicker-btns/b-colorpicker-btns.component.scss: -------------------------------------------------------------------------------- 1 | .btns { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | 6 | .color-btn { 7 | width: 20px; 8 | height: 20px; 9 | border-radius: 50%; 10 | border: 1px solid #B5B5B5; 11 | } 12 | 13 | .selected { 14 | border-radius: 50%; 15 | border: 1px solid #B5B5B5; 16 | width: 30px; 17 | height: 30px; 18 | margin: -6px; 19 | } 20 | } -------------------------------------------------------------------------------- /src/app/core/components/b-colorpicker-btns/b-colorpicker-btns.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'b-colorpicker-btns', 5 | templateUrl: './b-colorpicker-btns.component.html', 6 | styleUrls: ['./b-colorpicker-btns.component.scss'] 7 | }) 8 | export class BColorpickerBtnsComponent implements OnInit { 9 | 10 | colorList = [ 11 | '#595959', 12 | '#FFF', 13 | '#EA0909', 14 | '#00A90C', 15 | '#076EEF', 16 | '#6010E4', 17 | '#FBA613' 18 | ] 19 | 20 | @Input() selected; 21 | @Output() selectedChange: EventEmitter = new EventEmitter(); 22 | 23 | constructor() { } 24 | 25 | ngOnInit() { 26 | } 27 | 28 | selectColor(color) { 29 | this.selected = color; 30 | this.selectedChange.emit(color); 31 | } 32 | 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/app/core/components/b-colorpicker-disc/b-colorpicker-disc.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 |
7 | 8 |
9 |
10 | -------------------------------------------------------------------------------- /src/app/core/components/b-colorpicker/b-colorpicker.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
6 |
7 |
8 |
-------------------------------------------------------------------------------- /src/app/core/components/b-device-img/b-device-img.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/core/components/b-device-img/b-device-img.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/core/components/b-device-img/b-device-img.component.scss -------------------------------------------------------------------------------- /src/app/core/components/b-device-list/b-device-list.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |
7 |
8 |
{{deviceDataDict[deviceId].config.customName}}
9 |
{{deviceId}}
10 |
11 |
12 |
-------------------------------------------------------------------------------- /src/app/core/components/b-device-list/b-device-list.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/core/components/b-device-list/b-device-list.component.scss -------------------------------------------------------------------------------- /src/app/core/components/b-item-list/b-item-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/app/core/components/b-item-list/b-item-list.component.scss: -------------------------------------------------------------------------------- 1 | .item-list-box { 2 | padding-top: 5px; 3 | padding-bottom: 65px; 4 | } 5 | 6 | .item-list-box.edit { 7 | ::ng-deep { 8 | .item { 9 | margin-left: 60px; 10 | 11 | [edit-hide] { 12 | visibility: hidden; 13 | } 14 | } 15 | } 16 | } 17 | 18 | .item-list-box.sort.edit { 19 | ::ng-deep { 20 | .handle { 21 | z-index: 99; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/app/core/components/b-item-list/readme.md: -------------------------------------------------------------------------------- 1 | 给元素添加[edit-hide]可以隐藏该元素 -------------------------------------------------------------------------------- /src/app/core/components/b-progressbar/b-progressbar.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
{{text}}
8 |
9 |
-------------------------------------------------------------------------------- /src/app/core/components/b-range/b-range.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 |
8 |
9 |
11 |
-------------------------------------------------------------------------------- /src/app/core/components/b-timepicker/b-timepicker.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 |
-------------------------------------------------------------------------------- /src/app/core/components/b-timepicker/b-timepicker.component.scss: -------------------------------------------------------------------------------- 1 | .timebox { 2 | margin-top: 3px; 3 | padding: 0 15px; 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | font-size: 30px; 8 | height: 50px; 9 | background-color: #FFF; 10 | } -------------------------------------------------------------------------------- /src/app/core/components/b-tip/b-tip.component.html: -------------------------------------------------------------------------------- 1 |
3 |
4 | 5 | 6 | 7 |
{{tip.message}}
8 |
9 | 10 |
11 |
12 |
13 | 14 |
15 |
-------------------------------------------------------------------------------- /src/app/core/components/b-tip/b-tip.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { tipOptions } from '../../model/tip.model'; 3 | 4 | @Component({ 5 | selector: 'b-tip', 6 | templateUrl: './b-tip.component.html', 7 | styleUrls: ['./b-tip.component.scss'], 8 | }) 9 | export class BTipComponent implements OnInit { 10 | @Input() tip: tipOptions; 11 | 12 | hide = false; 13 | 14 | constructor() { } 15 | 16 | ngOnInit() { 17 | setTimeout(() => { 18 | setTimeout(() => { 19 | this.close() 20 | }, this.tip.delay) 21 | }, 100) 22 | } 23 | 24 | 25 | close() { 26 | this.hide = true; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/core/components/b-toast/b-toast.component.html: -------------------------------------------------------------------------------- 1 |
3 | 4 |
5 |
{{toast.device.config.customName}}
6 |
{{toast.message}}
7 |
8 |
9 | 10 |
11 |
-------------------------------------------------------------------------------- /src/app/core/components/b-toast/b-toast.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { toastOptions } from '../../model/toast.model'; 3 | 4 | 5 | @Component({ 6 | selector: 'b-toast', 7 | templateUrl: './b-toast.component.html', 8 | styleUrls: ['./b-toast.component.scss'], 9 | }) 10 | export class BToastComponent implements OnInit { 11 | 12 | @Input() toast: toastOptions; 13 | 14 | hide = false; 15 | 16 | constructor() { } 17 | 18 | ngOnInit() { 19 | setTimeout(() => { 20 | setTimeout(() => { 21 | this.close() 22 | }, this.toast.delay) 23 | }, 100) 24 | } 25 | 26 | close() { 27 | this.hide = true; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/app/core/components/b-toggle/b-toggle.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
-------------------------------------------------------------------------------- /src/app/core/components/b-toggle/b-toggle.component.scss: -------------------------------------------------------------------------------- 1 | .toggle-box { 2 | position: relative; 3 | // border: 1px solid #959595; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | background-color: #E0E0E0; 8 | border-radius: 13.5px; 9 | width: 45px; 10 | height: 25px; 11 | transition: all 0.3s; 12 | 13 | .toggle-inner { 14 | border-radius: 50%; 15 | background: #fff; 16 | height: 21px; 17 | width: 21px; 18 | position: absolute; 19 | transition: all 0.3s; 20 | } 21 | 22 | .on { 23 | right: 2px; 24 | } 25 | 26 | .off { 27 | right: calc(100% - 23px); 28 | } 29 | } -------------------------------------------------------------------------------- /src/app/core/components/b-toggle/b-toggle.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input, Output, EventEmitter, HostListener } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'b-toggle', 5 | templateUrl: './b-toggle.component.html', 6 | styleUrls: ['./b-toggle.component.scss'], 7 | }) 8 | export class BToggleComponent implements OnInit { 9 | 10 | @Input() color = "#389bee"; 11 | // @Input() state: any = 'on' 12 | @Input() switch: any = true 13 | @Output() stateChange = new EventEmitter() 14 | 15 | // @HostListener('click', ['$event.target']) 16 | // public onClick(targetElement) { 17 | // if (this.state == 'on') 18 | // this.state = 'off' 19 | // else 20 | // this.state = 'on' 21 | // this.stateChange.emit(this.state) 22 | // } 23 | 24 | 25 | constructor() { } 26 | 27 | ngOnInit() { } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/app/core/components/b-top-box/b-top-box.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
-------------------------------------------------------------------------------- /src/app/core/components/b-top-box/b-top-box.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'b-top-box', 5 | templateUrl: './b-top-box.component.html', 6 | styleUrls: ['./b-top-box.component.scss'], 7 | }) 8 | export class BTopBoxComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() {} 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/app/core/components/deviceblock-list2/deviceblock-list2.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
5 | 6 |
7 |
8 | 9 | {{deviceDataDict[deviceId].config.customName}} 10 | 11 |
12 | 13 |
14 |
15 |
-------------------------------------------------------------------------------- /src/app/core/components/deviceblock-list2/deviceblock-list2.ts: -------------------------------------------------------------------------------- 1 | import { Component, Output, EventEmitter, Input } from '@angular/core'; 2 | import { DataService } from '../../services/data.service'; 3 | 4 | @Component({ 5 | selector: 'deviceblock-list2', 6 | templateUrl: 'deviceblock-list2.html', 7 | styleUrls: ['deviceblock-list2.scss'] 8 | }) 9 | export class DeviceblockList2Component { 10 | selectedDeviceIndex; 11 | selectedDevice; 12 | @Input() max = 2; 13 | @Output() update = new EventEmitter(); 14 | 15 | 16 | get deviceDataDict() { 17 | return this.dataService.device.dict 18 | } 19 | 20 | get deviceDataList() { 21 | return this.dataService.device.list 22 | } 23 | 24 | constructor( 25 | private dataService: DataService, 26 | ) { } 27 | 28 | selectDevice(id, device) { 29 | this.selectedDeviceIndex = id; 30 | this.update.emit(device); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/app/core/components/lang-selector/lang-selector.component.scss: -------------------------------------------------------------------------------- 1 | .lang-selector { 2 | display: flex; 3 | align-items: center; 4 | } 5 | 6 | .lang-item { 7 | padding-left: 15px; 8 | height: 45px; 9 | display: flex; 10 | align-items: center; 11 | } 12 | 13 | img { 14 | width: 25px; 15 | } 16 | 17 | .lang-text { 18 | font-size: 11px; 19 | margin-left: 8px; 20 | color: #333; 21 | } -------------------------------------------------------------------------------- /src/app/core/components/lang-selector/lang-selector.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { LangSelectorComponent } from './lang-selector.component'; 4 | 5 | @NgModule({ 6 | declarations: [LangSelectorComponent], 7 | imports: [ 8 | CommonModule 9 | ], 10 | exports: [LangSelectorComponent] 11 | }) 12 | export class LangSelectorModule { } 13 | -------------------------------------------------------------------------------- /src/app/core/components/scene-button-group/scene-button-group.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
-------------------------------------------------------------------------------- /src/app/core/components/scene-button-group/scene-button-group.scss: -------------------------------------------------------------------------------- 1 | .scrollHeight { 2 | height: 80px; 3 | width: 100vw; 4 | overflow-x: scroll; 5 | } 6 | 7 | .buttonbox { 8 | padding: 10px 15px; 9 | display: flex; 10 | flex-direction: row; 11 | justify-items: flex-start; 12 | align-items: center; 13 | .wspace { 14 | padding-left: 9px; 15 | height: 60px; 16 | } 17 | } 18 | 19 | scene-button { 20 | width: 100px; 21 | margin-right: 6px; 22 | } 23 | 24 | .icon { 25 | color: #389BEE 26 | } 27 | 28 | .sschosen { 29 | opacity: 0; 30 | } 31 | 32 | .ssdrag { 33 | .scene-btn { 34 | opacity: 1; 35 | box-shadow: 0 0 5px 3px rgba(60, 150, 255, 0.8); 36 | } 37 | } -------------------------------------------------------------------------------- /src/app/core/components/scene-button-group/scene-button/scene-button.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
{{sceneName}}
6 |
7 | 8 |
9 | 10 |
11 |
12 |
-------------------------------------------------------------------------------- /src/app/core/directives/directives.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { StatuabrOverlayPaddingDirective } from './overlay-padding.directive'; 4 | 5 | @NgModule({ 6 | declarations: [StatuabrOverlayPaddingDirective], 7 | imports: [ 8 | CommonModule 9 | ], 10 | exports: [ 11 | StatuabrOverlayPaddingDirective 12 | ] 13 | }) 14 | export class DirectivesModule { } 15 | -------------------------------------------------------------------------------- /src/app/core/directives/overlay-padding.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, ElementRef, OnInit } from '@angular/core'; 2 | import { ViewService } from '../services/view.service'; 3 | 4 | @Directive({ 5 | selector: '[overlayPadding]', 6 | exportAs: 'appOverlayPadding' 7 | }) 8 | export class StatuabrOverlayPaddingDirective implements OnInit { 9 | 10 | constructor( 11 | private ele: ElementRef, 12 | private viewService: ViewService 13 | ) { 14 | } 15 | 16 | ngOnInit() { 17 | this.ele.nativeElement.style.paddingTop = this.viewService.statusBarHeight + 'px'; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/app/core/functions/check.ts: -------------------------------------------------------------------------------- 1 | export function checkUsername(username) { 2 | if (username.length > 6) return true; 3 | return false; 4 | } 5 | 6 | export function checkPhone(phone) { 7 | if ((phone.length == 11) && (parseInt(phone) >= 10000000000)) return true; 8 | return false 9 | } 10 | 11 | export function checkSmscode(smscode) { 12 | if (smscode.length == 6) return true; 13 | return false; 14 | } 15 | 16 | export function checkPassword(password) { 17 | if (password.length > 7) return true; 18 | return false; 19 | } -------------------------------------------------------------------------------- /src/app/core/guard/auth.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; 3 | import { Observable } from 'rxjs'; 4 | import { UserService } from '../services/user.service'; 5 | import { NavController } from '@ionic/angular'; 6 | import { DataService } from '../services/data.service'; 7 | 8 | 9 | @Injectable({ 10 | providedIn: 'root' 11 | }) 12 | export class AuthGuard { 13 | constructor( 14 | private router: Router, 15 | private userService: UserService, 16 | private dataService: DataService, 17 | private navCtrl: NavController 18 | ) { 19 | } 20 | 21 | canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean { 22 | return true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/core/modals/action-selector-modal/action-selector-modal.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | {{item.cmd | actcmd2text:device.id}} 7 |
8 |
9 | 10 |
{{'DEVICE.NO_ACTION' | translate}}
11 |
自动生成动作
12 |
13 |
14 |
-------------------------------------------------------------------------------- /src/app/core/modals/action-selector-modal/action-selector-modal.component.scss: -------------------------------------------------------------------------------- 1 | @import "../repeat-selector-modal/repeat-selector-modal.component.scss"; 2 | 3 | .select-modal { 4 | padding: 0 15px; 5 | } 6 | 7 | .item-list { 8 | overflow-y: scroll; 9 | justify-content: flex-start; 10 | height: 100%; 11 | font-size: 14px; 12 | 13 | .item { 14 | flex-grow: 0; 15 | flex-shrink: 0; 16 | } 17 | } 18 | 19 | .btn{ 20 | padding: 15px; 21 | text-align: center; 22 | color:#389BEE; 23 | } 24 | 25 | -------------------------------------------------------------------------------- /src/app/core/modals/device-selector-modal/device-selector-modal.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | 7 | {{deviceDataDict[deviceId].config.customName}} 8 |
9 |
10 |
11 |
-------------------------------------------------------------------------------- /src/app/core/modals/device-selector-modal/device-selector-modal.component.scss: -------------------------------------------------------------------------------- 1 | @import "../repeat-selector-modal/repeat-selector-modal.component.scss"; 2 | 3 | .item-list { 4 | overflow-y: scroll; 5 | justify-content: flex-start; 6 | height: 100%; 7 | 8 | .item { 9 | height: 72px !important; 10 | justify-content: flex-start; 11 | } 12 | } 13 | 14 | b-device-img { 15 | margin-right: 15px; 16 | 17 | ::ng-deep { 18 | img { 19 | height: 50px; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/app/core/modals/repeat-selector-modal/repeat-selector-modal.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
{{day}}
6 | 7 | 8 | 9 | 10 |
11 |
12 | 17 |
-------------------------------------------------------------------------------- /src/app/core/modals/selector-modal/selector-modal.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | {{item.text}} 7 |
8 |
9 |
10 |
-------------------------------------------------------------------------------- /src/app/core/modals/selector-modal/selector-modal.component.scss: -------------------------------------------------------------------------------- 1 | @import "../repeat-selector-modal/repeat-selector-modal.component.scss"; 2 | 3 | .select-modal { 4 | padding: 0 15px; 5 | } 6 | 7 | .item-list { 8 | overflow-y: scroll; 9 | justify-content: flex-start; 10 | height: 100%; 11 | 12 | .item { 13 | flex-grow: 0; 14 | flex-shrink: 0; 15 | height: 52px; 16 | } 17 | } -------------------------------------------------------------------------------- /src/app/core/modals/time-selector-modal/time-selector-modal.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
{{time}}
4 | -------------------------------------------------------------------------------- /src/app/core/modals/time-selector-modal/time-selector-modal.component.scss: -------------------------------------------------------------------------------- 1 | @import "../repeat-selector-modal/repeat-selector-modal.component.scss"; 2 | 3 | .select-modal { 4 | height: 274px; 5 | padding: 0; 6 | overflow: hidden; 7 | } 8 | 9 | .modal-footer { 10 | width: 100% !important; 11 | z-index: 99; 12 | } -------------------------------------------------------------------------------- /src/app/core/model/broker.model.ts: -------------------------------------------------------------------------------- 1 | import { BehaviorSubject } from "rxjs"; 2 | 3 | export interface BlinkerBroker { 4 | vender: string, 5 | host: string, 6 | options: any, 7 | topic: any, 8 | dataTemplate: any, 9 | client?: any, 10 | connected?: BehaviorSubject 11 | } -------------------------------------------------------------------------------- /src/app/core/model/data.model.ts: -------------------------------------------------------------------------------- 1 | export interface AuthData { 2 | uuid: string, 3 | token: string 4 | } 5 | 6 | export interface UserData { 7 | username: string, 8 | avatar: string, 9 | phone: string, 10 | level?: number 11 | } 12 | 13 | export interface OrderData { 14 | dict: any; 15 | list: string[]; 16 | } 17 | 18 | export interface ShareDate { 19 | share: any, 20 | share0: any, 21 | shared: any[], 22 | shared0: any[] 23 | } 24 | -------------------------------------------------------------------------------- /src/app/core/model/device-config.model.ts: -------------------------------------------------------------------------------- 1 | export interface BlinkerDeviceConfig { 2 | component?: string, 3 | configurator?: string[], 4 | description: string, 5 | deviceType: string, 6 | guide: string, 7 | headerStyle: string, 8 | image: string, 9 | layouter?: string, 10 | mode: string, 11 | name: string, 12 | speech?: any[], // 2.3.0已移除 13 | timer?: any[], // 2.3.0已移除 14 | actions?: string, 15 | triggers?: string, 16 | vender: string 17 | } 18 | 19 | 20 | export interface TriggerConfig { 21 | source: string, 22 | source_zh: string, 23 | state?: string[], 24 | range?: number[], 25 | enableDuration?: boolean, 26 | state_zh?: string[], 27 | unit?: string, 28 | unit_zh?: string, 29 | speech?: string, 30 | } 31 | 32 | export interface ActionConfig { 33 | cmd: any, 34 | text: string 35 | } -------------------------------------------------------------------------------- /src/app/core/model/response.model.ts: -------------------------------------------------------------------------------- 1 | export interface BlinkerResponse { 2 | message: number, 3 | detail: any 4 | } -------------------------------------------------------------------------------- /src/app/core/model/tip.model.ts: -------------------------------------------------------------------------------- 1 | export interface tipOptions { 2 | message: string, 3 | delay?: number, 4 | url?: string, 5 | type?: string 6 | } -------------------------------------------------------------------------------- /src/app/core/model/toast.model.ts: -------------------------------------------------------------------------------- 1 | import { BlinkerDevice } from "./device.model"; 2 | 3 | export interface toastOptions { 4 | deviceId?: string, 5 | device?: BlinkerDevice 6 | message: string, 7 | delay?: number 8 | } -------------------------------------------------------------------------------- /src/app/core/pages/avatar/avatar-picker.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { AvatarPickerComponent } from './avatar-picker.component'; 4 | import { IonicModule } from '@ionic/angular'; 5 | import { DirectivesModule } from '../../directives/directives.module'; 6 | 7 | @NgModule({ 8 | declarations: [AvatarPickerComponent], 9 | imports: [ 10 | CommonModule, 11 | IonicModule, 12 | DirectivesModule 13 | ], 14 | exports: [ 15 | AvatarPickerComponent 16 | ] 17 | }) 18 | export class AvatarPickerModule { } 19 | -------------------------------------------------------------------------------- /src/app/core/pages/device-icon/device-icon.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { IonicModule } from '@ionic/angular'; 5 | import { DeviceIconPage } from './device-icon'; 6 | import { PipesModule } from 'src/app/core/pipes/pipes.module'; 7 | import { ComponentsModule } from '../../components/components.module'; 8 | import { DirectivesModule } from '../../directives/directives.module'; 9 | 10 | @NgModule({ 11 | imports: [ 12 | CommonModule, 13 | FormsModule, 14 | IonicModule, 15 | PipesModule, 16 | ComponentsModule, 17 | DirectivesModule 18 | ], 19 | declarations: [ 20 | DeviceIconPage, 21 | ] 22 | }) 23 | export class DeviceIconPageModule { } 24 | 25 | -------------------------------------------------------------------------------- /src/app/core/pages/doc/doc.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | 8 | import { DocPage } from './doc.page'; 9 | import { PipesModule } from '../../pipes/pipes.module'; 10 | import { MarkdownModule } from 'ngx-markdown'; 11 | import { DirectivesModule } from '../../directives/directives.module'; 12 | 13 | // const routes: Routes = [ 14 | // { 15 | // path: 'doc/:docName', 16 | // component: DocPage 17 | // } 18 | // ]; 19 | 20 | @NgModule({ 21 | imports: [ 22 | CommonModule, 23 | IonicModule, 24 | DirectivesModule, 25 | MarkdownModule.forChild(), 26 | ], 27 | declarations: [DocPage] 28 | }) 29 | export class DocModule { } 30 | -------------------------------------------------------------------------------- /src/app/core/pages/doc/doc.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{docTitle}} 9 | 10 | 11 | 12 | 13 | 14 |
15 |
-------------------------------------------------------------------------------- /src/app/core/pages/doc/doc.page.scss: -------------------------------------------------------------------------------- 1 | [markdown] { 2 | padding: 0 15px; 3 | } 4 | 5 | ion-header { 6 | i { 7 | font-size: 24px; 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/app/core/pages/doc/doc.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, Input } from '@angular/core'; 2 | import { DocService } from '../../services/doc.service'; 3 | import { ModalController } from '@ionic/angular'; 4 | 5 | @Component({ 6 | selector: 'app-doc', 7 | templateUrl: './doc.page.html', 8 | styleUrls: ['./doc.page.scss'], 9 | }) 10 | export class DocPage implements OnInit { 11 | 12 | @Input() 13 | docTitle = ""; 14 | 15 | @Input() 16 | docUrl = ""; 17 | 18 | docContent = ""; 19 | 20 | constructor( 21 | private docService: DocService, 22 | private modalCtrl: ModalController, 23 | ) { } 24 | 25 | ngOnInit() { 26 | this.docService.getMarkdownDoc(this.docUrl).then(content => { 27 | this.docContent = content 28 | }) 29 | } 30 | 31 | async close() { 32 | (await this.modalCtrl.getTop()).dismiss() 33 | // this.modalCtrl.dismiss() 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/app/core/pages/icon-list/icon-list.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { IconListPage } from './icon-list'; 8 | import { DirectivesModule } from '../../directives/directives.module'; 9 | 10 | @NgModule({ 11 | imports: [ 12 | CommonModule, 13 | IonicModule, 14 | DirectivesModule 15 | ], 16 | declarations: [IconListPage], 17 | exports: [IconListPage] 18 | }) 19 | export class IconListPageModule { } 20 | -------------------------------------------------------------------------------- /src/app/core/pipes/days2text.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'days2text', 5 | }) 6 | export class Days2TextPipe implements PipeTransform { 7 | 8 | transform(days) { 9 | if (days == '0000000') 10 | return '不重复' 11 | if (days == '1111111') 12 | return '每天' 13 | if (days == '0111110') 14 | return '周一至周五' 15 | 16 | let text = ""; 17 | if (days[0] == '1') text = '周日' 18 | if (days[1] == '1') text = text + ' 周一' 19 | if (days[2] == '1') text = text + ' 周二' 20 | if (days[3] == '1') text = text + ' 周三' 21 | if (days[4] == '1') text = text + ' 周四' 22 | if (days[5] == '1') text = text + ' 周五' 23 | if (days[6] == '1') text = text + ' 周六' 24 | return text 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/app/core/pipes/device2name.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { DataService } from '../services/data.service'; 3 | import { DeviceConfigService } from '../services/device-config.service'; 4 | 5 | @Pipe({ 6 | name: 'device2name', 7 | }) 8 | export class Device2NamePipe implements PipeTransform { 9 | 10 | constructor( 11 | private deviceConfigService: DeviceConfigService 12 | ) { } 13 | 14 | transform(device) { 15 | try { 16 | let deviceConfig = this.deviceConfigService.getDeviceConfig(device) 17 | if (deviceConfig.name == 'Arduino' || deviceConfig.name == 'Linux设备') 18 | return deviceConfig.vender 19 | return deviceConfig.vender + '·' + deviceConfig.name 20 | } catch (error) { 21 | return 'Unknown' 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/app/core/pipes/html.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { DomSanitizer } from '@angular/platform-browser'; 3 | 4 | @Pipe({ 5 | name: 'html' 6 | }) 7 | export class HtmlPipe implements PipeTransform { 8 | 9 | constructor (private sanitizer: DomSanitizer) { 10 | } 11 | 12 | transform(style) { 13 | return this.sanitizer.bypassSecurityTrustHtml(style); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/core/pipes/minute-to-time.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'minuteToTime', 5 | }) 6 | export class MinuteToTimePipe implements PipeTransform { 7 | 8 | transform(minute: any, ...args) { 9 | return this.minuteToTime(minute); 10 | } 11 | 12 | minuteToTime(minute): string { 13 | let h = Math.floor(minute / 60); 14 | let time = ""; 15 | let m = Math.floor(minute % 60); 16 | if (h < 10) time = "0" + h + ":"; 17 | else time = h + ":"; 18 | if (m < 10) time += "0" + m; 19 | else time += m; 20 | return time; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/core/pipes/ms-to-date.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'msToDate', 5 | }) 6 | export class MsToDatePipe implements PipeTransform { 7 | transform(msdate:number) { 8 | let date=new Date(msdate*1000) 9 | return date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/core/pipes/obj-to-str.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | // import { getCmdList } from 'src/app/devices/config' 3 | @Pipe({ 4 | name: 'objToStr', 5 | }) 6 | export class ObjToStrPipe implements PipeTransform { 7 | 8 | transform(obj, ...args) { 9 | return this.objToStr(obj); 10 | } 11 | 12 | objToStr(obj): string { 13 | return JSON.stringify(obj); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/core/pipes/ownplug-act2str.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'ownplugAct2str', 5 | }) 6 | export class OwnplugAct2strPipe implements PipeTransform { 7 | 8 | transform(act) { 9 | JSON.stringify(act[0]) == `{"switch":"on"}` 10 | return ((JSON.stringify(act[0]) == `{"switch":"on"}`) ? '打开设备' : '关闭设备') 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/core/pipes/wrap.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'wrap' 5 | }) 6 | export class WrapPipe implements PipeTransform { 7 | 8 | transform(value: any, args?: any): any { 9 | return value.replace(//g, `>`).replace(/ /g, ` `).replace(/\r\n/g, `
`).replace(/\n/g, `
`); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/app/core/services/tip.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { arrayRemove } from '../functions/func'; 3 | import { tipOptions } from '../model/tip.model'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class TipService { 9 | 10 | list: tipOptions[] = [] 11 | 12 | constructor() { } 13 | 14 | show(options: tipOptions) { 15 | if (typeof options.delay == 'undefined') options['delay'] = 5000; 16 | this.list.push(options) 17 | setTimeout(() => { 18 | arrayRemove(this.list, this.list.indexOf(options)) 19 | }, options.delay + 1000) 20 | console.log(this.list); 21 | 22 | } 23 | 24 | hide() { 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/core/services/toast.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { arrayRemove } from '../functions/func'; 3 | import { toastOptions } from '../model/toast.model'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class ToastService { 9 | 10 | list: toastOptions[] = [] 11 | 12 | constructor() { } 13 | 14 | show(options: toastOptions) { 15 | if (typeof options.delay == 'undefined') options.delay = 5000; 16 | this.list.push(options) 17 | setTimeout(() => { 18 | arrayRemove(this.list, this.list.indexOf(options)) 19 | }, options.delay + 1000) 20 | } 21 | 22 | hide() { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app/debug/debug.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { DebugComponent } from './debug.component'; 5 | import { PipesModule } from '../core/pipes/pipes.module'; 6 | 7 | @NgModule({ 8 | declarations: [ 9 | DebugComponent 10 | ], 11 | imports: [ 12 | PipesModule, 13 | CommonModule, 14 | FormsModule, 15 | ], 16 | exports: [ 17 | DebugComponent 18 | ] 19 | }) 20 | export class DebugModule { } 21 | -------------------------------------------------------------------------------- /src/app/device/layouter2/guide/examples/examples.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
{{item.name}}
7 |
8 |
9 |
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/app/device/layouter2/guide/guide.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | position: fixed; 3 | top: 0; 4 | left: 0; 5 | width: 100vw; 6 | height: 100vh; 7 | } 8 | 9 | .guide-box { 10 | width: 100%; 11 | height: 100%; 12 | position: relative; 13 | background-color: rgba(255, 255, 255, 0.8); 14 | color: #fff; 15 | 16 | &.dark { 17 | background-color: rgba(0, 0, 0, 0.6); 18 | } 19 | } 20 | 21 | .header { 22 | padding-top: 45px; 23 | height: 100px; 24 | display: flex; 25 | justify-content: center; 26 | align-items: center; 27 | transition: all 0.3s; 28 | opacity: 1; 29 | 30 | &.fold { 31 | height: 50px !important; 32 | opacity: 0 !important; 33 | } 34 | } 35 | 36 | .animate__animated { 37 | --animate-duration: 0.3s; 38 | } 39 | 40 | .guide-content { 41 | height: calc(100vh - 127px); 42 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/ieconfig/ieconfig.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
更新配置
4 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/ieconfig/ieconfig.component.scss: -------------------------------------------------------------------------------- 1 | .configzone { 2 | width: 100%; 3 | height: 70%; 4 | } 5 | 6 | .btnbox { 7 | display: flex; 8 | justify-content: space-between; 9 | margin-top: 3vh; 10 | .btn40 { 11 | width: 100%; 12 | } 13 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/ieconfig/ieconfig.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { IonicModule } from '@ionic/angular'; 5 | import { IeconfigComponent } from './ieconfig.component' 6 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 7 | 8 | @NgModule({ 9 | imports: [ 10 | CommonModule, 11 | FormsModule, 12 | IonicModule, 13 | DirectivesModule 14 | ], 15 | declarations: [IeconfigComponent], 16 | exports: [ 17 | IeconfigComponent 18 | ] 19 | }) 20 | export class IeconfigModule { } 21 | -------------------------------------------------------------------------------- /src/app/device/layouter2/layouter.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | import { DevicePage } from '../device.page'; 4 | 5 | @Injectable({ 6 | providedIn: 'root' 7 | }) 8 | export class LayouterGuard { 9 | 10 | canDeactivate(component: DevicePage) { 11 | return component.canDeactivate() 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/app/device/layouter2/layouter.interface.ts: -------------------------------------------------------------------------------- 1 | export interface Layouter2Data { 2 | version: string, 3 | header?: { 4 | background: string, 5 | color: string 6 | }, 7 | background?: { 8 | background: string, 9 | }, 10 | dashboard: WidgetData[], 11 | actions: ActionData[], 12 | triggers: TriggerData[] 13 | } 14 | 15 | export interface Layouter2Config { 16 | headerColor: string, 17 | headerStyle: string, 18 | background: any 19 | } 20 | 21 | // interface Layouter2ConfigBackground { 22 | // img: string, 23 | // isFull: boolean 24 | // } 25 | 26 | 27 | export interface WidgetData { 28 | 29 | } 30 | 31 | export interface ActionData { 32 | text: any, 33 | cmd: any 34 | } 35 | 36 | export interface TriggerData { 37 | 38 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/newui/bottom-btn/bottom-btn.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
{{title}}
7 |
8 | {{text}} 9 |
10 |
11 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/newui/bottom-btn/bottom-btn.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'nui-bottom-btn', 5 | templateUrl: './bottom-btn.component.html', 6 | styleUrls: ['./bottom-btn.component.scss'], 7 | }) 8 | export class BottomBtnComponent implements OnInit { 9 | 10 | @Input() icon = '' 11 | @Input() title = '' 12 | @Input() text = '' 13 | 14 | // @Input() willEnterState = false; 15 | 16 | constructor() { } 17 | 18 | ngOnInit() { } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/app/device/layouter2/newui/item-list/item-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/newui/item-list/item-list.component.scss: -------------------------------------------------------------------------------- 1 | .item-list { 2 | position: relative; 3 | width: 100%; 4 | transition: all 0.3s; 5 | } 6 | 7 | .dark { 8 | 9 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/newui/item/item.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
{{title}}
7 |
8 | {{text}} 9 |
10 |
11 |
12 | 13 | 14 | 15 |
16 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/newui/item/item.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'nui-item', 5 | templateUrl: './item.component.html', 6 | styleUrls: ['./item.component.scss'], 7 | }) 8 | export class ItemComponent implements OnInit { 9 | 10 | @Input() icon = '' 11 | @Input() title = '' 12 | @Input() text = '' 13 | @Input() state = 'undone' 14 | 15 | constructor() { } 16 | 17 | ngOnInit() { } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/app/device/layouter2/newui/newui.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { BottomBtnComponent } from './bottom-btn/bottom-btn.component'; 4 | import { ItemComponent } from './item/item.component'; 5 | import { ItemListComponent } from './item-list/item-list.component'; 6 | 7 | 8 | 9 | @NgModule({ 10 | declarations: [ 11 | BottomBtnComponent, 12 | ItemComponent, 13 | ItemListComponent 14 | ], 15 | imports: [ 16 | CommonModule 17 | ], 18 | exports: [ 19 | BottomBtnComponent, 20 | ItemComponent, 21 | ItemListComponent 22 | ] 23 | }) 24 | export class NewuiModule { } 25 | -------------------------------------------------------------------------------- /src/app/device/layouter2/newui/newui.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Subject } from 'rxjs'; 3 | 4 | @Injectable({ 5 | providedIn: 'root' 6 | }) 7 | export class NewuiService { 8 | 9 | back = new Subject() 10 | 11 | constructor() { } 12 | 13 | 14 | goBack() { 15 | this.back.next(-1) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-buttonlist/widget-buttonlist.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
6 | 7 |
8 |
9 |
10 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-buttonlist/widget-buttonlist.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { IonicModule } from '@ionic/angular'; 5 | 6 | import { widgetButtonListComponent } from './widget-buttonlist'; 7 | import { WidgetsModule } from '../widgets/widgets.module'; 8 | 9 | @NgModule({ 10 | imports: [ 11 | CommonModule, 12 | IonicModule, 13 | WidgetsModule 14 | ], 15 | declarations: [widgetButtonListComponent], 16 | exports: [widgetButtonListComponent] 17 | }) 18 | export class widgetButtonListModule { } 19 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/background-edit/background-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; 2 | 3 | .clear { 4 | position: absolute; 5 | right: 0; 6 | top: 0; 7 | padding: 6px; 8 | font-size: 12px; 9 | font-weight: 500; 10 | color: #fff; 11 | background: #389bee; 12 | 13 | i { 14 | margin-right: 5px; 15 | font-size: 14px; 16 | } 17 | } 18 | 19 | .clear2{ 20 | right: 61px; 21 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/background-edit/background-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | // import { DefaultBackgroundCss, TransparentBackgroundCss } from '../../widgets/config'; 3 | 4 | @Component({ 5 | selector: 'widget-background-edit', 6 | templateUrl: './background-edit.component.html', 7 | styleUrls: ['./background-edit.component.scss'], 8 | }) 9 | export class BackgroundEditComponent implements OnInit { 10 | 11 | @Input() widget 12 | // : WidgetData | any; 13 | 14 | constructor() { } 15 | 16 | ngOnInit() { 17 | if (!this.widget['background']) 18 | this.init() 19 | } 20 | 21 | init() { 22 | // this.widget['background'] = JSON.parse(JSON.stringify(DefaultBackgroundCss)) 23 | } 24 | 25 | clear() { 26 | // this.widget['background'] = JSON.parse(JSON.stringify(TransparentBackgroundCss)) 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/base-edit/base-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; 2 | 3 | [setting-title] { 4 | margin: 0px 0 10px; 5 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/base-edit/base-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { Layouter2Service } from '../../layouter2.service'; 3 | 4 | @Component({ 5 | selector: 'widget-base-edit', 6 | templateUrl: './base-edit.component.html', 7 | styleUrls: ['./base-edit.component.scss'], 8 | }) 9 | export class WidgetBaseEditComponent implements OnInit { 10 | 11 | @Input() widget; 12 | 13 | constructor( 14 | private layouterService: Layouter2Service 15 | ) { } 16 | 17 | ngOnInit() { } 18 | 19 | 20 | valueChange() { 21 | this.layouterService.changeWidget() 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/align-selector/align-selector.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 |
7 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/align-selector/align-selector.component.scss: -------------------------------------------------------------------------------- 1 | .check-list { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | flex-wrap: wrap; 6 | height: 100%; 7 | width: 105px; 8 | 9 | .item { 10 | display: flex; 11 | justify-content: center; 12 | align-items: center; 13 | padding: 5px; 14 | border: 1px solid #CCC; 15 | height: 35px; 16 | width: 35px; 17 | color: #666; 18 | 19 | &.selected { 20 | background-color: #389bee; 21 | color: #FFF; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/check-list/check-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
5 | {{item.name}} 6 |
7 |
8 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/check-list/check-list.component.scss: -------------------------------------------------------------------------------- 1 | .check-list { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | height: 100%; 6 | 7 | .item { 8 | display: flex; 9 | justify-content: center; 10 | align-items: center; 11 | padding: 5px; 12 | border-right: 1px solid #CCC; 13 | height: 100%; 14 | color: #666; 15 | 16 | &.selected { 17 | background-color: #389bee; 18 | color: #FFF; 19 | } 20 | 21 | &:last-child { 22 | border-right: none; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/color-picker/color-picker.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 6 | 7 |
8 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/color-picker/color-picker.component.scss: -------------------------------------------------------------------------------- 1 | .color-picker { 2 | position: relative; 3 | height: 40px; 4 | display: flex; 5 | align-items: center; 6 | 7 | .btn-box { 8 | position: absolute; 9 | right: 0; 10 | } 11 | 12 | ngx-colors { 13 | width: 40px; 14 | height: 40px; 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | border-left: 1px solid #CCC; 19 | } 20 | 21 | input { 22 | padding-left: 10px; 23 | height: 100%; 24 | width: 100%; 25 | text-align: left; 26 | } 27 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/color-picker/color-picker.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'color-picker', 5 | templateUrl: './color-picker.component.html', 6 | styleUrls: ['./color-picker.component.scss'], 7 | }) 8 | export class ColorPickerComponent implements OnInit { 9 | 10 | @Input() value; 11 | @Output() valueChange = new EventEmitter(); 12 | 13 | constructor() { } 14 | 15 | ngOnInit() { } 16 | 17 | change(e) { 18 | this.value = e 19 | this.valueChange.emit(this.value); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/double-number-input/double-number-input.component.scss: -------------------------------------------------------------------------------- 1 | .double-number-input { 2 | position: relative; 3 | width: 100%; 4 | height: 40px; 5 | display: flex; 6 | align-items: center; 7 | 8 | input { 9 | padding-left: 10px; 10 | height: 100%; 11 | width: calc(50% - 80px); 12 | text-align: left; 13 | } 14 | 15 | .btn-box { 16 | height: 100%; 17 | display: flex; 18 | 19 | .btn { 20 | border-left: 1px solid #CCC; 21 | display: flex; 22 | justify-content: center; 23 | align-items: center; 24 | height: 38px; 25 | width: 40px; 26 | 27 | } 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/icon-picker/icon-picker.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 |
7 |
8 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/icon-picker/icon-picker.component.scss: -------------------------------------------------------------------------------- 1 | .color-picker { 2 | position: relative; 3 | height: 40px; 4 | display: flex; 5 | align-items: center; 6 | 7 | input { 8 | padding-left: 10px; 9 | height: 100%; 10 | width: 100%; 11 | text-align: left; 12 | } 13 | 14 | .btn-box { 15 | height: 100%; 16 | display: flex; 17 | 18 | .btn { 19 | border-left: 1px solid #CCC; 20 | display: flex; 21 | justify-content: center; 22 | align-items: center; 23 | height: 38px; 24 | width: 40px; 25 | font-size: 24px; 26 | } 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/number-input/number-input.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 |
7 |
8 | 9 |
10 |
11 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/edit-components/number-input/number-input.component.scss: -------------------------------------------------------------------------------- 1 | .number-input { 2 | position: relative; 3 | height: 40px; 4 | display: flex; 5 | align-items: center; 6 | 7 | input { 8 | padding-left: 10px; 9 | height: 100%; 10 | width: 100%; 11 | text-align: left; 12 | } 13 | 14 | .btn-box { 15 | height: 100%; 16 | display: flex; 17 | 18 | .btn { 19 | border-left: 1px solid #CCC; 20 | display: flex; 21 | justify-content: center; 22 | align-items: center; 23 | height: 38px; 24 | width: 40px; 25 | 26 | } 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-button-edit/widget-button-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-chart-edit/widget-chart-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 | 图表设置 3 |
4 |
5 |
数据{{i+1}}
6 |
7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 | 添加数据 16 |
17 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-chart-edit/widget-chart-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; 2 | 3 | [input-box] { 4 | display: flex; 5 | 6 | input { 7 | width: calc(50% - 20px) !important; 8 | border-right: 1px solid #cccccc !important; 9 | } 10 | 11 | color-picker { 12 | width: 38px; 13 | 14 | ::ng-deep { 15 | input { 16 | display: none; 17 | } 18 | } 19 | } 20 | } 21 | 22 | .add-btn { 23 | width: 70%; 24 | font-size: 14px; 25 | background: #389bee; 26 | color: #FFF; 27 | height: 36px; 28 | display: flex; 29 | justify-content: center; 30 | align-items: center; 31 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-chart-edit/widget-chart-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-chart-edit', 5 | templateUrl: './widget-chart-edit.component.html', 6 | styleUrls: ['./widget-chart-edit.component.scss'], 7 | }) 8 | export class WidgetChartEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { } 15 | 16 | ngOnDestroy(): void { 17 | this.widget.items = this.widget.items.filter((item) => item.key != ""); 18 | } 19 | 20 | addItem() { 21 | this.widget.items.push({ 22 | "color": "#389bee", 23 | "type": "line", 24 | "key": "", 25 | "name": "" 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-custom-edit/widget-custom-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 |
链接
3 |
4 | 5 |
6 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-custom-edit/widget-custom-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-debug-edit/widget-debug-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 |
显示内容
3 |
4 |
5 | 6 | 7 | 显示收发数据 8 |
9 |
10 | 11 | 12 | 显示接收数据 13 |
14 |
15 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-debug-edit/widget-debug-edit.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/device/layouter2/widget-editor2/widget-debug-edit/widget-debug-edit.component.scss -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-debug-edit/widget-debug-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-debug-edit', 5 | templateUrl: './widget-debug-edit.component.html', 6 | styleUrls: ['./widget-debug-edit.component.scss'], 7 | }) 8 | export class WidgetDebugEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { } 15 | 16 | choseBtnMode(e) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-icon-edit/widget-icon-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 |
图标
3 |
4 | 5 |
6 |
7 |
8 |
图标大小
9 |
10 | 11 |
12 |
13 |
14 |
图标颜色
15 |
16 | 17 |
18 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-icon-edit/widget-icon-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-icon-edit/widget-icon-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-icon-edit', 5 | templateUrl: './widget-icon-edit.component.html', 6 | styleUrls: ['./widget-icon-edit.component.scss'], 7 | }) 8 | export class WidgetIconEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-image-edit/widget-image-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 |
图片{{i}}
3 |
4 | 5 |
6 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-image-edit/widget-image-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-image-edit/widget-image-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-image-edit', 5 | templateUrl: './widget-image-edit.component.html', 6 | styleUrls: ['./widget-image-edit.component.scss'], 7 | }) 8 | export class WidgetImageEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-number-edit/widget-number-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-number-edit/widget-number-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { Layouter2Service } from '../../layouter2.service'; 3 | 4 | @Component({ 5 | selector: 'widget-number-edit', 6 | templateUrl: './widget-number-edit.component.html', 7 | styleUrls: ['./widget-number-edit.component.scss'], 8 | }) 9 | export class WidgetNumberEditComponent implements OnInit { 10 | 11 | @Input() widget; 12 | 13 | constructor( 14 | private layouterService: Layouter2Service 15 | ) { } 16 | 17 | ngOnInit() { } 18 | 19 | styleChange($event) { 20 | if ($event == 2 || $event == 3) { 21 | this.widget.rows = 2; 22 | this.widget.cols = 4; 23 | } else { 24 | this.widget.rows = 2; 25 | this.widget.cols = 2; 26 | } 27 | this.layouterService.changeWidget(this.widget) 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-select-edit/widget-select-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 | 选择设置 3 |
4 |
5 |
选项{{i+1}}
6 |
7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 | 添加选项 16 |
17 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-select-edit/widget-select-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; 2 | @import "../widget-chart-edit/widget-chart-edit.component.scss" 3 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-select-edit/widget-select-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-select-edit', 5 | templateUrl: './widget-select-edit.component.html', 6 | styleUrls: ['./widget-select-edit.component.scss'], 7 | }) 8 | export class WidgetSelectEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | value = 0; 13 | 14 | constructor() { } 15 | 16 | ngOnInit() { } 17 | 18 | ngOnDestroy(): void { 19 | this.widget.opts = this.widget.opts.filter((item) => item.value != ""); 20 | } 21 | 22 | addItem() { 23 | this.widget.opts.push({ 24 | "clr": "#389bee", 25 | "ico": "fa-regular fa-circle-" + (this.widget.opts.length + 1), 26 | "value": "", 27 | "name": "" 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-slider-edit/widget-slider-edit.component.html: -------------------------------------------------------------------------------- 1 |
2 | 滑动条设置 3 |
4 |
5 |
图标(ico)
6 |
7 | 8 |
9 |
10 |
11 |
颜色(clr)
12 |
13 | 14 |
15 |
16 |
17 |
最小值
18 |
19 | 20 |
21 |
22 |
23 |
最大值
24 |
25 | 26 |
27 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-slider-edit/widget-slider-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-slider-edit/widget-slider-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-slider-edit', 5 | templateUrl: './widget-slider-edit.component.html', 6 | styleUrls: ['./widget-slider-edit.component.scss'], 7 | }) 8 | export class WidgetSliderEditComponent implements OnInit { 9 | 10 | @Input() widget; 11 | 12 | constructor() { } 13 | 14 | ngOnInit() { } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-text-edit/widget-text-edit.component.scss: -------------------------------------------------------------------------------- 1 | @import "../widget-editor.scss"; 2 | 3 | .align-box { 4 | height: 90px; 5 | align-items: flex-start; 6 | margin-top: 6px; 7 | 8 | [item-name] { 9 | margin-top: 10px; 10 | } 11 | 12 | [input-box] { 13 | border: none 14 | } 15 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-video-edit/widget-video-edit.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/device/layouter2/widget-editor2/widget-video-edit/widget-video-edit.component.scss -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-editor2/widget-video-edit/widget-video-edit.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'widget-video-edit', 5 | templateUrl: './widget-video-edit.component.html', 6 | styleUrls: ['./widget-video-edit.component.scss'], 7 | }) 8 | export class WidgetVideoEditComponent implements OnInit { 9 | @Input() widget; 10 | 11 | constructor() { } 12 | 13 | ngOnInit() { } 14 | 15 | chosePlayMode(mode) { 16 | 17 | } 18 | 19 | choseStream(stream) { 20 | this.widget["str"] = stream; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widget-listbar/widget-listbar.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 | 8 |
9 |
{{button.name | translate}}
10 |
11 |
12 |
13 |
14 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widget-listbar/widget-listbar.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { IonicModule } from '@ionic/angular'; 4 | import { WidgetListbarComponent } from './widget-listbar.component'; 5 | import { TranslateModule } from '@ngx-translate/core'; 6 | 7 | 8 | @NgModule({ 9 | declarations: [ 10 | WidgetListbarComponent 11 | ], 12 | imports: [ 13 | CommonModule, 14 | IonicModule, 15 | TranslateModule.forChild() 16 | ], 17 | exports: [ 18 | WidgetListbarComponent 19 | ] 20 | }) 21 | export class WidgetListbarModule { } 22 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/parentDynamic.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, ElementRef, Input } from '@angular/core'; 2 | import { Layouter2Service } from '../layouter2.service'; 3 | 4 | @Component({ 5 | selector: 'widget-dynamic', 6 | templateUrl: './parentDynamic.component.html', 7 | styleUrls: ['parentDynamic.component.scss'] 8 | }) 9 | export class ParentDynamicComponent { 10 | @Input() 11 | widget; 12 | @Input() 13 | device; 14 | 15 | public get mode() { 16 | return this.layouterService.mode 17 | } 18 | 19 | get color() { 20 | return this.widget.clr 21 | } 22 | 23 | constructor( 24 | private layouterService: Layouter2Service, 25 | private el: ElementRef 26 | ) { } 27 | 28 | select() { 29 | this.layouterService.selectWidget(this.widget, this.el.nativeElement) 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-button/widget-button.html: -------------------------------------------------------------------------------- 1 |
3 |
{{widget.tit}}
4 |
5 |
6 | 7 |
8 |
9 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-button/widget-button.scss: -------------------------------------------------------------------------------- 1 | [widget] {} 2 | 3 | [widget-name] { 4 | &.on { 5 | color: #EEE; 6 | } 7 | } 8 | 9 | .widget-button { 10 | transition: all 0.1s; 11 | 12 | // 按下动画 13 | &:active { 14 | transform: scale(0.95); 15 | } 16 | } 17 | 18 | .icon-box { 19 | display: flex; 20 | justify-content: center; 21 | align-items: center; 22 | width: 100%; 23 | height: 100%; 24 | font-size: 26px; 25 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-color/widget-color.html: -------------------------------------------------------------------------------- 1 |
2 |
{{widget.tit}}
3 |
4 | 6 |
7 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-color/widget-color.scss: -------------------------------------------------------------------------------- 1 | 2 | [widget]{ 3 | 4 | } 5 | 6 | b-colorpicker-disc { 7 | height: 100%; 8 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-custom/widget-custom.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-custom/widget-custom.scss: -------------------------------------------------------------------------------- 1 | [widget] { 2 | display: flex; 3 | } 4 | 5 | iframe{ 6 | width: 100%; 7 | height: 100%; 8 | overflow: hidden; 9 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-debug/widget-debug.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Monitor 4 | 5 | 6 |
7 |
8 |
9 |
10 |
11 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-image/widget-image.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-image/widget-image.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/device/layouter2/widgets/widget-image/widget-image.scss -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-input/widget-input.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 7 |
8 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-joystick/widget-joystick.html: -------------------------------------------------------------------------------- 1 |
2 |
{{widget.tit}}
3 |
4 |
5 |
6 | 7 |
8 |
9 |
10 |
11 |
12 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-joystick/widget-joystick.scss: -------------------------------------------------------------------------------- 1 | .joystick-box { 2 | height: 100%; 3 | width: calc(100% - 20px); 4 | position: relative; 5 | } 6 | 7 | .joyout { 8 | position: absolute; 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | height: 100%; 13 | width: 100%; 14 | 15 | img { 16 | max-height: 100%; 17 | } 18 | } 19 | 20 | .stick { 21 | position: absolute; 22 | height: 70px; 23 | width: 70px; 24 | background: rgba(56, 156, 238, 0.8); 25 | border-radius: 50%; 26 | top: calc(50% - 35px); 27 | left: calc(50% - 35px); 28 | } 29 | 30 | .touch { 31 | position: relative; 32 | height: 100%; 33 | width: 100%; 34 | border-radius: 50%; 35 | z-index: 1; 36 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-map/widget-map.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | {{address}} 6 |
7 | 8 | 9 |
10 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-map/widget-map.component.scss: -------------------------------------------------------------------------------- 1 | [widget]{ 2 | overflow: hidden; 3 | } 4 | 5 | .mapbox { 6 | position: absolute; 7 | top: 0; 8 | width: 100%; 9 | height: calc(100% + 36px); 10 | } 11 | 12 | .bottom-box { 13 | position: absolute; 14 | bottom: 0; 15 | left: 0; 16 | width: 100%; 17 | height: 36px; 18 | background: rgba(255, 255, 255, 0.7); 19 | z-index: 999; 20 | display: flex; 21 | align-items: center; 22 | justify-content: space-between; 23 | padding-left: 10px; 24 | } 25 | 26 | .address { 27 | font-size: 12px; 28 | text-shadow: 1px 1px 1px #fff; 29 | } 30 | 31 | i { 32 | color: rgb(0, 76, 255); 33 | font-size: 22px; 34 | padding: 5px 10px; 35 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-number/widget-number.html: -------------------------------------------------------------------------------- 1 |
2 |
{{widget.tit}}
3 |
5 | 6 |
7 | 8 |
9 | 10 |
11 |
12 |
13 |
{{value}}
14 |
{{unit}}
15 |
16 | 19 |
20 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-select/widget-select.html: -------------------------------------------------------------------------------- 1 |
2 |
{{widget.tit}}
3 |
4 |
5 |
6 |
7 | 8 |
9 |
{{current.name}}
10 | 17 |
18 |
19 | 20 |
21 |
22 |
23 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-text/widget-text.html: -------------------------------------------------------------------------------- 1 |
2 |
{{widget.tit}}
3 |
4 |
5 | 6 |
7 |
8 |
9 | {{tex}} 10 |
11 |
12 |
13 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-text/widget-text.scss: -------------------------------------------------------------------------------- 1 | [widget] { 2 | } 3 | 4 | .icon-box { 5 | display: flex; 6 | align-items: center; 7 | justify-content: center; 8 | flex-shrink: 0; 9 | i{ 10 | font-size: 26px; 11 | } 12 | } 13 | 14 | .text-box { 15 | .text { 16 | font-size: 14px; 17 | white-space: nowrap; 18 | } 19 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-timer/widget-timer.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
{{t0}}
4 |
5 | -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-timer/widget-timer.scss: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 100%; 3 | height: 100%; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | font-size: 2.6rem; 8 | color: #959595; 9 | } 10 | 11 | .style1 { 12 | display: flex; 13 | justify-content: center; 14 | align-items: center; 15 | .content { 16 | display: flex; 17 | justify-content: flex-end; 18 | font-size: 12px; 19 | width: 50%; 20 | text-align: center; 21 | } 22 | } 23 | 24 | .hasTask { 25 | color: #389BEE; 26 | } -------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-video/widget-video.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
8 |
9 | 10 |
11 |
12 |
13 | 14 | 15 |
16 |
17 |
-------------------------------------------------------------------------------- /src/app/device/layouter2/widgets/widget-video/widget-video.scss: -------------------------------------------------------------------------------- 1 | .vidbox { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | .full { 8 | width: 100%; 9 | height: 100%; 10 | position: absolute; 11 | top: 0; 12 | left: 0; 13 | background-color: #fff; 14 | opacity: 1; 15 | transform: opacity 0.5s; 16 | display: flex; 17 | justify-content: center; 18 | align-items: center; 19 | 20 | .vbat { 21 | display: flex; 22 | justify-content: center; 23 | align-items: center; 24 | border-radius: 50%; 25 | color: #999; 26 | font-size: 50px; 27 | } 28 | } 29 | 30 | .showVideo { 31 | opacity: 0; 32 | } 33 | 34 | .lb { 35 | position: absolute; 36 | bottom: 15px; 37 | left: 15px; 38 | height: 25px; 39 | width: 25px; 40 | display: flex; 41 | justify-content: center; 42 | align-items: center; 43 | color: #CCC; 44 | font-size: 20px; 45 | } 46 | -------------------------------------------------------------------------------- /src/app/sections/about/about.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | 8 | import { AboutPage } from './about.page'; 9 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 10 | import { TranslateModule } from '@ngx-translate/core'; 11 | 12 | const routes: Routes = [ 13 | { 14 | path: 'about', 15 | component: AboutPage 16 | } 17 | ]; 18 | 19 | @NgModule({ 20 | imports: [ 21 | CommonModule, 22 | FormsModule, 23 | IonicModule, 24 | DirectivesModule, 25 | RouterModule.forChild(routes), 26 | TranslateModule.forChild() 27 | ], 28 | declarations: [AboutPage] 29 | }) 30 | export class AboutModule {} 31 | -------------------------------------------------------------------------------- /src/app/sections/about/about.page.scss: -------------------------------------------------------------------------------- 1 | .logo { 2 | height: 15vh; 3 | margin-top: 15px; 4 | margin-bottom: 15px; 5 | text-align: center; 6 | 7 | img { 8 | height: 40px; 9 | } 10 | } 11 | 12 | .text { 13 | padding: 15px; 14 | min-height: 50vh; 15 | text-indent: 2em; 16 | line-height: 1.7em; 17 | } 18 | 19 | .telephone { 20 | color: #fff; 21 | font-size: 18px; 22 | position: relative; 23 | margin-left: 15px; 24 | width: calc(100% - 30px); 25 | 26 | a { 27 | width: 100%; 28 | padding: 5px; 29 | color: #fff !important; 30 | text-decoration: none; 31 | } 32 | 33 | span { 34 | margin-left: 15px; 35 | } 36 | } 37 | 38 | .other { 39 | width:calc(100% - 30px); 40 | text-align: center; 41 | z-index: 1; 42 | position: absolute; 43 | bottom: 3rem; 44 | font-size: 13px; 45 | 46 | [text] { 47 | color: #009ee8; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/app/sections/account/account-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { 6 | path: '', 7 | children: [ 8 | { path: 'login', loadChildren: () => import('./login/login.module').then(m => m.LoginPageModule) }, 9 | { path: 'register', loadChildren: () => import('./register/register.module').then(m => m.RegisterPageModule) }, 10 | { path: 'retrieve', loadChildren: () => import('./retrieve/retrieve.module').then(m => m.RetrievePageModule) } 11 | ] 12 | } 13 | ]; 14 | 15 | @NgModule({ 16 | imports: [ 17 | RouterModule.forChild(routes) 18 | ], 19 | exports: [ 20 | RouterModule 21 | ] 22 | }) 23 | export class BlinkerAccountModule { } -------------------------------------------------------------------------------- /src/app/sections/account/first-modal/first-modal.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FirstModalComponent } from './first-modal.component'; 4 | 5 | 6 | 7 | @NgModule({ 8 | declarations: [FirstModalComponent], 9 | imports: [ 10 | CommonModule 11 | ], 12 | exports: [FirstModalComponent] 13 | }) 14 | export class FirstModalModule { } 15 | -------------------------------------------------------------------------------- /src/app/sections/account/retrieve/retrieve.scss: -------------------------------------------------------------------------------- 1 | @import "../account.scss"; 2 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/apconfig/components/ios-guide/ios-guide.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
{{deviceType}}_XXXXXXXXXXXX
5 |
6 |
请将手机WiFi连接到热点 {{deviceType}}_XXXXXXXXXXXX
7 |
然后返回本App
8 |
App将自动进行相关配置
9 |
前往设置
10 |
取 消
11 |
-------------------------------------------------------------------------------- /src/app/sections/adddevice/apconfig/config-state/config-state.scss: -------------------------------------------------------------------------------- 1 | @import "../../config-state.scss"; -------------------------------------------------------------------------------- /src/app/sections/adddevice/apconfig/readme.md: -------------------------------------------------------------------------------- 1 | # ApConfig配置流程 2 | ## ios 3 | 0.让设备进入AP配置状态 4 | 1.用户手动选择设备ap连接(不需要密码) 5 | 2.选择当前环境wifi,并输入密码; 6 | 3.用户手动连接设备ap 7 | 4.返回app,传输ssid和password; 8 | 5.等待注册结果 9 | 10 | ## android 11 | 0.让设备进入AP配置状态 12 | 1.用户输入ssid、password 13 | 2.app自动搜索"OwnLight_"开头的ssid,并连接传输ssid、password 14 | 3.等待注册结果 15 | 16 | ## android流程优化 17 | 0.长按5秒,红灯闪烁,让设备进入esptouch配置状态 18 | 1.用户输入ssid、password 19 | 2.进行esptouch 20 | 3-1.配置成功 21 | 3-2.配置失败,提示用户长按10秒,蓝灯闪烁,进入ApConfig 22 | 4.app自动搜索"OwnLight_"开头的ssid,并连接传输ssid、password 23 | 5.等待注册结果 24 | 25 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/bleconfig/bleconfig.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | BLE配网 7 | 8 | 9 | 10 |
当前账号没有权限使用该功能
11 |
-------------------------------------------------------------------------------- /src/app/sections/adddevice/bleconfig/bleconfig.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/sections/adddevice/bleconfig/bleconfig.component.scss -------------------------------------------------------------------------------- /src/app/sections/adddevice/bleconfig/bleconfig.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'blinker-bleconfig', 5 | templateUrl: './bleconfig.component.html', 6 | styleUrls: ['./bleconfig.component.scss'], 7 | }) 8 | export class BleconfigComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() {} 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/bleconfig/bleconfig.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | import { BleconfigComponent } from './bleconfig.component'; 8 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 9 | 10 | const routes: Routes = [ 11 | { 12 | path: '', 13 | component: BleconfigComponent 14 | } 15 | ]; 16 | 17 | @NgModule({ 18 | imports: [ 19 | CommonModule, 20 | FormsModule, 21 | IonicModule, 22 | DirectivesModule, 23 | RouterModule.forChild(routes) 24 | ], 25 | declarations: [BleconfigComponent] 26 | }) 27 | export class BleconfigModule {} 28 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/bwconfig/config-state/config-state.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
发现设备中
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 取消 15 |
16 |
17 | 18 | 19 |
20 | 21 |
22 |
配置失败,请重试
23 |
24 | 重试 25 |
26 |
27 |
-------------------------------------------------------------------------------- /src/app/sections/adddevice/bwconfig/config-state/config-state.component.scss: -------------------------------------------------------------------------------- 1 | @import "../../config-state.scss"; 2 | 3 | .translucent { 4 | margin-top: -50px; 5 | } -------------------------------------------------------------------------------- /src/app/sections/adddevice/bwconfig/config-state/config-state.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; 2 | import { NavController } from '@ionic/angular'; 3 | 4 | @Component({ 5 | selector: 'ble-scan-state', 6 | templateUrl: './config-state.component.html', 7 | styleUrls: ['./config-state.component.scss'], 8 | }) 9 | export class ConfigStateComponent implements OnInit { 10 | 11 | @Input() state = 0; 12 | @Output() retry = new EventEmitter 13 | 14 | constructor( 15 | private navCtrl: NavController 16 | ) { } 17 | 18 | ngOnInit() { } 19 | 20 | cancel() { 21 | this.navCtrl.back() 22 | } 23 | 24 | onRetry() { 25 | this.retry.emit() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/esptouch/config-state/config-state.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { IonicModule } from '@ionic/angular'; 5 | import { ConfigStatePage } from './config-state'; 6 | 7 | @NgModule({ 8 | imports: [ 9 | CommonModule, 10 | FormsModule, 11 | IonicModule 12 | ], 13 | declarations: [ConfigStatePage], 14 | exports: [ConfigStatePage] 15 | }) 16 | export class ConfigStatePageModule { } 17 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/mqttkey/mqttkey.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | import { MqttkeyPage } from './mqttkey'; 8 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 9 | 10 | 11 | const routes: Routes = [ 12 | { 13 | path: '', 14 | component: MqttkeyPage 15 | } 16 | ]; 17 | 18 | @NgModule({ 19 | imports: [ 20 | CommonModule, 21 | FormsModule, 22 | IonicModule, 23 | DirectivesModule, 24 | RouterModule.forChild(routes) 25 | ], 26 | declarations: [MqttkeyPage] 27 | }) 28 | export class MqttkeyPageModule {} 29 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/qrscanner/qrscanner.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | 8 | import { QrscannerPage } from './qrscanner.page'; 9 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 10 | 11 | const routes: Routes = [ 12 | { 13 | path: '', 14 | component: QrscannerPage 15 | } 16 | ]; 17 | 18 | @NgModule({ 19 | imports: [ 20 | CommonModule, 21 | FormsModule, 22 | IonicModule, 23 | DirectivesModule, 24 | RouterModule.forChild(routes) 25 | ], 26 | declarations: [QrscannerPage] 27 | }) 28 | export class QrscannerPageModule {} 29 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/qrscanner/qrscanner.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 二维码扫描器 7 | 8 | 9 | 10 |
11 |
-------------------------------------------------------------------------------- /src/app/sections/adddevice/qrscanner/qrscanner.page.scss: -------------------------------------------------------------------------------- 1 | .lightSwitch { 2 | position: relative; 3 | opacity: 1; 4 | color: red; 5 | } 6 | 7 | ion-content { 8 | --background: transparent !important; 9 | .black{ 10 | background: rgba(0, 0, 0, 1); 11 | width: 100vw; 12 | height: 100vh; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/sections/adddevice/qrscanner/readme.md: -------------------------------------------------------------------------------- 1 | # blinker二维码规则 2 | 3 | 进入配网向导 4 | 5 | ``` js 6 | { 7 | deviceType: "MpaaUXDXgUOG", 8 | configurator: ["esptouch", "KeyConfig"], 9 | vender: "", 10 | name: "设备1" 11 | } 12 | ``` 13 | 14 | 扫码注册 15 | 16 | ``` js 17 | { 18 | deviceType: "device2", 19 | configurator: ["qrscan"], 20 | vender: "", 21 | name: "设备2" 22 | } 23 | ``` 24 | 25 | 扫码注册 26 | 27 | ``` js 28 | { 29 | deviceType: "device2", 30 | configurator: ["qrscan"], 31 | vender: "", 32 | name: "设备2" 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /src/app/sections/devcenter/components/devtool/devtool.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 |
7 |
{{tool.name}}
8 |
{{tool.desp}}
9 |
10 |
11 | 12 |
13 |
14 |
-------------------------------------------------------------------------------- /src/app/sections/devcenter/components/devtool/devtool.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/sections/devcenter/components/devtool/devtool.component.scss -------------------------------------------------------------------------------- /src/app/sections/devcenter/components/prodevice/prodevice.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 |
7 |
{{prodevice.name}}
8 |
{{prodevice.deviceType}}
9 |
10 |
11 | 已激活:{{prodevice.quantity}} 12 |
13 |
14 |
15 | 16 | 17 | + 新建专属设备 -------------------------------------------------------------------------------- /src/app/sections/devcenter/components/prodevice/prodevice.component.scss: -------------------------------------------------------------------------------- 1 | b-item-list{ 2 | ::ng-deep{ 3 | .item-list-box{ 4 | padding-bottom: 130px; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editinfo/editinfo.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 专属设备详情 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editinfo/editinfo.page.scss: -------------------------------------------------------------------------------- 1 | .menubox { 2 | .item { 3 | display: flex; 4 | flex-direction: row; 5 | align-items: center; 6 | justify-content: flex-end; 7 | padding: 10px 20px 10px 20px; 8 | background-color: #fff; 9 | height: 8vh; 10 | margin-top: 3px; 11 | font-size: 15px; 12 | .name { 13 | position: absolute; 14 | left: 20px; 15 | } 16 | .num { 17 | display: flex; 18 | align-items: center; 19 | justify-content: center; 20 | color: #959595; 21 | margin-right: 10px; 22 | } 23 | .arrow { 24 | display: flex; 25 | align-items: center; 26 | justify-content: center; 27 | font-size: 21px; 28 | color: #959595; 29 | img { 30 | height: 2.5vh; 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editinfo/editinfo.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { DevcenterService } from '../../devcenter.service'; 3 | import { ActivatedRoute } from '@angular/router'; 4 | import { AlertController, NavController } from '@ionic/angular'; 5 | 6 | @Component({ 7 | selector: 'prodevice-editinfo', 8 | templateUrl: './editinfo.page.html', 9 | styleUrls: ['./editinfo.page.scss'], 10 | }) 11 | export class EditinfoPage { 12 | 13 | constructor( 14 | private navCtrl: NavController 15 | ) { } 16 | 17 | confirm() { 18 | this.navCtrl.pop() 19 | } 20 | 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editlayouter/editlayouter.page.scss: -------------------------------------------------------------------------------- 1 | ion-header.dark { 2 | ion-toolbar { 3 | ion-title { 4 | color: #fff; 5 | } 6 | ion-back-button { 7 | --color: #fff; 8 | } 9 | ion-icon { 10 | color: #FFF; 11 | } 12 | i { 13 | color: #FFF; 14 | } 15 | } 16 | } 17 | 18 | 19 | ion-buttons { 20 | ion-button { 21 | width: 2.2rem; 22 | i { 23 | font-size: 1.4rem; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editlayouter/ieconfig/ieconfig.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | 8 | import { IeconfigPage } from './ieconfig.page'; 9 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 10 | 11 | const routes: Routes = [ 12 | { 13 | path: '', 14 | component: IeconfigPage 15 | } 16 | ]; 17 | 18 | @NgModule({ 19 | imports: [ 20 | CommonModule, 21 | FormsModule, 22 | IonicModule, 23 | RouterModule.forChild(routes), 24 | DirectivesModule, 25 | ], 26 | declarations: [IeconfigPage] 27 | }) 28 | export class IeconfigPageModule {} 29 | -------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editlayouter/ieconfig/ieconfig.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 导入导出配置 7 | 8 | 9 | 10 | 11 | 12 |
13 |
导入配置
14 |
导出配置
15 |
16 |
-------------------------------------------------------------------------------- /src/app/sections/devcenter/pages/editlayouter/ieconfig/ieconfig.page.scss: -------------------------------------------------------------------------------- 1 | .configzone { 2 | width: 100%; 3 | height: 70%; 4 | } 5 | 6 | .btnbox { 7 | display: flex; 8 | justify-content: space-between; 9 | margin-top: 3vh; 10 | .btn40 { 11 | width: 45%; 12 | } 13 | } -------------------------------------------------------------------------------- /src/app/sections/device/device-log/device-log.component.scss: -------------------------------------------------------------------------------- 1 | .log-box { 2 | padding: 5px 15px; 3 | 4 | .header { 5 | font-weight: bold; 6 | 7 | >div { 8 | text-align: center; 9 | } 10 | } 11 | 12 | .line { 13 | display: flex; 14 | position: relative; 15 | margin-top: 5px; 16 | 17 | >div { 18 | font-size: 12px; 19 | 20 | &:first-child { 21 | color: #666; 22 | width: 35%; 23 | } 24 | 25 | &:nth-child(2) { 26 | color: #3171e0; 27 | // margin-left: 5px; 28 | width: 15%; 29 | } 30 | 31 | &:last-child { 32 | color: #333; 33 | margin-left: 5px; 34 | width: 52%; 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/app/sections/device/device-manager/device-manager.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/sections/device/device-manager/device-manager.scss -------------------------------------------------------------------------------- /src/app/sections/device/device-manager/device-manager.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { DataService } from 'src/app/core/services/data.service'; 3 | 4 | 5 | @Component({ 6 | selector: 'page-device-manager', 7 | templateUrl: 'device-manager.html', 8 | styleUrls: ['device-manager.scss'] 9 | }) 10 | export class DeviceManagerPage { 11 | 12 | loaded = false; 13 | 14 | get deviceDataList() { 15 | return this.dataService.device.list 16 | } 17 | 18 | get deviceDataDict() { 19 | return this.dataService.device.dict 20 | } 21 | 22 | constructor( 23 | private dataService: DataService, 24 | ) { } 25 | 26 | 27 | ngOnInit(): void { 28 | this.dataService.userDataLoader.subscribe(loaded => { 29 | if (loaded) this.loaded = loaded 30 | }) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/app/sections/device/device-share/device-share.scss: -------------------------------------------------------------------------------- 1 | // .btn { 2 | // display: flex; 3 | // align-items: center; 4 | // justify-content: center; 5 | // position: absolute; 6 | // right: 0; 7 | // height: 60px; 8 | // padding-right: 20px; 9 | // font-size: 13px; 10 | // color: #389bee; 11 | // } 12 | 13 | .noshared { 14 | color: #8e8e8e; 15 | padding-top: 20px; 16 | font-size: 14px; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/sections/device/device-storage/device-storage.page.scss: -------------------------------------------------------------------------------- 1 | .top-box { 2 | font-size: 12px; 3 | } -------------------------------------------------------------------------------- /src/app/sections/device/device-timer/device-timer.page.scss: -------------------------------------------------------------------------------- 1 | b-item-list { 2 | ::ng-deep { 3 | .text-box { 4 | .name { 5 | font-size: 20px !important; 6 | } 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/app/sections/device/device-timer/readme.md: -------------------------------------------------------------------------------- 1 | # 定时任务 2 | 3 | ## 数据库设计 4 | ```json 5 | { 6 | "id":"uuid", 7 | "deviceId":"XXXXXXXXXXXXXXXX", 8 | "userId":"", 9 | "enable": 1, 10 | "rule": "*/1 * * * *", 11 | "action": [], 12 | "lastDate":"", 13 | "nextDate":"", 14 | "createdDate":"", 15 | "type":"0 定时/1 倒计时" 16 | } 17 | ``` 18 | 19 | ## 执行逻辑 20 | 1. 每分钟查询一次nextDate在未来1分钟的要执行的任务 21 | 2. 将查出的任务放进任务队列 22 | 3. 发送任务队列中动作到指定设备 23 | 4. 创建写入数据库任务,到写数据库队列 24 | 5. 写入数据库,更新lastDate, nextDate 25 | 26 | ## 接口 27 | ### 获取任务 28 | GET //task 29 | 30 | ### 添加任务/修改任务 31 | POST //task 32 | 33 | ### 删除任务 34 | DELETE //task 35 | -------------------------------------------------------------------------------- /src/app/sections/device/device-timer/timer.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { DeviceService } from 'src/app/core/services/device.service'; 3 | import { NoticeService } from 'src/app/core/services/notice.service'; 4 | 5 | @Injectable() 6 | export class TimerService { 7 | 8 | currentDevice; 9 | 10 | // currentCmdList; 11 | // currentCmdByText; 12 | // currentCmdByAct; 13 | 14 | constructor( 15 | private deviceService: DeviceService, 16 | private notice: NoticeService, 17 | ) { } 18 | 19 | loadTask(device) { 20 | this.notice.showLoading('loadingTiming') 21 | window.setTimeout(() => { 22 | this.notice.hideLoading() 23 | }, 1000); 24 | this.deviceService.sendData(device, `{"get":"timing"}`) 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/app/sections/device/device-timer/timing-edit/timing-edit.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/app/sections/device/device-timer/timing-edit/timing-edit.scss -------------------------------------------------------------------------------- /src/app/sections/feedback/feedback.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | import { IonicModule } from '@ionic/angular'; 6 | import { FeedbackPage } from './feedback.component'; 7 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 8 | import { TranslateModule } from '@ngx-translate/core'; 9 | 10 | const routes: Routes = [ 11 | { 12 | path: 'feedback', 13 | component: FeedbackPage 14 | } 15 | ]; 16 | 17 | @NgModule({ 18 | imports: [ 19 | CommonModule, 20 | FormsModule, 21 | IonicModule, 22 | DirectivesModule, 23 | RouterModule.forChild(routes), 24 | TranslateModule.forChild() 25 | ], 26 | declarations: [FeedbackPage] 27 | }) 28 | export class BlinkerFeedbackModule { } 29 | -------------------------------------------------------------------------------- /src/app/sections/message/message.model.ts: -------------------------------------------------------------------------------- 1 | export interface MessageItem { 2 | //显示出来的内容 3 | "title": string, 4 | "summary"?: string, 5 | "content": string 6 | "icon": string, 7 | "date": number, 8 | "isRead": string 9 | //不直接显示的内容 10 | "type": MessageType, 11 | "id": string, 12 | "url": string, 13 | } 14 | 15 | export enum MessageType { 16 | News = 'news',//打开一个url 17 | System = 'system',//打开一个app页面 18 | Device = 'device',//打开设备页面 19 | User = 'user',//打开用户分享页面 20 | } -------------------------------------------------------------------------------- /src/app/sections/message/message.page.scss: -------------------------------------------------------------------------------- 1 | .nomess { 2 | color: #8e8e8e; 3 | padding-top: 30vh; 4 | font-size: 13px; 5 | 6 | img { 7 | width: 40vw; 8 | } 9 | } 10 | 11 | .img-box { 12 | img { 13 | border-radius: 50%; 14 | border: 1px solid #ccc; 15 | } 16 | } 17 | 18 | .other { 19 | overflow: hidden; 20 | white-space: nowrap; 21 | text-overflow: ellipsis; 22 | width: 60vw; 23 | } 24 | 25 | .date { 26 | position: absolute; 27 | right: 10px; 28 | color: #999999; 29 | font-size: 12px; 30 | } 31 | -------------------------------------------------------------------------------- /src/app/sections/message/readme.md: -------------------------------------------------------------------------------- 1 | # 消息盒子模块 2 | 所有消息都存放在统一数据库中, 3 | 每条有唯一的id, 4 | 用户messagebox里只存储id, 5 | 删除消息时,只删除用户 6 | 7 | ## 消息示例 8 | ```json 9 | { 10 | "id":"", 11 | "type":"news/system/device/user", 12 | "source":"设备ID,或者用户ID", 13 | "title":"", 14 | "summary":"", 15 | "date":222222, 16 | "icon":"", 17 | "url":"", 18 | } 19 | ``` 20 | 21 | ### 消息类型 22 | **news:**由管理后台发布的信息,如新闻、公告一类的信息 23 | **system:**由系统的发起的信息,没想好有啥 24 | **device:**由设备发起的信息,如推送通知 25 | **user:**由其他用户发起的信息,如设备分享 26 | 27 | ### URL 28 | 如果url带有**https://**则打开文档加载组件,加载这个地址里的文档; 29 | 如果不带,说明是一个应用内地址,如"share-manager" 30 | 31 | ## 消息限制 32 | 容量 100条, 33 | 存储时间 1年, 34 | 每页 10条, 35 | 36 | ## 删除消息 37 | 删除一条消息 38 | ``` 39 | DELETE /user/message/:id 40 | ``` 41 | 删除所有消息 42 | ``` 43 | DELETE /user/message/all 44 | ``` 45 | -------------------------------------------------------------------------------- /src/app/sections/room/room-edit/room-edit.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | 5 | import { IonicModule } from '@ionic/angular'; 6 | 7 | import { RoomEditPage } from './room-edit'; 8 | import { ComponentsModule } from 'src/app/core/components/components.module'; 9 | import { DirectivesModule } from 'src/app/core/directives/directives.module'; 10 | 11 | const routes: Routes = [ 12 | { path: '', component: RoomEditPage } 13 | ]; 14 | 15 | @NgModule({ 16 | imports: [ 17 | CommonModule, 18 | IonicModule, 19 | ComponentsModule, 20 | DirectivesModule, 21 | RouterModule.forChild(routes) 22 | ], 23 | declarations: [RoomEditPage] 24 | }) 25 | export class RoomEditPageModule { } 26 | -------------------------------------------------------------------------------- /src/app/sections/room/room-edit/room-edit.scss: -------------------------------------------------------------------------------- 1 | .roomname { 2 | width: 100%; 3 | text-align: center; 4 | font-weight: 600; 5 | color: #389bee; 6 | } 7 | 8 | .title { 9 | padding-left: 15px; 10 | color: #959595; 11 | } 12 | 13 | // b-item-list { 14 | // ::ng-deep { 15 | // .item-box { 16 | // padding-bottom: 10px; 17 | // } 18 | // } 19 | // } -------------------------------------------------------------------------------- /src/app/sections/room/room-manager-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { 6 | path: 'room-manager', 7 | children: [ 8 | { path: '', loadChildren: () => import('./room-manager/room-manager.module').then(m => m.RoomManagerPageModule) }, 9 | { path: ':room', loadChildren: () => import('./room-edit/room-edit.module').then(m => m.RoomEditPageModule) }, 10 | ] 11 | } 12 | ]; 13 | 14 | @NgModule({ 15 | imports: [ 16 | RouterModule.forChild(routes) 17 | ], 18 | exports: [ 19 | RouterModule 20 | ] 21 | }) 22 | export class BlinkerRoomManagerModule { } -------------------------------------------------------------------------------- /src/app/sections/speech/speech-button/speech-button.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/app/sections/speech/speech-button/speech-button.scss: -------------------------------------------------------------------------------- 1 | .speech-button { 2 | background: linear-gradient(#29c2f7, #389bee); 3 | margin: 0; 4 | width: 45px; 5 | height: 45px; 6 | border-radius: 50%; 7 | font-size: 25px; 8 | font-weight: 200; 9 | padding: 0; 10 | color: #fff; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/view/home/components/deviceblock-list/deviceblock-list.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 |
7 |
8 |
-------------------------------------------------------------------------------- /src/app/view/home/components/deviceblock-zone/deviceblock-zone.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
    6 |
  • 7 | 9 |
  • 10 |
  • 11 | 13 | 14 |
  • 15 |
16 |
17 |
18 |
-------------------------------------------------------------------------------- /src/app/view/home/components/deviceblock-zone/deviceblock-zone.scss: -------------------------------------------------------------------------------- 1 | @import '@splidejs/splide/css'; 2 | 3 | .slidesbox { 4 | width: 100vw; 5 | height: 100%; 6 | position: relative; 7 | } 8 | 9 | .splide { 10 | height: 100%; 11 | 12 | .splide__track { 13 | height: 100%; 14 | 15 | .splide__list { 16 | height: 100%; 17 | 18 | .splide__slide { 19 | height: 100%; 20 | } 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/app/view/home/components/room-list/room-list.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 |
所有设备
8 |
{{room}}
9 |
10 |
11 |
-------------------------------------------------------------------------------- /src/app/view/view.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | import { IonicModule } from '@ionic/angular'; 6 | import { BlinkerView } from './view.page'; 7 | import { MenuModule } from './menu/menu.module'; 8 | 9 | const routes: Routes = [ 10 | { 11 | path: 'view', 12 | component: BlinkerView, 13 | children: [ 14 | { path: 'home', loadChildren: () => import('./home/view-home.module').then(m => m.ViewHomePageModule) }, 15 | ] 16 | } 17 | ]; 18 | 19 | @NgModule({ 20 | imports: [ 21 | CommonModule, 22 | FormsModule, 23 | IonicModule, 24 | MenuModule, 25 | RouterModule.forChild(routes) 26 | ], 27 | declarations: [BlinkerView] 28 | }) 29 | export class BlinkerViewModule { } 30 | -------------------------------------------------------------------------------- /src/app/view/view.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/app/view/view.page.scss: -------------------------------------------------------------------------------- 1 | view-home { 2 | width: 100vw; 3 | height: 100vh; 4 | } 5 | 6 | view-map { 7 | width: 100vw; 8 | height: 100vh; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/view/view.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ViewService } from '../core/services/view.service'; 3 | 4 | @Component({ 5 | selector: 'blinker-view', 6 | templateUrl: './view.page.html', 7 | styleUrls: ['./view.page.scss'], 8 | }) 9 | export class BlinkerView implements OnInit { 10 | 11 | get menuSwipeEnable() { 12 | return this.viewService.menuSwipeEnable; 13 | } 14 | 15 | constructor( 16 | private viewService: ViewService, 17 | ) { } 18 | 19 | ngOnInit() { 20 | } 21 | 22 | menuDidOpen() { 23 | this.viewService.enableMenuSwipe(); 24 | } 25 | 26 | menuDidClose() { 27 | this.viewService.disableMenuSwipe(); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/assets/aac/Click.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Click.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Begin.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Begin.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Boot.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Boot.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_CannotControl.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_CannotControl.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_ChoseDevice.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_ChoseDevice.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Closed1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Closed1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Closed2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Closed2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Closing1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Closing1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Closing2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Closing2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_DevMode.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_DevMode.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_DeviceClosed.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_DeviceClosed.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_DeviceOpened.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_DeviceOpened.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Doing.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Doing.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Done.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Done.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_End.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_End.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Error1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Error1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Error2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Error2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Error3.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Error3.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Get1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Get1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Get2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Get2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Get3.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Get3.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Get4.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Get4.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Help.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Help.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_NetError.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_NetError.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_NotFound1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_NotFound1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_NotFound2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_NotFound2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Opened1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Opened1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Opened2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Opened2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Opening1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Opening1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Opening2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Opening2.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Unsupport.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Unsupport.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Wait1.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Wait1.aac -------------------------------------------------------------------------------- /src/assets/aac/Speech_Wait2.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Speech_Wait2.aac -------------------------------------------------------------------------------- /src/assets/aac/Switch_Off.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Switch_Off.aac -------------------------------------------------------------------------------- /src/assets/aac/Switch_On.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Switch_On.aac -------------------------------------------------------------------------------- /src/assets/aac/Warning_Higest.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Warning_Higest.aac -------------------------------------------------------------------------------- /src/assets/aac/Warning_High.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Warning_High.aac -------------------------------------------------------------------------------- /src/assets/aac/Warning_Low.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Warning_Low.aac -------------------------------------------------------------------------------- /src/assets/aac/Warning_Mid.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/aac/Warning_Mid.aac -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/light.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-classic: 'Font Awesome 6 Pro'; 8 | --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Pro'; 12 | font-style: normal; 13 | font-weight: 300; 14 | font-display: block; 15 | src: url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.ttf") format("truetype"); } 16 | 17 | .fal, 18 | .fa-light { 19 | font-weight: 300; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/light.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}.fa-light,.fal{font-weight:300} -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-classic: 'Font Awesome 6 Pro'; 8 | --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Pro'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Pro'; 12 | font-style: normal; 13 | font-weight: 400; 14 | font-display: block; 15 | src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } 16 | 17 | .far, 18 | .fa-regular { 19 | font-weight: 400; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400} -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/sharp-regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-sharp: 'Font Awesome 6 Sharp'; 8 | --fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Sharp'; 12 | font-style: normal; 13 | font-weight: 400; 14 | font-display: block; 15 | src: url("../webfonts/fa-sharp-regular-400.woff2") format("woff2"), url("../webfonts/fa-sharp-regular-400.ttf") format("truetype"); } 16 | 17 | .fasr, 18 | .fa-regular { 19 | font-weight: 400; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/sharp-regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-sharp-regular-400.woff2) format("woff2"),url(../webfonts/fa-sharp-regular-400.ttf) format("truetype")}.fa-regular,.fasr{font-weight:400} -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/sharp-solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-sharp: 'Font Awesome 6 Sharp'; 8 | --fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Sharp'; 12 | font-style: normal; 13 | font-weight: 900; 14 | font-display: block; 15 | src: url("../webfonts/fa-sharp-solid-900.woff2") format("woff2"), url("../webfonts/fa-sharp-solid-900.ttf") format("truetype"); } 16 | 17 | .fass, 18 | .fa-solid { 19 | font-weight: 900; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/sharp-solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-sharp-solid-900.woff2) format("woff2"),url(../webfonts/fa-sharp-solid-900.ttf) format("truetype")}.fa-solid,.fass{font-weight:900} -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-classic: 'Font Awesome 6 Pro'; 8 | --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Pro'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Pro'; 12 | font-style: normal; 13 | font-weight: 900; 14 | font-display: block; 15 | src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } 16 | 17 | .fas, 18 | .fa-solid { 19 | font-weight: 900; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/thin.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :root, :host { 7 | --fa-style-family-classic: 'Font Awesome 6 Pro'; 8 | --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; } 9 | 10 | @font-face { 11 | font-family: 'Font Awesome 6 Pro'; 12 | font-style: normal; 13 | font-weight: 100; 14 | font-display: block; 15 | src: url("../webfonts/fa-thin-100.woff2") format("woff2"), url("../webfonts/fa-thin-100.ttf") format("truetype"); } 16 | 17 | .fat, 18 | .fa-thin { 19 | font-weight: 100; } 20 | -------------------------------------------------------------------------------- /src/assets/fontawesome6/css/thin.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Pro 6.3.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license (Commercial License) 4 | * Copyright 2023 Fonticons, Inc. 5 | */ 6 | :host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:100;font-display:block;src:url(../webfonts/fa-thin-100.woff2) format("woff2"),url(../webfonts/fa-thin-100.ttf) format("truetype")}.fa-thin,.fat{font-weight:100} -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-duotone-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-duotone-900.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-duotone-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-duotone-900.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-light-300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-light-300.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-light-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-light-300.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-sharp-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-sharp-regular-400.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-sharp-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-sharp-regular-400.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-sharp-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-sharp-solid-900.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-sharp-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-sharp-solid-900.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-thin-100.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-thin-100.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-thin-100.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-thin-100.woff2 -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-v4compatibility.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-v4compatibility.ttf -------------------------------------------------------------------------------- /src/assets/fontawesome6/webfonts/fa-v4compatibility.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fontawesome6/webfonts/fa-v4compatibility.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/MiSans-Demibold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fonts/MiSans-Demibold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/MiSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/fonts/MiSans-Regular.woff2 -------------------------------------------------------------------------------- /src/assets/icons/icon-128.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-128.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-128x128.png -------------------------------------------------------------------------------- /src/assets/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-144x144.png -------------------------------------------------------------------------------- /src/assets/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-152x152.png -------------------------------------------------------------------------------- /src/assets/icons/icon-192.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-192.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-192x192.png -------------------------------------------------------------------------------- /src/assets/icons/icon-256.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-256.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-384x384.png -------------------------------------------------------------------------------- /src/assets/icons/icon-48.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-48.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-512.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-512.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-512x512.png -------------------------------------------------------------------------------- /src/assets/icons/icon-72.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-72.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-72x72.png -------------------------------------------------------------------------------- /src/assets/icons/icon-96.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-96.webp -------------------------------------------------------------------------------- /src/assets/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/icons/icon-96x96.png -------------------------------------------------------------------------------- /src/assets/img/apconfig-ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/apconfig-ios.png -------------------------------------------------------------------------------- /src/assets/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/avatar.png -------------------------------------------------------------------------------- /src/assets/img/bg/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/1.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/2.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/3.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/4.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/5.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/f1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/f1.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/f2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/f2.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/f3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/f3.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/f4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/f4.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/f5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/f5.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/test.png -------------------------------------------------------------------------------- /src/assets/img/bg/test2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/test2.png -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/0.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/1.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/2.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/3.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/4.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/5.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/99.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/99.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/f1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/f1.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/f2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/f2.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/f3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/f3.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/f4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/f4.jpg -------------------------------------------------------------------------------- /src/assets/img/bg/thumbnail/f5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/bg/thumbnail/f5.jpg -------------------------------------------------------------------------------- /src/assets/img/blinker-icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/blinker-icon.jpg -------------------------------------------------------------------------------- /src/assets/img/blinker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/blinker-icon.png -------------------------------------------------------------------------------- /src/assets/img/blinker-logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/blinker-logo-white.png -------------------------------------------------------------------------------- /src/assets/img/blue-led.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/blue-led.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/airconditioner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/airconditioner.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/aligenie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/aligenie.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/arduino-mega.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/arduino-mega.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/arduino-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/arduino-red.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/baiduspeaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/baiduspeaker.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/birdcage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/birdcage.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/cat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/cat.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/catfood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/catfood.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/cathouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/cathouse.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/diyarduino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/diyarduino.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/diylinux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/diylinux.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/dog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/dog.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/dogfood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/dogfood.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/doghouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/doghouse.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/esp32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/esp32.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/fan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/fan.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/fishtank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/fishtank.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/heater.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/heater.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/humidifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/humidifier.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/hygrothermograph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/hygrothermograph.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/linux-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/linux-logo.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/openjumperfeeder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/openjumperfeeder.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownairdetector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownairdetector.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownbulb.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownledstrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownledstrip.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownlight.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownlight2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownlight2.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownlight3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownlight3.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownlight4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownlight4.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/ownplug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/ownplug.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/plant1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/plant1.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/plant2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/plant2.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/plant3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/plant3.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/raspberrypi-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/raspberrypi-blue.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/raspberrypi-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/raspberrypi-logo.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/raspberrypi-pico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/raspberrypi-pico.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/raspberrypi-zero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/raspberrypi-zero.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/station.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/station.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/unknown.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/warninglight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/warninglight.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/wifiduino-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/wifiduino-blue.png -------------------------------------------------------------------------------- /src/assets/img/devices/icon/wifiduino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/icon/wifiduino.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/auto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/auto.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/bg.jpg -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/bg.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/blink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/blink.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/breath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/breath.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/colorpicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/colorpicker.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/cool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/cool.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/gradient.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/solid.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/speed-f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/speed-f.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/speed-h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/speed-h.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/stream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/stream.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/sun-f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/sun-f.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/sun-h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/sun-h.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/sun.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/timing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/timing.png -------------------------------------------------------------------------------- /src/assets/img/devices/ownlight/warm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/devices/ownlight/warm.png -------------------------------------------------------------------------------- /src/assets/img/diandeng-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/diandeng-logo.png -------------------------------------------------------------------------------- /src/assets/img/headerbg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/headerbg.jpg -------------------------------------------------------------------------------- /src/assets/img/icon/apconfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/apconfig.png -------------------------------------------------------------------------------- /src/assets/img/icon/arrow-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Line Copy 5 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/img/icon/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/arrow.png -------------------------------------------------------------------------------- /src/assets/img/icon/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Line Copy 10 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/img/icon/ble-w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/ble-w.png -------------------------------------------------------------------------------- /src/assets/img/icon/ble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/ble.png -------------------------------------------------------------------------------- /src/assets/img/icon/esp-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/esp-logo.png -------------------------------------------------------------------------------- /src/assets/img/icon/leaf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/leaf.png -------------------------------------------------------------------------------- /src/assets/img/icon/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/link.png -------------------------------------------------------------------------------- /src/assets/img/icon/room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/room.png -------------------------------------------------------------------------------- /src/assets/img/icon/thermometer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/thermometer.png -------------------------------------------------------------------------------- /src/assets/img/icon/tint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/tint.png -------------------------------------------------------------------------------- /src/assets/img/icon/tool-bleconfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/tool-bleconfig.png -------------------------------------------------------------------------------- /src/assets/img/icon/tool-qrscanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/tool-qrscanner.png -------------------------------------------------------------------------------- /src/assets/img/icon/update-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/update-blue.png -------------------------------------------------------------------------------- /src/assets/img/icon/update-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/update-done.png -------------------------------------------------------------------------------- /src/assets/img/icon/update-fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/update-fail.png -------------------------------------------------------------------------------- /src/assets/img/icon/update-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/update-gray.png -------------------------------------------------------------------------------- /src/assets/img/icon/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/warning.png -------------------------------------------------------------------------------- /src/assets/img/icon/wifi-w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/wifi-w.png -------------------------------------------------------------------------------- /src/assets/img/icon/wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/icon/wifi.png -------------------------------------------------------------------------------- /src/assets/img/language/chinese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/language/chinese.jpg -------------------------------------------------------------------------------- /src/assets/img/language/english.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/language/english.jpg -------------------------------------------------------------------------------- /src/assets/img/layouter/btn-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/btn-bg.png -------------------------------------------------------------------------------- /src/assets/img/layouter/colorpicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/colorpicker.png -------------------------------------------------------------------------------- /src/assets/img/layouter/colorpicker2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/colorpicker2.png -------------------------------------------------------------------------------- /src/assets/img/layouter/joyin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/joyin.png -------------------------------------------------------------------------------- /src/assets/img/layouter/joyout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/joyout.png -------------------------------------------------------------------------------- /src/assets/img/layouter/joystick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/layouter/joystick.png -------------------------------------------------------------------------------- /src/assets/img/login-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/login-logo.png -------------------------------------------------------------------------------- /src/assets/img/map/device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/device.png -------------------------------------------------------------------------------- /src/assets/img/map/map-device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/map-device.png -------------------------------------------------------------------------------- /src/assets/img/map/map-marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/map-marker.png -------------------------------------------------------------------------------- /src/assets/img/map/map-me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/map-me.png -------------------------------------------------------------------------------- /src/assets/img/map/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/marker.png -------------------------------------------------------------------------------- /src/assets/img/map/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/map/user.png -------------------------------------------------------------------------------- /src/assets/img/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/new.png -------------------------------------------------------------------------------- /src/assets/img/red-led.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/red-led.png -------------------------------------------------------------------------------- /src/assets/img/scanner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/scanner.png -------------------------------------------------------------------------------- /src/assets/img/url-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/url-error.png -------------------------------------------------------------------------------- /src/assets/img/widget-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/img/widget-img.png -------------------------------------------------------------------------------- /src/assets/ownfonts/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/ownfonts/iconfont.eot -------------------------------------------------------------------------------- /src/assets/ownfonts/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/ownfonts/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/ownfonts/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/ownfonts/iconfont.woff -------------------------------------------------------------------------------- /src/assets/ownfonts/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinker-iot/blinker-app/57224fea35083a8bc2af45aae8443b7606197f69/src/assets/ownfonts/iconfont.woff2 -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/plugins/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | // First, initialize the Angular testing environment. 11 | getTestBed().initTestEnvironment( 12 | BrowserDynamicTestingModule, 13 | platformBrowserDynamicTesting(), 14 | ); 15 | -------------------------------------------------------------------------------- /src/zone-flags.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Prevents Angular change detection from 3 | * running with certain Web Component callbacks 4 | */ 5 | // eslint-disable-next-line no-underscore-dangle 6 | (window as any).__Zone_disable_customElements = true; 7 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | --------------------------------------------------------------------------------