module Tado::History

Constants

MAPPING

Public Class Methods

get(date = Date.today, home: nil, zone: nil, tado: nil) click to toggle source
# File lib/tado/history.rb, line 3
def self.get(date = Date.today, home: nil, zone: nil, tado: nil)
    date = case date
           when Date                  then date.strftime('%Y-%m-%d')
           when /^\d{4}-\d{2}-\d{2}$/ then date
           else raise ArgumentError
           end

    report = if Zone === zone
                 zone.v2_get("dayReport", date: date)
             elsif Tado === tado && Integer === home && Integer === zone
                 tado.v2_get("homes/#{home}/zones/#{zone}/dayReport", date: date)
             else
                 raise ArgumentError
             end
    self.parse_from_json(report)
end

Private Class Methods

parse_from_json(json) click to toggle source
# File lib/tado/history.rb, line 55
def self.parse_from_json(json)
    h = {}
    MAPPING.each {|name:, series:, fields: nil|
        e      = h
        fields = [ nil ] if fields.nil? || fields.empty?
        name    = Array(name)
        name[0..-2].each {|n| e = e[n] ||= {} }
        e[name.last] = History.timeSeries(json.dig(*series), fields)
    }
    h
end
timeSeries(json, template) click to toggle source
# File lib/tado/history.rb, line 68
def self.timeSeries(json, template)
    case type = json.dig('timeSeriesType')
    when 'slots'
        json.dig('slots').transform_values {|v|
            template.map {|fields| v.dig(*fields) }
        }

    when 'dataIntervals'
        json.dig('dataIntervals').map {|v|
            [ Time.parse(v.dig('from')) .. Time.parse(v.dig('to')) ] +
                template.map {|fields| v.dig('value', *fields) }
        }

    when 'dataPoints'
        json.dig('dataPoints').map {|v|
            [ Time.parse(v.dig('timestamp')) ] +
                template.map {|fields| v.dig('value', *fields) }
        }

    else raise ParsingError
    end
end