Commit Graph
36 Commits
Author SHA1 Message Date
Cody CutrerandGitHub 6bdcd15d99 [mqtt.espmilight] Automatically convert color values to color temp (#13578)
* [mqtt.espmilight] Automatically convert color values to color temp for RGB+CCT bulbs

Yes, it's lots of math, but references are provided. This supplants
whiteThreshold for RGB+CCT bulbs since it is far more flexible and
accurate.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-29 00:33:49 +01:00
Cody CutrerandGitHub 826fc9e8d7 [homekit] make sure to convert step values to Celsius (#13796)
otherwise if your step is 1.0 in fahrenheit, then your
values will get rounded to 1.0 celsius, and you might not
even notice you've lost precision in the Home app.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-28 23:11:40 +01:00
Cody CutrerandGitHub 583da2d516 [homekit] add @ccutrer as a codeowner (#13784)
Signed-off-by: Cody Cutrer <cody@cutrer.us>

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-26 21:39:06 +01:00
Cody CutrerandGitHub b00d58d0eb [jrubyscripting] add @ccutrer and @jimtng as CODEOWNERS (#13783)
Signed-off-by: Cody Cutrer <cody@cutrer.us>

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-26 21:38:21 +01:00
Cody CutrerandGitHub 4739f126a2 [jrubyscripting] log Ruby stacktrace on exception from JRuby (#13778)
Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-26 08:19:22 +01:00
Cody CutrerandGitHub db0ca281ca [mqtt.homeassistant] support non-RGB lights (#13413)
* [mqtt.homeassistant] support non-RGB lights

dynamically decide which type of channel to expose. also send "down-typed"
commands to the proper topic. this also sets the groundwork for supporting
template and JSON schemas

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-05 16:57:06 +01:00
Cody CutrerandGitHub bbc744e3ff [jrubyscripting] don't manually filter presets. (#13548)
simply just don't overwrite any constants that already exist

refs https://github.com/openhab/openhab-core/pull/3113

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-11-05 15:23:02 +01:00
Cody CutrerandGitHub 26ad08cca9 [mqtt] set the proper unit in the state description (#13604)
So that other pieces of openhab can know what unit it's going to be,
without it having a value yet. Importantly, any necessary conversion
that need to be applied to the other portion of the state description -
min, max, and step.

See also https://github.com/openhab/openhab-core/pull/3132

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-27 08:34:50 +02:00
Cody CutrerandGitHub 66c7211b26 [homekit] increase flexibility of ColorTemperature (#13538)
* [homekit] increase flexibility of ColorTemperature

allow Number or Dimmer items, and mired or Kelvin units.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-22 20:24:51 +02:00
Cody CutrerandGitHub 5f6241cbc6 [mqtt] support mired<->Kelvin unit conversion (#13575)
Just have to use the newer toInvertibleUnit method that allows
the dimension to change.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-22 20:07:33 +02:00
Cody CutrerandGitHub 68b52ee15b [homekit] Improve output of console's homekit show command (#13569)
* [homekit] Improve output of console's `homekit show` command

 * include the full JSON from all the characteristics, so you can confirm
   everything is configured correctly.
 * only use simple class names; the fully qualified package is just a
   distraction.
 * show linked services if they exist
 * include the class name of services, not just the GUID

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-19 20:17:55 +02:00
Cody CutrerandGitHub 91383250d4 [homekit] improve bundle deactivation time (#13566)
If you have many instances, it can take a while. So stop all the
instances in parallel. Also, fix a race condition where the update
debouncer might get called again after being stopped, because the
change listener was deregistered _after_ the debouncer was stopped.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-19 11:18:02 +02:00
Cody CutrerandGitHub 507e714dd0 [homekit] fix BooleanItemReader to work with DimmerItems (#13507)
* [homekit] fix BooleanItemReader to work with DimmerItems

DimmerItems have a PercentType state, which is easily convertible
to OnOffType, but is not inherited from it. So take that into account.

i.e. a variable speed fan can use a single DimmerItem for both
ActiveStatus and RotationSpeed.

* [homekit] Document that Dimmer is a possible item type for several booleans

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-10 13:36:23 +02:00
Cody CutrerandGitHub d83c32cd24 [homekit] allow configuring maxValue on VOCDensity (#13508)
* [homekit] allow configuring maxValue on VOCDensity

the default of 1000 is quite low in reality. tested and confirmed
working with iOS 16

* [homekit] allow step value to be configured for VOCDensity

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-10 13:30:13 +02:00
Cody CutrerandGitHub 0409484c2e [homekit] allow RelativeHumidity as an optional characteristic on Thermostat (#13504)
also support QuantityType as a valid state type for double characteristics
(such as RelativeHumidity).

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-09 11:01:25 +02:00
Cody CutrerandGitHub 0aa28e5d40 [homekit] get min/max/step values from state description if possible (#13510)
this helps to auto-configure if the binding is providing the necessary info

metadata config still overrides

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-09 10:55:32 +02:00
Cody CutrerandGitHub ccc199f429 [homekit] Allow Long type in configuration for numbers (#13509)
I.e. if it's set from a Ruby script

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-09 09:04:06 +02:00
Cody CutrerandGitHub 98677c18b3 [mqtt.homeassistant] ensure availability topics get subscribed (#13466)
HASS registers availability topics before calling start(), so
the AbstractMQTTThingHandler was never subscribing/starting the
availability channel(s). So do so in start() of the base class.

I checked other implementations, and either they already handle
re-registering availabilityTopics in their start()
(GenericMQTTThingHandler), or they don't use availabilityTopics
at all from the base class and manage it themselves (Homie).

Note that this shows up as newly-added HASS things not having
a problem (because the components aren't discovered until after
the ThingHandler is started), but if you restart OpenHAB or
disable/enable the thing, the channels (and components) are
cached, thus how availabilityTopics are known before starting.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-08 09:12:28 +02:00
Cody CutrerandGitHub 64d97374ad [homekit] allow NumberItems for BatteryLowStatus (#13449)
* [homekit] allow NumberItems for BatteryLowStatus

use a lowThreshold metadata config to infer if it's low

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-10-03 12:13:39 +02:00
Cody CutrerandGitHub 7b8ae535e9 [jrubyscripting] clean up assignment of class objects (#13451)
pass the actual class objects through, and post-process in Ruby, to
avoid the rescue nil -- and by extension, any issues with visibility
into private objects from JRuby.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-09-30 22:47:53 +02:00
Cody CutrerandGitHub 517fe44b36 [mqtt.generic] fix range of RGB values (#13426)
Range is 0..255, not 0..250.

rgb -> hsv -> rgb still isn't perfect, but it's better. In
particular, I found this when using HSBType.BLUE in a test,
and it was coming out as 0,0,250 in RGB. It now comes out as
a proper 0,0,255.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-09-26 19:03:37 +02:00
Cody CutrerandGitHub e4fe6889d0 [homekit] allow group items of the correct type anywhere that type is needed (#13236)
this is a theme, and I've extracted a helper method and applied it to several
other locations as well

example, I have a double-sliding door, with two contact sensors
in the alarm system, defined as:

```
Group:Contact:AND(CLOSED,OPEN) DeckDoor_Contact "Deck Door [%s]" <door> (gExteriorDoors, gWarningVisibility_Contact, gDoor, lMainFloor, gInflux) { homekit="ContactSensor" [instance=2] }
Contact DeckNDoor_Contact "Deck Door North" <door> (gInflux, DeckDoor_Contact, gGreatContacts) { channel="dscalarm:zone:46c52f35:zone11:zone_status" }
Switch DeckNDoor_Tamper "Deck Door North Tamper [%s]" <warning> (gTamper, gWarningVisibility_Switch) { channel="dscalarm:zone:46c52f35:zone11:zone_tamper" }
Contact DeckSDoor_Contact "Deck Door South" <door> (gInflux, DeckDoor_Contact, gGreatContacts) { channel="dscalarm:zone:46c52f35:zone12:zone_status" }
Switch DeckSDoor_Tamper "Deck Door South Tamper [%s]" <warning> (gTamper, gWarningVisibility_Switch) { channel="dscalarm:zone:46c52f35:zone12:zone_tamper" }
```

This allows the Group:Contact to be used for the ContactSensor.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-09-26 18:58:59 +02:00
Cody CutrerandGitHub 8656ba501a [mqtt.homeassistant] support availability_templates (#13397)
Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-09-19 23:00:01 +02:00
Cody CutrerandGitHub a2b6dd77b7 [mqtt.homeassistant] sensors with a state_class are numeric (#13398)
see reference in code comment, but a measurement sensor is assumed to
be numeric, even if it doesn't have a unit

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-09-18 19:46:07 +02:00
Cody CutrerandGitHub 449d3518f6 [jrubyscripting] avoid polluting environment when auto-installing gems (#13328)
fixes https://github.com/boc-tothefuture/openhab-jruby/issues/634;
regression from https://github.com/openhab/openhab-addons/pull/13151

Signed-Off-By: Cody Cutrer <cody@cutrer.us>
2022-08-28 21:45:35 +02:00
Cody CutrerandGitHub c215dfede4 [jrubyscripting] document how to use Ruby in a transformation (#13286)
using the core ScriptTransformationService. See
https://github.com/openhab/openhab-addons/pull/13255 for prior
discussion on this.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-22 15:46:18 +02:00
Cody CutrerandGitHub e4c9a40d03 [homekit] allow multiple bridge instances to break the 150 limit (#13226)
fixes #11508, #12927

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-12 09:55:39 +02:00
Cody CutrerandGitHub f4fef5f6df [homekit] support actual booleans in metadata config (#13228)
as well as strings, too.

reduces confusion, if someone doesn't know it needed to be a string

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-08 20:50:42 +02:00
Cody CutrerandGitHub 581a04b72d [homekit] fix collecting characteristics that don't belong to a complex accessory (#13233)
given:

```
Group eThermostat { homekit="Thermostat" }
Number:Temperature Thermostat_AmbTemp (eThermostat) { homekit="CurrentTemperature" }
Number:Temperature Thermostat_SetTemp (eThermostat) { homekit="TargetTemperature" }

Group gThermostatZoneContacts
// in reality there are multiple thermostats and multiple of these groups,
// so that a rule on members of gThermostatZoneContacts can find the related
// thermostat to turn it off when a window is open
Group:Contact:OR(OPEN,CLOSED) gWindows (eThermostat, gThermostatZoneContacts)

Contact Window_Contact (gWindows) { homekit="ContactSensor" }
```

When constructing the Thermostat accessory for eThermostat, detects the
Window_Contact as a mandatory characteristic, because it's a base accessory
in a nested group. This leads to lots of warnings about the temperature
value of a contact item being out of range.

The fix is two-fold - first of all, there's no reason to search nested
groups for characteristics of a complex accessory. Second of all,
even if for some reason you were to nest an accessory in an accessory,
the nested accessory does not actually belong to the outer accessory,
so don't add it as a mandatory characteristic of the outer.

I suspect there's still one more bug, because AbstractHomekitAccessoryImpl.
getCharacteristic(HomekitCharacteristicType.CURRENT_TEMPERATURE) was
returning Window_Contact, which is only tagged as a ContactSensor. But
after fixing the above two bugs, it was no longer reproducible, and I
didn't continue digging.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-08 09:47:26 +02:00
Cody CutrerandGitHub a191c16f50 [homekit] fix window coverings based on groups of rollershutters (#13232)
it was getting the state as a decimal type, not a percent type, so
it was getting 1 instead of 100.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-08 09:43:54 +02:00
Cody CutrerandGitHub 70eb7dc511 [jrubyscripting] check if gems are installed before installing them (#13151)
* [jrubyscripting] check if gems are installed before installing them

this avoids unecessary downloads and overwrites, or even more importantly
errors if the GEM_HOME is not writable by the openhab user.

this also adds a configuration option for if you want to check for
updates every time configuration is applied (or openhab restarts). this
is useful if your OpenHAB system can't access the internet regularly.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-08-07 18:02:34 +02:00
Cody CutrerandGitHub d06cc6a60a [homekit] do unit conversion for min/max heating/cooling temps (#12450)
this is especially important if you use the same item for both
TargetTemperature and HeatingThresholdTemperature characteristics,
since the former was already doing unit conversion for min/max.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-03-09 08:53:01 +01:00
Cody CutrerandGitHub 923fb12b7d [mqtt.homie] handle exceptions parsing attributes (#12254)
fixes #10711

technically this code is in mqtt.generic, but it's only used by Homie.

in particular, if an incoming string doesn't match an enum, this will now
just ignore the value instead of raising an exception to be caught somewhere inside
of Hive MQTT, and eventually timing out and logging that mandatory topics weren't
received, instead of logging a pointer to the actual problem. this makes it so that
if there's a homie $datatype openhab doesn't understand (like duration), it will be
able to get to the point of just choosing a string channel

also did some minor debug logging cleanup for mqtt:
 * fixed a typo
 * when logging homie device name from the thing handler, use the config deviceid,
   since we likely don't have the attributes from MQTT yet

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-02-23 13:38:00 +01:00
Cody CutrerandGitHub 43cef812ae [mqtt.homie] remove unused constants in tests (#12242)
Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-02-08 21:01:25 +01:00
Cody CutrerandGitHub 8794ff860e [homekit] handle NULL/UNDEF for temperature characteristics (#12172)
recent regression from handling QuantityType

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-01-30 18:46:56 +01:00
Cody CutrerandGitHub d4fb20d529 [homekit] use quantity type conversions for temperature characteristics (#12083)
if an Item associated with a temperature characteristic has a QuantityType
(of dimension Temperature) as its state, regardless of current unit,
use that to convert to celsius instead of any other configuration.

Note that this is only for supply values to HomeKit; commands coming from
HomeKit will still send a DecimalType with units according to the HomeKit-wide
useFahrenheit configuration.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
2022-01-23 13:40:14 +01:00