homie-service

module
v0.0.0-...-12a24cc Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 17, 2021 License: MIT

README

homie-service

works with MQTT Homie

Rewrite of HomieMonitor in Golang.

Application implements the Homie Controller, or Monitor, supporting development of IOT/Devices using Homie-esp8266; although any Homie Device specification should be supported.

References:

Status

  • Fyne.io GUI 75% complete
  • go-kit/kit Restful JSON API (with swagger docs) 95% complete
  • Support Mutliple Homie Networks (auto discovery); /homie/#, /custom/#, ...
  • MQTT Unsecured connection.
  • Produce MQTT messages decoded to internal Device Model.
  • Produce MQTT messages from MQTT logfile for Demo use.
  • bBolt DB data storage for decoded device messages, and ota schedules
  • CoreLogic
    • decode and transform data into Homie's Broadcast, Device, Node, Property, and Attribute collections.
    • encode firmware information into the Firmware OTA Scheduling Service
    • implement firmware schedule
    • implement data retention on change service
  • Create Web UI with WedSocket Driven Components (TBD)
  • Enable SSL/TLS Connection to MQTT (TBD)
  • Enabled OTA Scheduling
Project Tree
<homie-service>.
├── LICENSE
├── Makefile
├── README.md
├── bin
├── cmd
│   ├── api
│   │   └── main.go
│   ├── base
│   │   └── main.go
│   └── gui
│       ├── main.go
│       └── svgImages.go
├── config
│   ├── demo-config.yml
│   ├── mqtt-config.yml
│   └── test-config.yml
├── dataDB
│   ├── dataDir
│   │   └── storage.db
│   ├── demoData
│   │   └── mosquitto.log
│   ├── firmwares
│   │   ├── Environment-DS18B20.bin
│   │   ├── Monitor-DHT-RCWL-Metrics-200.bin
│   │   └── Monitor-SHT31-RCWL-Metrics-200.bin
│   └── testData
│       ├── mosquitto_test.log
│       └── storage_test.db
├── demo-runtime.log
├── mqtt-runtime.log
├── devNotes
│   └── dev-notes.md
├── go.mod
├── go.sum
├── pkg
│   ├── UIAdapters
│   │   ├── api
│   │   │   ├── docs
│   │   │   │   └── docs.go
│   │   │   └── handlers
│   │   │       ├── broadcasts.go
│   │   │       ├── controller.go
│   │   │       ├── files.go
│   │   │       ├── firmwares.go
│   │   │       ├── middlewares.go
│   │   │       ├── networks.go
│   │   │       ├── schedules.go
│   │   │       └── validation.go
│   │   └── gui
│   │       ├── components
│   │       │   ├── cards.go
│   │       │   ├── forms.go
│   │       │   ├── homieTheme.go
│   │       │   ├── lists.go
│   │       │   ├── tables.go
│   │       │   ├── trees.go
│   │       │   └── utils.go
│   │       ├── providers
│   │       │   └── provider.go
│   │       └── views
│   │           ├── firmwares.go
│   │           ├── home.go
│   │           ├── mainPage.go
│   │           ├── networks.go
│   │           ├── schedules.go
│   │           ├── sites.go
│   │           └── views.go
│   ├── demoProvider
│   │   ├── demoProvider_suite_test.go
│   │   ├── demo_test.go
│   │   ├── mqttMock.go
│   │   ├── service.go
│   │   ├── usecase-devices.go
│   │   └── usecase-ota.go
│   ├── deviceCore
│   │   ├── core.go
│   │   ├── core_test.go
│   │   ├── deviceCore_suite_test.go
│   │   ├── service.go
│   │   ├── streams.go
│   │   └── usecase.go
│   ├── deviceScheduler
│   │   ├── deviceScheduler_suite_test.go
│   │   ├── scheduler.go
│   │   ├── scheduler_test.go
│   │   ├── service.go
│   │   └── usecase.go
│   ├── deviceSource
│   │   ├── service.go
│   │   ├── sources.go
│   │   └── usercase.go
│   ├── deviceStorage
│   │   ├── deviceStorage_suite_test.go
│   │   ├── repository.go
│   │   ├── storage_test.go
│   │   └── usecase.go
│   ├── mqttProvider
│   │   ├── mqttProvider_suite_test.go
│   │   ├── service.go
│   │   ├── service_test.go
│   │   ├── usecase-devices.go
│   │   └── usecase-ota.go
│   ├── services
│   │   └── service.go
│   └── utils
│       ├── colors.go
│       ├── configs.go
│       ├── configs_test.go
│       ├── imageUtils.go
│       ├── svgImages.go
│       ├── utils.go
│       ├── utils_suite_test.go
│       └── utils_test.go
├── svgResources
│   ├── homie-banner.png
│   ├── insertDriveFile-mdo-24px.svg
│   ├── insertDriveFile-mdr-24px.svg
│   ├── notificationAlert-mbo-24px.svg
│   ├── notificationAlert-mbr-24px.svg
│   ├── sensorsOff-mbo-24px.svg
│   ├── sensorsOff-mbr-24px.svg
│   ├── sensorsOn-mbo-24px.svg
│   ├── sensorsOn-mbr-24px.svg
│   ├── thumbsDown-mdo-24px.svg
│   ├── thumbsDown-mdr-24px.svg
│   ├── thumbsDown-mds-24px.svg
│   ├── thumbsUp-mdo-24px.svg
│   ├── thumbsUp-mdr-24px.svg
│   ├── thumbsUp-mds-24px.svg
│   ├── timeLapse-mbo-24px.svg
│   ├── timeLapse-mbr-24px.svg
│   ├── toggleOff-mbo-24px.svg
│   ├── toggleOff-mbr-24px.svg
│   ├── toggleOn-mbo-24px.svg
│   ├── toggleOn-mbr-24px.svg
│   ├── wall-clock-svgrepo-com.svg
│   └── works-with-homie-svg
└── swagger.yaml

Package Description
  • (A) demoProvider
    • mock implementation of MQTT Broker using mqtt interfaces
    • Converts Mosquitto logfile into device messages for deviceSource
    • Intf: SteamProvider
    • Intf: OTAInteractor
  • (A) mqttProvider
    • Captures Mosquitto messages into device messages for deviceSource
    • Intf: SteamProvider
    • Intf: OTAInteractor
  • (A) deviceStorage
    • Stores device messages from deviceSource to LevelDB/boltDB
    • Intf: Repository
  • (B) deviceSource
    • Device message manager for sourcing device info for storage, scheduling, and network device collection
    • Intf: SteamProvider
    • Intf: DeviceEventProvider
  • (B) deviceScheduler
    • Schedules firmware OTA updates to network devices thru deviceSource
    • Intf: OTAInteractor
    • Intf: SchedulerProvider
  • (C) deviceCore
    • Network device collection of all known/active devices on any Homie based network. Fully managed with adds, updates, deletes, queries, firmware uploads, and ota schedule creation
    • Intf: SchedulerProvider
    • Intf: DeviceEventProvider
    • Intf: CoreService
  • (0) utils
    • Configuration and misc utilities
  • (TBD) uiApi
    • JSON API for http implementing deviceCore for device network interactions
  • (TBD) uiHtml
    • HTML ui implementing deviceCore for device network interactions
    • Potentially with Websocks dynamic updates
  • (TBD) uiCli
    • Command line interface allowing data extraction from core network models
Environment Variables and Configuration

MQTT hostname, username, and password can be set in the environment. If present they will override those in the configuration file. The variable are:

Environment Vars: ~/.profile or ~/.bashrc
  • MQTT_BROKER
  • MQTT_USERNAME
  • MQTT_PASSWORD

Optional:

  • MQTT_SUBSCRIPTION_TOPIC
  • MQTT_DISCOVERY_TOPIC
  • HS_FIRMWARE_STORAGE
  • HS_DATA_STORAGE
  • HS_DEMO_SOURCE
  • HOMIE_SERVICE_CONFIG_FILE
    • choices: mqtt-config, demo-config, test-config
Configuration Files: ./config/demo-config.yml or live-config.yml
  • ./config/.yml -- any named YAML file can be used via command-line options
  • ./config/demo-config.yml -- demo version, uses an internal mqtt.log file versus MQTT
  • ./config/mqtt-config.yml -- default configuration file
  • ./config/test-config.yml -- test configuration
Config file priority
  1. Commandline (--config demo-config)
  2. Environment (HOMIE_SERVICE_CONFIG_FILE)
  3. Default ('mqtt-config')
Config params priority
  1. Environment (HS_, MQTT_)
  2. Config file contents (...)
Configuration file Contents

Live Mode: Reads data from MQTT

---
# Live Mode
homiemonitor:
  title: Homie Network Monitor
  runmode: live
  version: 0.4.0

  datasources: 
    dataStorage: ./dataDB/dataDir/devices.db
    demoSource: ./dataDB/demoData/mosquitto.log
    firmwareStorage: ./dataDB/firmwares
    demoNetworks:
    - sknSensors
    - homie

  mqtt:
    clientid: homie-monitor
    broker: <mqtt-host-or-ip>
    port: 1883
    username: <mqtt-username>
    userpassword: <mqtt-password>
    homiediscoverytopic: "+/+/$name"
    homiesubscriptiontopic: "sknSensors/#"
    lwttopic: sknSensors/$broadcast/LWT
    lwtmsg: HomieMonitor Offline!

Demo Mode: Reads local MQTT logfile as input

---
# Demo Config
homiemonitor:
  title: Homie Network Monitor
  runmode: live
  version: 0.4.0

  datasources: 
    dataStorage: ./dataDB/dataDir/devices.db
    demoSource: ./dataDB/demoData/mosquitto.log
    firmwareStorage: ./dataDB/firmwares
    demoNetworks:
    - sknSensors
    - homie
  
Command-line Help
  • program -h
Usage of ./program
  --config string
        path to config file (default "live-config")
  --debug true
        turn on debug messaging 
  • API program
$ go build cmd/api/main.go 
$ ./program --config mqtt-config
$ ./program --config demo-config
 ...
$ curl http://localhost:9090/docs
  • GUI program
$ go build cmd/gui/main.go 
$ ./main --config mqtt-config
$ ./main --config demo-config
  • basic program / NO UI
$ go build cmd/base/main.go 
$ ./main --config mqtt-config --debug=true
$ ./main --config demo-config --debug=true
 no UI
Contributing
  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Find me on Gitter!

LICENSE

The application is available as open source under the terms of the MIT License.

Directories

Path Synopsis
cmd
api command
base command
gui command
pkg
UIAdapters/api/docs
Package classification Homie-Service API
Package classification Homie-Service API

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL