ecobee adapter — parses the thermostat runtime report (5-minute intervals) and measures per-thermostat runtime plus the cross-feed between two zones
| Tier | infrastructure |
| Role | adapter |
| Path | crates/infrastructure/ecobee |
| Edition | 2021 |
| Targets | infrastructure-ecobee, infrastructure_ecobee |
| Public items | 14 across 0 modules |
| Tests | 7 |
What it is for
ecobee runtime-report reader and zone measurements.
The runtime report is what the ecobee portal exports: one row per five-minute interval per thermostat, carrying the mode, the setpoints, the measured temperature, and per-stage equipment seconds. Everything in this crate is a pure function over that text — no I/O, no clock, no network — so a measurement can be re-derived from the same file forever.
Sprint 4.54. The question the measurements exist to answer: when one zone runs the equipment, is the other zone — which is not calling — being driven away from its own setpoint? That is cross_feed.
Capabilities
crate root
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub const INTERVAL_SECONDS: u32 |
fn split_csv_line(line : & str) -> Vec <String> |
fn summarize(report : & Report) -> Summary |
fn cross_feed(a : & Report, b : & Report) -> CrossFeed |
CrossFeed
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub struct CrossFeed |
Header
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub struct Header |
ParseError
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub enum ParseError |
Report
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub struct Report |
fn parse_report(text : & str) -> Result <Report, ParseError> |
Row
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub struct Row |
Row :: fn key(& self) -> String |
Row :: fn cooling(& self) -> bool |
Row :: fn degrees_below_cool_setpoint(& self) -> Option <f64> |
Summary
ecobee runtime-report reader and zone measurements.
| Item |
|---|
pub struct Summary |
How to use it
No examples/ target and no doctest in this crate's rustdoc. The tests listed under Verification are the closest executable usage.
Module structure
No public modules: the crate root is its whole surface.
Public surface
`crate root`
| Item | What it is |
|---|---|
pub const INTERVAL_SECONDS: u32 | Seconds in one runtime-report interval |
pub enum ParseError | — |
pub struct Header | The #,Thermostat,... preamble above the column header row. |
pub struct Row | One five-minute interval as reported for one thermostat. |
Row :: fn key(& self) -> String | YYYY-MM-DD HH:MM:SS — the join key between two thermostats' reports |
Row :: fn cooling(& self) -> bool | Was the compressor cooling during this interval? |
Row :: fn degrees_below_cool_setpoint(& self) -> Option <f64> | Degrees below this thermostat's own cool setpoint, or None when the row lacks either number |
pub struct Report | One thermostat's export: its preamble and every interval in range. |
pub struct Summary | Per-thermostat totals over the whole report. |
pub struct CrossFeed | What one thermostat's equipment runtime coincides with at the other. |
fn split_csv_line(line : & str) -> Vec <String> | Split one CSV line |
fn parse_report(text : & str) -> Result <Report, ParseError> | Parse a runtime-report export. |
fn summarize(report : & Report) -> Summary | Total one report's runtime and its distance below setpoint. |
fn cross_feed(a : & Report, b : & Report) -> CrossFeed | Line two thermostats up interval by interval and measure how often one runs the equipment while the other, calling nothing, is driven below its own setpoint. |
No pub use re-exports: every item above is declared in this crate.
Boundary
Depends on no other workspace tier.
Shares tier infrastructure with 82 other crates: infrastructure-acquire, infrastructure-adapters-google-calendar, infrastructure-adapters-google-gmail, infrastructure-adapters-google-places, infrastructure-adapters-google-trends, infrastructure-adapters-shodan, infrastructure-adapters-yelp, infrastructure-agent, … (82 total).
_What this crate deliberately does NOT own is a judgment. No committed registry records one for it, so none is stated here._
Where it sits
| Tier (ontology) | infrastructure |
| Architectural role (taxonomy) | adapter |
| Location | crates/infrastructure/ecobee |
| Vocabulary in force (lexicon) | current |
Dependencies
Runtime, from outside the workspace.
| Crate | Requirement | Features | Optional | Only on |
|---|---|---|---|---|
thiserror | ^2 | — | no | always |
Development. None.
Build. None.
Depended on by. Nothing in this workspace.
Feature flags
No Cargo features are defined: every capability is unconditional, so no consumer can receive a half-wired crate.
Targets
| Kind | Name | Source |
|---|---|---|
| bin | infrastructure-ecobee | `src/main.rs` |
| lib | infrastructure_ecobee | `src/lib.rs` |
Error model
| Error type | Named by |
|---|---|
ParseError | parse_report |
Operational characteristics
| Property | Evidence |
|---|---|
| async public surface | none detected |
| async runtime | none detected |
| database access | none detected |
| network I/O | none detected |
| unsafe code | none detected |
| environment variables | none detected |
No unsafe block, unsafe fn, unsafe impl or unsafe trait was found by the parser anywhere in this crate's source.
Configuration
No environment variable is read with a literal name anywhere in this crate. A variable whose key is computed at run time cannot be listed here, and is not claimed to be absent.
Related capabilities
No workspace crate depends on this one.
Verification
| Kind | Count |
|---|---|
| Unit tests | 7 |
| Integration tests | 0 |
| Examples | 0 |
| Doctests | 0 |
Evidence by module. How often each public module is named by something executable.
| Module | Tests | Examples | Consumers |
|---|---|---|---|
crate root | 11 | 0 | 0 |
What the tests establish, by name:
cross_feed_counts_only_idle_and_below_intervals—src/lib.rscross_feed_ignores_unmatched_intervals—src/lib.rsdegrees_below_is_clamped_at_zero—src/lib.rsmissing_required_column_is_named—src/lib.rsparses_preamble_and_rows—src/lib.rssplit_respects_quoted_commas_and_doubled_quotes—src/lib.rssummarize_totals_and_longest_run—src/lib.rs
Documentation coverage
| Measure | Documented | Total |
|---|---|---|
| Public items with rustdoc | 13 | 14 |
Public modules with a //! block | 0 | 0 |
pie showData
title Public items with rustdoc
"Documented" : 13
"No rustdoc detected" : 1
Metrics
| Metric | Value |
|---|---|
| Rust source files | 2 |
| Source lines | 548 |
| Code lines | 435 |
| Public API items | 14 |
| Public modules | 0 |
| Tests | 7 |
| Examples | 0 |
| Cargo features | 0 |
| Direct runtime dependencies | 1 |
| Workspace reverse dependencies | 0 |
pie showData
title Public API by kind
"constant" : 1
"enum" : 1
"function" : 4
"method" : 3
"struct" : 5
pie showData
title Rust source composition
"Code" : 435
"Blank or comment" : 113
Generation
Rendered by tools-corpus corpus readme from repository evidence alone, renderer schema 2, lexicon current. No model, network service or database was consulted. Regenerate with tools-corpus corpus readme --write; verify with --check.