Sha256: 126fec909d276ea8be75f2a2b4d5f38ecd0f8ed2578d116ef8ce2e80de003a6e
Contents?: true
Size: 1.52 KB
Versions: 2
Compression:
Stored size: 1.52 KB
Contents
# frozen_string_literal: true require "rmodbus" require_relative "huawei_solar/array_ext" require "yaml" class HuaweiSolar def initialize(host, port=502, **opts) @client = ModBus::TCPClient.connect(host, port, opts) @client.debug = !ENV["DEBUG"].nil? @slave = @client.with_slave(1) @registers = YAML.load_file(File.expand_path("../data/registers.yml", __dir__)) end def read(name, with_unit: false) name.is_a?(Array) ? read_multiple(name, with_unit:) : read_single(name, with_unit:) end def close @client.close end private def read_single(name, with_unit: false) # rubocop:disable Metrics/AbcSize register = register_by_name(name) type = find_type(register["type"]) gain = register["gain"] unit = register["unit"] value = type.call( @slave.read_holding_registers(register["address"], register["quantity"]) ) value = value.is_a?(Array) && value.size == 1 ? value.first : value value = gain ? value / (gain * 1.0) : value with_unit && !unit.nil? ? "#{value} #{unit}" : value end def read_multiple(names, with_unit: false) names.map { |name| read_single(name, with_unit:) } end def register_by_name(name) @registers[name.to_s] end def find_type(type) Object.const_get("HuaweiSolar::#{type.capitalize}") end end require_relative "huawei_solar/string" require_relative "huawei_solar/i16" require_relative "huawei_solar/i32" require_relative "huawei_solar/u16" require_relative "huawei_solar/u32" require_relative "huawei_solar/version"
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
huawei_solar-0.0.4 | lib/huawei_solar.rb |
huawei_solar-0.0.3 | lib/huawei_solar.rb |