Class: OpenHAB::DSL::Items::ItemBuilder

Inherits:
Object
  • Object
show all
Includes:
Core::EntityLookup
Defined in:
lib/openhab/dsl/items/builder.rb

Overview

The ItemBuilder DSL allows you to customize an Item

Direct Known Subclasses

GroupItemBuilder

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Core::EntityLookup

#items, #method_missing, #things

Constructor Details

#initialize(type, name = nil, label = nil, provider:, dimension: nil, unit: nil, format: nil, range: nil, step: nil, read_only: nil, command_options: nil, state_options: nil, icon: nil, group: nil, groups: nil, tag: nil, tags: nil, autoupdate: nil, thing: nil, channel: nil, channels: nil, expire: nil, alexa: nil, ga: nil, homekit: nil, metadata: nil, state: nil) ⇒ ItemBuilder

Returns a new instance of ItemBuilder.

Parameters:

Raises:

  • (ArgumentError)


341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'lib/openhab/dsl/items/builder.rb', line 341

def initialize(type,
               name = nil,
               label = nil,
               provider:,
               dimension: nil,
               unit: nil,
               format: nil,
               range: nil,
               step: nil,
               read_only: nil,
               command_options: nil,
               state_options: nil,
               icon: nil,
               group: nil,
               groups: nil,
               tag: nil,
               tags: nil,
               autoupdate: nil,
               thing: nil,
               channel: nil,
               channels: nil,
               expire: nil,
               alexa: nil,
               ga: nil, # rubocop:disable Naming/MethodParameterName
               homekit: nil,
               metadata: nil,
               state: nil)
  raise ArgumentError, "`name` cannot be nil" if name.nil?

  if dimension
    raise ArgumentError, "`dimension` can only be specified with NumberItem" unless type == :number

    begin
      org.openhab.core.types.util.UnitUtils.parse_dimension(dimension.to_s)
    rescue java.lang.IllegalArgumentException
      raise ArgumentError, "Invalid dimension '#{dimension}'"
    end
  end

  name = name.name if name.respond_to?(:name)
  if provider.is_a?(GroupItemBuilder)
    name = "#{provider.name_base}#{name}"
    label = "#{provider.label_base}#{label}".strip if label
  end
  @provider = provider
  @type = type
  @name = name.to_s
  @label = label
  @dimension = dimension
  @format = format
  @range = range
  @step = step
  @read_only = read_only
  @command_options = command_options
  @state_options = state_options
  self.unit = unit
  @icon = icon
  @groups = []
  @tags = []
  @metadata = Core::Items::Metadata::NamespaceHash.new
  @metadata.merge!(metadata) if metadata
  @autoupdate = autoupdate
  @channels = []
  @thing = thing
  @expire = nil
  if expire
    expire = Array(expire)
    expire_config = expire.pop if expire.last.is_a?(Hash)
    expire_config ||= {}
    self.expire(*expire, **expire_config)
  end
  self.alexa(alexa) if alexa
  self.ga(ga) if ga
  self.homekit(homekit) if homekit
  self.state = state

  self.group(*group)
  self.groups(*groups)

  self.tag(*tag)
  self.tags(*tags)

  self.channel(*channel)
  self.channels(*channels)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class OpenHAB::Core::EntityLookup

Instance Attribute Details

#autoupdatetrue, ...

Autoupdate setting

Returns:

  • (true, false, nil)


247
248
249
# File 'lib/openhab/dsl/items/builder.rb', line 247

def autoupdate
  @autoupdate
end

#channels=(value) ⇒ Array<String, Symbol, Core::Things::ChannelUID, Core::Things::Channel, Array>

Returns Channel to link the item to.

Returns:



# File 'lib/openhab/dsl/items/builder.rb', line 262

#command_optionsHash, ...

A list of valid commands If a hash, keys are commands, and values are labels

Returns:



237
238
239
# File 'lib/openhab/dsl/items/builder.rb', line 237

def command_options
  @command_options
end

#dimensionString?

Unit dimension (for number items only)

If #unit is provided, and #dimension is not, it will be inferred.

Returns:

  • (String, nil)


210
211
212
# File 'lib/openhab/dsl/items/builder.rb', line 210

def dimension
  @dimension
end

#formatString?

The formatting pattern for the item's state

If #unit is provided, and #format is not, it will be inferred.

Returns:

  • (String, nil)


223
224
225
# File 'lib/openhab/dsl/items/builder.rb', line 223

def format
  @format
end

#groups=(value) ⇒ Array<String, GroupItem>

Returns Groups to which this item should be added.

Returns:

  • (Array<String, GroupItem>)

    Groups to which this item should be added



# File 'lib/openhab/dsl/items/builder.rb', line 266

#iconSymbol, ...

The icon to be associated with the item

Returns:



244
245
246
# File 'lib/openhab/dsl/items/builder.rb', line 244

def icon
  @icon
end

#labelString?

Item label

Returns:

  • (String, nil)


204
205
206
# File 'lib/openhab/dsl/items/builder.rb', line 204

def label
  @label
end

#metadataCore::Items::Metadata::NamespaceHash (readonly)



252
253
254
# File 'lib/openhab/dsl/items/builder.rb', line 252

def metadata
  @metadata
end

#nameString

Item name

Returns:

  • (String)


201
202
203
# File 'lib/openhab/dsl/items/builder.rb', line 201

def name
  @name
end

#rangeRange?

The valid range for a number item

Returns:



226
227
228
# File 'lib/openhab/dsl/items/builder.rb', line 226

def range
  @range
end

#read_onlytrue, ... Also known as: read_only?

If the item is read-only, and does not accept commands

Returns:

  • (true, false, nil)


232
233
234
# File 'lib/openhab/dsl/items/builder.rb', line 232

def read_only
  @read_only
end

#stateCore::Types::State

Initial state

If #state is set to a QuantityType, and #unit is not set, it will be inferred.

Returns:



258
259
260
# File 'lib/openhab/dsl/items/builder.rb', line 258

def state
  @state
end

#state_optionsHash, ...

A list of valid states If a hash, keys are commands, and values are labels

Returns:



241
242
243
# File 'lib/openhab/dsl/items/builder.rb', line 241

def state_options
  @state_options
end

#stepNumber?

The step size for a number item

Returns:

  • (Number, nil)


229
230
231
# File 'lib/openhab/dsl/items/builder.rb', line 229

def step
  @step
end

#tags=(value) ⇒ Array<String>

Returns Tags to apply to this item.

Returns:

  • (Array<String>)

    Tags to apply to this item



# File 'lib/openhab/dsl/items/builder.rb', line 269

#thingString, ...

Returns Thing from which to resolve relative channel ids.

Returns:



250
251
252
# File 'lib/openhab/dsl/items/builder.rb', line 250

def thing
  @thing
end

#typeSymbol (readonly)

The type of this item

Examples:

type #=> :switch

Returns:



198
199
200
# File 'lib/openhab/dsl/items/builder.rb', line 198

def type
  @type
end

#unitString?

Unit (for number items only)

Due to #format inference, setting the unit is cross-compatible with openHAB 3.4 and 4.0.

Returns:

  • (String, nil)


217
218
219
# File 'lib/openhab/dsl/items/builder.rb', line 217

def unit
  @unit
end

Instance Method Details

#alexa(value, config = nil) ⇒ void

This method returns an undefined value.

Shortcut for adding Alexa metadata

Parameters:

  • value (String, Symbol)

    Type of Alexa endpoint

  • config (Hash, nil) (defaults to: nil)

    Additional Alexa configuration

See Also:



# File 'lib/openhab/dsl/items/builder.rb', line 488

#channel(channel, config = {}) ⇒ Array<String, Symbol, Core::Things::ChannelUID, Core::Things::Channel, Array> #channelsArray<String, Symbol, Core::Things::ChannelUID, Core::Things::Channel, Array> #channels(*channels) ⇒ Array<String, Symbol, Core::Things::ChannelUID, Core::Things::Channel, Array> Also known as: channels

Add a channel link to this item.

Examples:

items.build do
  date_time_item Bedroom_Light_Updated do
    channel "hue:0210:1:bulb1:color", profile: "system:timestamp-update"
  end
end

Relative channel name

items.build do
  switch_item Bedroom_Light, thing: "mqtt:topic:bedroom-light", channel: :power
end

Multiple channels

items.build do
  dimmer_item DemoDimmer, channels: ["hue:0210:bridge:1:color", "knx:device:bridge:generic:controlDimmer"]
end

Multiple channels in a block

items.build do
  dimmer_item DemoDimmer do
    channel "hue:0210:bridge:1:color"
    channel "knx:device:bridge:generic:controlDimmer"
  end
end

Multiple channels with config

items.build do
  dimmer_item DemoDimmer, channels: [["hue:0210:bridge:1:color", profile: "system:follow"],
                                     "knx:device:bridge:generic:controlDimmer"]
end

Overloads:

Returns:



580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
# File 'lib/openhab/dsl/items/builder.rb', line 580

def channel(*channels)
  return @channels if channels.empty?

  channels = [channels] if channels.length == 2 && channels[1].is_a?(Hash)

  channels.each do |channel|
    orig_channel = channel
    channel = channel.first if channel.is_a?(Array)
    next if channel.is_a?(String) ||
            channel.is_a?(Symbol) ||
            channel.is_a?(Core::Things::ChannelUID) ||
            channel.is_a?(Core::Things::Channel)

    raise ArgumentError, "channel #{orig_channel.inspect} must be a `String`, `Symbol`, `ChannelUID`, or " \
                         "`Channel`, or a two element array with the first element those types, and the " \
                         "second element a Hash"
  end

  @channels.concat(channels)
end

#expire(duration, command: nil, state: nil, ignore_state_updates: nil, ignore_commands: nil) ⇒ void

This method returns an undefined value.

Configure item expiration

Examples:

Get the current expire setting

expire

Clear any expire setting

expire nil

Use a duration

expire 5.hours

Use a string duration

expire "5h"

Set a specific state on expiration

expire 5.minutes, NULL
expire 5.minutes, state: NULL

Send a command on expiration

expire 5.minutes, command: OFF

Specify the duration and command in the same string

expire "5h,command=OFF"

Set the expire configuration

expire 5.minutes, ignore_state_updates: true

Parameters:

  • duration (String, Duration, nil)

    Duration after which the command or state should be applied

  • command (String, nil) (defaults to: nil)

    Command to send on expiration

  • state (String, nil) (defaults to: nil)

    State to set on expiration

  • ignore_state_updates (true, false) (defaults to: nil)

    When true, state updates will not reset the expire timer

  • ignore_commands (true, false) (defaults to: nil)

    When true, commands will not reset the expire timer

Raises:

  • (ArgumentError)


632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
# File 'lib/openhab/dsl/items/builder.rb', line 632

def expire(*args, command: nil, state: nil, ignore_state_updates: nil, ignore_commands: nil)
  unless (0..2).cover?(args.length)
    raise ArgumentError,
          "wrong number of arguments (given #{args.length}, expected 0..2)"
  end
  return @expire if args.empty?

  state = args.last if args.length == 2
  raise ArgumentError, "cannot provide both command and state" if command && state

  duration = args.first
  return @expire = nil if duration.nil?

  duration = duration.to_s[2..].downcase if duration.is_a?(Duration)
  state = "'#{state}'" if state.respond_to?(:to_str) && type == :string

  value = duration
  value += ",state=#{state}" if state
  value += ",command=#{command}" if command

  config = { ignoreStateUpdates: ignore_state_updates, ignoreCommands: ignore_commands }
  config.compact!
  @expire = [value, config]
end

#ga(value, config = nil) ⇒ void

This method returns an undefined value.

Shortcut for adding Google Assistant metadata

Parameters:

  • value (String, Symbol)

    Type of Google Assistant endpoint

  • config (Hash, nil) (defaults to: nil)

    Additional Google Assistant configuration

See Also:



# File 'lib/openhab/dsl/items/builder.rb', line 499

#group(group) ⇒ Array<String, GroupItemBulder, GroupItem> #groupsArray<String, GroupItemBulder, GroupItem> #groups(*groups) ⇒ Array<String, GroupItemBulder, GroupItem> Also known as: groups

Add this item to a group

Overloads:

Returns:



475
476
477
478
479
480
481
482
483
484
485
# File 'lib/openhab/dsl/items/builder.rb', line 475

def group(*groups)
  return @groups if groups.empty?

  unless groups.all? do |group|
           group.is_a?(String) || group.is_a?(Core::Items::GroupItem) || group.is_a?(GroupItemBuilder)
         end
    raise ArgumentError, "`group` must be a `GroupItem`, `GroupItemBuilder`, or a `String`"
  end

  @groups.concat(groups)
end

#homekit(value, config = nil) ⇒ void

This method returns an undefined value.

Shortcut for adding Homekit metadata

Parameters:

  • value (String, Symbol)

    Type of Homekit accessory or characteristic

  • config (Hash, nil) (defaults to: nil)

    Additional Homekit configuration

See Also:



521
522
523
524
525
526
# File 'lib/openhab/dsl/items/builder.rb', line 521

%i[alexa ga homekit].each do |shortcut|
  define_method(shortcut) do |value = nil, config = nil|
    value, config = value if value.is_a?(Array)
    metadata[shortcut] = [value, config]
  end
end

#inspectString

Returns:

  • (String)


739
740
741
742
743
744
745
746
# File 'lib/openhab/dsl/items/builder.rb', line 739

def inspect
  s = "#<OpenHAB::Core::Items::#{inspect_type}ItemBuilder#{type_details} #{name} #{label.inspect}"
  s += " category=#{icon.inspect}" if icon
  s += " tags=#{tags.inspect}" unless tags.empty?
  s += " groups=#{groups.map { |g| g.respond_to?(:name) ? g.name : g }.inspect}" unless groups.empty?
  s += " metadata=#{metadata.to_h.inspect}" unless metadata.empty?
  "#{s}>"
end

#tag(tag) ⇒ Array<String> #tagsArray<String> #tags(*tags) ⇒ Array<String> Also known as: tags

Tag item

Overloads:

Returns:



452
453
454
455
456
# File 'lib/openhab/dsl/items/builder.rb', line 452

def tag(*tags)
  return @tags if tags.empty?

  @tags.concat(self.class.normalize_tags(*tags))
end

#to_sString

The item's label if one is defined, otherwise its name.

Returns:

  • (String)


432
433
434
# File 'lib/openhab/dsl/items/builder.rb', line 432

def to_s
  label || name
end