Sha256: ba840327d1a47af9abe981353697bbb727de6fd656a4a0afcba604ba32c8a050

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

require 'httparty'
require 'senec/value'
require 'senec/constants'

module Senec
  class Request
    def initialize(host:, state_names: nil)
      @host = host
      @state_names = state_names
    end

    def house_power
      get('ENERGY', 'GUI_HOUSE_POW')
    end

    def inverter_power
      get('ENERGY', 'GUI_INVERTER_POWER')
    end

    def mpp_power
      get('PV1', 'MPP_POWER')
    end

    def bat_power
      get('ENERGY', 'GUI_BAT_DATA_POWER')
    end

    def bat_fuel_charge
      get('ENERGY', 'GUI_BAT_DATA_FUEL_CHARGE')
    end

    def bat_charge_current
      get('ENERGY', 'GUI_BAT_DATA_CURRENT')
    end

    def bat_voltage
      get('ENERGY', 'GUI_BAT_DATA_VOLTAGE')
    end

    def grid_power
      get('ENERGY', 'GUI_GRID_POW')
    end

    def wallbox_charge_power
      get('WALLBOX', 'APPARENT_CHARGING_POWER')
    end

    def case_temp
      get('TEMPMEASURE', 'CASE_TEMP')
    end

    def current_state
      get('STATISTIC', 'CURRENT_STATE')
    end

    def current_state_name
      throw RuntimeError, 'No state names provided!' unless @state_names

      @state_names[current_state]
    end

    def measure_time
      get('STATISTIC', 'MEASURE_TIME')
    end

    private

    def get(*keys)
      value = response.dig(*keys)

      if value.is_a?(Array)
        value.map do |v|
          Senec::Value.new(v).decoded
        end
      else
        Senec::Value.new(value).decoded
      end
    end

    def response
      @response ||= begin
        res = HTTParty.post(
          url,
          body: JSON.generate(Senec::BASIC_REQUEST),
          headers: {
            'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'
          }
        )
        raise Senec::Error, res.message.to_s unless res.success?

        res.parsed_response
      end
    end

    def url
      "http://#{@host}/lala.cgi"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
senec-0.7.2 lib/senec/request.rb