Komoku is a key value database for different types of data, which keeps track of all changes, and then can compact historical data in a clever way. You can subscribe to different key changes.
For now the API is going to be compatible with ruby version (https://github.com/comboy/komoku.ruby) but after I migrate my home automation to the new system I'm going to update it.
Why am I even writing this readme, it's way too early for that.
HA denotes my personal use case in home automation as an example
Double. I'm considering using actual numeric type (specified precision, exact). Currently there's only gauge but I plan adding different types similar to what's known from rrdtool. It should be able to use different aggregations (for now, most of my cases are covered with gauge avg/min/max so I'm focusing on that)
HA: tracking temp, humidity light etc.
True and false. But. It represents the state changes that last. So with boolean you should be able to get stats like:
- what value was present at given time
- uptime-like stats e.g. 99.5% true during last month
- sum of time stats e.g. number of hours per day for which the state was false
- maybe common timespans stats (like avg distribution per hour during last month)
Boolean can be used for representing timespans between value changes.
HA: state of the light somewhere, is door open, is window open, how often am I at home
Boolean which automatically goes to false if not updated for :max_time
Custom string.
- you can disable compacting and just use it as a log (better yet let's compact it, keeping in mind that it is a logfile), separate type may appear for that
- or you can be only assigning to it some set of strings representing state of something (stats then are boolean-alike but with more values)
- or use it to store some kind of config
HA: log, what's the alarm state (armed, disabled, waiting), selected radio station, what room I'm in
- compacting historical data
- fetching historical data
- treating booleans as timespans
- user authentication
- better error handling, there are supervisors but incorrect user input shouldn't be resulting in any process crash
- unused key processes can be killed when there's like 100K+ of them
- add bench for 100K+ keys
- use benchfella
- add distillery
- beter docs
- protobuf + tcp server
- http server
- komowku-web with graphs
- string opt to only allow specified set of values (careful with
update_key
and historical values that may not comply)
Komoku.Server
is the main access point. You can call on it things like get
, put
or list_keys
. It also starts outside interfacess like Komoku.Server.Websocket
according to config.exs.
Each key is handled by a separate process (KeyHandler
). It stores last value cache in its state, it's responsible for appropriate key value updates (e.g. change value to false for uptime type of key), consolidating data, and fetching it from Storage
when necessary.
Storage
is responsible for persistant value store. Basically a database interface.
KeyMaster
manages keys. It keeps list of all the keys, creates, updates and removes them. It also manages KeyHandler
processes.
SubscriptionManager
- you won't guess! KeyHandler
publishes changes of keys to it, and client processes created by e.g. Komoku.Server.Websocket
can subscribe to these changes.