DAIKIN Onecta


Tabuľky:

Consumption data

-- Fakt: 2h sloty (UTC)
CREATE TABLE IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_2h (
  device_id         TEXT NOT NULL,             -- FK na tvoju device tabuľku (už ju máš)
  source_code       TEXT NOT NULL,             -- 'electrical' | 'gas'
  mode_code         TEXT NOT NULL,             -- 'heating' | 'cooling'
  period_start_utc  TEXT NOT NULL,             -- ISO8601, UTC 'YYYY-MM-DDTHH:MM:SSZ'
  value             REAL,                      -- NULL = zatiaľ neznáme
  unit              TEXT NOT NULL,             -- 'kWh' | 'm³' (alebo z payloadu)
  PRIMARY KEY (device_id, source_code, mode_code, period_start_utc)
);

CREATE INDEX IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_2h_idx_start
  ON pe1_ws_daikinonecta_consumptiondata_2h(period_start_utc);

CREATE INDEX IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_2h_idx_dev_start
  ON pe1_ws_daikinonecta_consumptiondata_2h(device_id, period_start_utc);

-- Raw snapshot (audit/debug)
CREATE TABLE IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_raw (
  raw_id         INTEGER PRIMARY KEY AUTOINCREMENT,
  device_id      TEXT NOT NULL,
  polled_at_utc  TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
  payload_json   TEXT NOT NULL,
  timestamp      TEXT NOT NULL
);

CREATE INDEX IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_raw_idx_dev
  ON pe1_ws_daikinonecta_consumptiondata_raw(device_id, polled_at_utc);

reporty bez vstupných parametrov, ktoré vrátia všetky uložené dáta za všetky zariadenia, všetky dni a rozdelené podľa režimov (a zdrojov). Nižšie sú hotové SELECTy. Všetky agregujú v lokálnom čase Europe/Bratislava (CET/CEST), pričom výpočet lokálneho času robia inline z period_start_utc (UTC) — teda bez parametrov.

Pozn.: Výraz na konverziu UTC → lokálny čas zohľadňuje letný/zimný čas:

  • DST (CEST, UTC+2) trvá od poslednej nedele v marci 01:00 UTC do poslednej nedele v októbri 01:00 UTC.
  • Mimo tohto intervalu je CET (UTC+1).

Tento výraz uvidíš vložený v každom SELECT-e.


0) Pomocný výraz (len na vysvetlenie, netreba vytvárať)

V dotazoch konvertujem period_start_utc na lokálny čas takto (inline v každom SELECT-e):

SQL

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)
Zobraziť viac riadkov

  • Z tohto potom odvodzujem date(...) (deň), strftime('%Y-%m', ...) (mesiac), strftime('%W', ...) (týždeň).

1) Denný sumár (za všetky dni a zariadenia, podľa režimu a zdroja)

Skupiny: deň (lokálny), device_id, source_code, mode_code.

SQL

SELECT

date(

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS day_local,

device_id,

source_code,

mode_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY day_local, device_id, source_code, mode_code

ORDER BY day_local DESC, device_id, source_code, mode_code;
Zobraziť viac riadkov


2) Mesačný sumár (YYYY‑MM, lokálny čas)

Skupiny: mesiac (lokálny), device_id, source_code, mode_code.

SQL

SELECT

strftime(

‘%Y-%m’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS ym_local,

device_id,

source_code,

mode_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY ym_local, device_id, source_code, mode_code

ORDER BY ym_local DESC, device_id, source_code, mode_code;
Zobraziť viac riadkov


3) Týždenný sumár (rok + týždeň %W, lokálny čas)

Skupiny: rok (lokálny), týždeň %W (lokálny), device_id, source_code, mode_code.

%W nie je ISO týždeň, ale na prehľady stačí. Ak chceš ISO, doplním alternatívu.

SQL

SELECT

strftime(

‘%Y’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS yr_local,

strftime(

‘%W’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS wk_local,

device_id,

source_code,

mode_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY yr_local, wk_local, device_id, source_code, mode_code

ORDER BY yr_local DESC, wk_local DESC, device_id, source_code, mode_code;
Zobraziť viac riadkov


4) 2‑hodinová časová rada (lokálny čas slotu) — všetko, bez filtrov

Užitočné na línie grafy alebo profil spotreby v čase.

SQL

SELECT

period_start_utc,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

) AS period_start_local,

device_id,

source_code,

mode_code,

value,

unit

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

ORDER BY period_start_utc ASC, device_id, source_code, mode_code;
Zobraziť viac riadkov


5) Rozdelenie podľa režimu (heating vs. cooling) cez celé uložené obdobie

Skupiny: mode_code, device_id, source_code.

SQL

SELECT

mode_code,

device_id,

source_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY mode_code, device_id, source_code

ORDER BY device_id, source_code, total DESC;
Zobraziť viac riadkov


6) Rozdelenie podľa zdroja (electrical vs. gas) cez celé uložené obdobie

Skupiny: source_code, device_id, mode_code.

SQL

SELECT

source_code,

device_id,

mode_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY source_code, device_id, mode_code

ORDER BY device_id, mode_code, total DESC;
Zobraziť viac riadkov


7) Top dni s najvyššou spotrebou (lokálne dni) naprieč všetkým

Ak chceš globálny rebríček „najenergetickejších“ dní (naprieč zariadeniami).

SQL

SELECT

date(

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS day_local,

device_id,

source_code,

mode_code,

SUM(value) AS total

FROM pe1_ws_daikinonecta_consumptiondata_2h

WHERE value IS NOT NULL

GROUP BY day_local, device_id, source_code, mode_code

ORDER BY total DESC, day_local DESC, device_id

LIMIT 100;
Zobraziť viac riadkov


Tip na zjednodušenie (voliteľné)

Ak chceš, môžeme vytvoriť VIEW s predpočítaným lokálnym časom, napr.:

SQL

CREATE VIEW IF NOT EXISTS pe1_ws_daikinonecta_consumptiondata_2h_local_v AS

SELECT

period_start_utc,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

) AS period_start_local,

date(

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS day_local,

strftime(

‘%Y-%m’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS ym_local,

strftime(

‘%Y’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS yr_local,

strftime(

‘%W’,

datetime(

period_start_utc,

printf(

‘%+d hours’,

-(

CASE

WHEN datetime(period_start_utc) >= datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-03-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-03-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

AND datetime(period_start_utc) < datetime(

date(strftime(‘%Y’, period_start_utc) || ‘-10-31’,

printf(‘-%d days’, CAST(strftime(‘%w’, date(strftime(‘%Y’, period_start_utc) || ‘-10-31’)) AS INTEGER))

) || ‘ 01:00:00’

)

THEN -2 ELSE -1

END

)

)

)

) AS wk_local,

device_id,

source_code,

mode_code,

value,

unit

FROM pe1_ws_daikinonecta_consumptiondata_2h;
Zobraziť viac riadkov

Potom by tvoje reporty boli jednoduchšie (SELECT ... FROM pe1_ws_daikinonecta_consumptiondata_2h_local_v ...), ale chápem, že si chcel čisté SELECTy bez ďalších objektov.