Windy/Midea AC unit control

I am very new to OpenHab and I am starting with a device that doesn’t appear to be supported as yet. I am a developer by profession so I hope to be able to get it to work anyway. The device is a Windy Inverter AC which I have come to realize just a rebranded Midea I believe. I have the Nethome Plus app controlling the AC and now I want to start my smarthome journey by using OpenHAB to do everything the app can do and more.

Can someone point me in the right direction to get started with creating this link please? Are there any existing bindings that will help? What key things do I need to know that stumped you when you first tried to setup something that had no support?

I am using openHAB 4.2.1 hosted on a Raspberry Pi 4. Any help would be much appreciated.

there is a midea-binding which is not part of the official release yet:

In my case (midea ac) it works very reliable.
You just have to copy the jar into the add-ons folder and can create the midea thing

Hi,
Definitely try @apella12 version last post in the link above he has taken the binding alot closer to being something that could become an official binding so I am quite sure he would welcome any developer by profession help or assistance. I have added the link to his github space below also so you can review as well.
GitHub - apella12/openhab-addons at midea2

Awesome, many thanks for this information. I am now in the process of setting up ssh connections to allow me to copy the jar (this is the best way to copy jar’s right, or is there an addon for that?). I will definitely be interested in helping in any way I can.

So the easiest way to copy the jar seems to be over ftp.
This Thing looks great. I have only tested a few so far but really great work. You guys have saved me so much time. I will continue to test it and see how best I can provide any help or feedback.

It depends what installation you are using and from where you are connecting

  • scp will probably always work
  • As I need my phone and the PC I use the smb-server. It can be easily installed with openhabian-config

The folder to copy the jar to is /usr/share/openhab/addons/
btw: I had some trouble with the target-temperature. Due to the delay the new target always switched back to the current one. I solved it by connecting two items: One for displaying and one for setting (with profile follow).

1 Like

Thanks @justaoldman for shout out. The August 1 jar should have all the functionality to date. Lately, I have been working on creating unit tests, cleaning out WIP testing code and adding JavaDocs as required by the OH developer guidelines. I’m testing a version to make sure I didn’t screw up something along the way.

I have no formal Java training, this is a retirement hobby, so suggestions are welcome. To be honest, I could not have gotten this far without the excellent starting code from @JacekDob and additions by @justaoldman. The entire discovery process and encryption/decryption code is basically unchanged as are most java classes. I have added some functionality, corrected a few things and changed the connection process to allow for less frequent polling. Besides that, my main effort has been to clear all the compilation rules that OH didn’t like and add tests and documentation.

Rapidly changing through several temperatures can be problematic and needs to be avoided at this point. It takes about 2 seconds for a command to complete. I found the slider card is a good option. It can be configured to set the command interval (2 seconds+) and to only send the command on release. Also setting a temperature in a rule (say using cron) should not be a problem. The stepper card can really go haywire with rapid changes (although I think this is a degrees F issue only). I’ve opened an issue on that.

I haven’t experienced the temperature reverting I’d be curious how you are setting the temp (widget or rule), what unit (F or C), the poll interval and the autoupdate setting.

Thanks! This truly is easier than ftp and it looks like it is enabled by default in the version I am using. Got it to work on my phone and pc in seconds.

Experience is the best teacher, looks like you have a lot. I am looking forward to delving into the code once I get a chance. So far only three things stood out to me.

  1. The outside temperature is not available when my AC is off, as such it shows 102.5 degrees C (while the inside is at 30 C) which we could just replace with OFF or something whenever those temperature ranges are read.
  2. I added the items for one AC and then changed the temperature unit from F to C, this lead to a lot of decimal places showing up. Probably just need to round out after the conversion.
  3. And finally the changing of the temperature unit, even though it is just two options, a dropdown list would be a better user experience so as to know what the current setting is.

    All in all, really great stuff here.

Thanks for the first look. I understand your thoughts. One limitation is the OH core as the channels need to match the items (String, Switch, Number, etc).
3) The temperature unit could be changed to a string from a switch easily, my only thought it is (a least for me) a “set it” and “forget it”, but I’m open to it.
2) Adding metadata to the item as state description should clear that up. Something like %.1f °C. The device only uses °C in calculations and the response is from reading a byte, so not sure how all those 0’s occur. The return is a float to handle the 0.5 marker, so may that’s it.

  1. Handling outside temp is going to be tricky. What is happening in your case is the device is returning 0xFF. The formula used from the byte is (255 - 50)/2. We could catch the 255, but the channel still expects (needs) a number:temperature, not a string. I seem to recall that some units return 0x00 for outside temp when off and that’s also a problem. There are also graphing issues if it is turned into a string channel. My unit continues to report outside temperature while off just on a reduced frequency. Anyway something to think about how to address when you look at the code.

Again thanks

You are welcome! and thank you for the work you have put in.

3… My user experience was that I added the items and saw that they were in °F, then I saw the toggle for Temperature Unit and the noob in me thought that would automatically change everything to °C. But of course it changed the LED display value on the AC itself, as it should. I then changed it back and went and found the right way to change the units for each item individually. It really is a set it and forget it thing but noobs like me are out there.
2… You are right, the default metadata was %d %unit% so I changed that to %.1f %unit% and it works better.
1… What do you think of this approach: Add a switch option to Disable Outside Readings when powered off, that way the user can choose not to use the feature if they have an AC like yours, then if this is set to true and the power is off we set the reading value to 0 or if possible, we set the final string representation of the value to OFF.

And lastly, not sure if this is too off topic or if I should ask in another thread but I am not seeing any graphs. I see persistence files in the rrd4j folder but whenever I select Analyse I don’t see any plots. I am also trying to figure out how to change the persistence to mapdb but I haven’t figured that out yet either.

Again, great work, I will have to set up a new Java environment soon so I can do more than just suggest stuff.

That will depend on how you have your widget setup and item configured.
Foe example this widget from the other midea post that used the modifed daiken widget will let you define what item you want to graph. based on what you set in props

uid: midea2
tags: []
props:
  parameters:
    - description: Location (room) or device name
      label: Title
      name: title
      required: false
      type: TEXT
    - context: item
      description: Item for power channel
      label: Power
      name: itemPower
      required: false
      type: TEXT
    - context: item
      description: Item for thing to be online
      label: Online item
      name: itemOnline
      required: false
      type: TEXT
    - context: item
      description: Item for analyze button
      label: Analyze
      name: itemAnalyze
      required: false
      type: TEXT
      multiple: true
    - context: item
      description: Item for indoor temperature channel
      label: Indoor temperature
      name: itemIndoorTemp
      required: false
      type: TEXT
    - context: item
      description: Item for outdoor temperature channel
      label: Outdoor temperature
      name: itemOutdoorTemp
      required: false
      type: TEXT
    - context: item
      description: Item for target temperature channel
      label: Target temperature
      name: itemTargetTemp
      required: false
      type: TEXT
    - description: Set minimum target temperature (default = 0)
      label: Minimum Temperature
      name: MinimumTemperature
      required: false
      type: INTEGER
    - description: Set maximum target temperature (default = 100)
      label: Maximum Temperature
      name: MaximumTemperature
      required: false
      type: INTEGER
    - description: Set Target Temperature Stepsize (default = 1)
      label: Target Temperature Stepsize
      name: TemperatureStepsize
      required: false
      type: DECIMAL
    - context: item
      description: Item for operation mode channel
      label: Operation mode
      name: itemMode
      required: false
      type: TEXT
    - context: item
      description: Item for fan speed channel
      label: Fan speed
      name: itemFanSpeed
      required: false
      type: TEXT
    - context: item
      description: Item for swing channel
      label: Swing mode
      name: itemSwing
      required: false
      type: TEXT
    - context: item
      description: Item for temperature display unit channel
      label: Temperature Unit
      name: itemTempUnitDisplay
      required: false
      type: TEXT
    - context: item
      description: Item for TURBO MODE
      label: Turbo Mode
      name: itemTurboMode
      required: false
      type: TEXT
    - description: Hide C/F Button
      label: Hide C/F Display Button
      name: hideCFButton
      required: false
      type: BOOLEAN
    - description: Hide timer button and options
      label: Hide Timer Function
      name: hideTimerFunction
      required: false
      type: BOOLEAN
    - description: Hide chart button
      label: Hide chart Function
      name: hideChartFunction
      required: false
      type: BOOLEAN
    - context: item
      description: Switch item for timer
      label: Switch Timer ON/OFF
      name: itemTimerSwitch
      required: false
      type: TEXT
      advanced: true
    - context: item
      description: Item for timer duration
      label: Timer Duration
      name: itemTimerDuration
      required: false
      type: TEXT
      advanced: true
    - description: Timer minimum duration
      label: Timer minimum
      name: TimerMinimum
      required: false
      type: DECIMAL
      advanced: true
    - description: Timer maximum duration
      label: Timer maximum
      name: TimerMaximum
      required: false
      type: DECIMAL
      advanced: true
    - description: Timer step
      label: Timer step
      name: TimerStep
      required: false
      type: DECIMAL
      advanced: true
    - description: Timer scale steps
      label: Timer scale steps
      name: TimerScaleSteps
      required: false
      type: DECIMAL
      advanced: true
    - description: Timer scale sub steps
      label: Timer scale sub steps
      name: TimerScaleSubSteps
      required: false
      type: DECIMAL
      advanced: true
    - description: Hide solarplant power
      label: Hide Solarplant AC power measurement
      name: hideSolarplant
      required: false
      type: BOOLEAN
    - context: item
      description: AC Power item for solarplant
      label: Solarplant AC Power
      name: itemSolarplantACPower
      required: false
      type: TEXT
      advanced: true
  parameterGroups: []
timestamp: Dec 21, 2023, 2:29:16 AM
component: f7-card
config:
  class:
    - no-padding
  outline: true
  textColor: '=(items[props.itemOnline].state == "Offline") ? "red" : "blue"'
  title: =props.title
slots:
  default:
    - component: f7-row
      config:
        class:
          - margin-top-half
          - margin-left-half
          - margin-right-half
          - margin-bottom
      slots:
        default:
          - component: f7-col
            config:
              large: "33"
              width: "50"
            slots:
              default:
                - component: f7-segmented
                  config:
                    class:
                      - segmented-strong
                    style:
                      --f7-button-border-radius: 4px
                      --f7-button-fill-hover-bg-color: var(--f7-theme-color)
                      --f7-button-padding-horizontal: 0px
                      --f7-button-padding-vertical: 0px
                      --f7-segmented-strong-between-buttons: 5px
                      --f7-segmented-strong-bg-color: transparent
                      --f7-segmented-strong-button-font-weight: 300
                      --f7-segmented-strong-button-hover-bg-color: rgba(var(--f7-theme-color-rgb), 0.07)
                      --f7-segmented-strong-padding: 0px
                  slots:
                    default:
                      - component: oh-button
                        config:
                          action: toggle
                          actionCommand: ON
                          actionCommandAlt: OFF
                          actionItem: =props.itemPower
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: "=(items[props.itemPower].state === 'ON') ? true : false"
                          icon-f7: power
                          iconSize: 19px
                          outline: true
                          style:
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            --f7-button-border-width: 1px
                            font-size: 8px
                            height: auto
                          text: ON/OFF
                      - component: oh-button
                        config:
                          action: toggle
                          actionCommand: ON
                          actionCommandAlt: OFF
                          actionItem: =props.itemTimerSwitch
                          class:
                            - display-flex
                            - flex-direction-column
                            - padding-top-half
                          fill: "=(items.ac_timer_on_off.state === 'ON') ? true : false"
                          iconF7: timer
                          iconSize: 19px
                          outline: false
                          style:
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            --f7-button-border-width: 1px
                            font-size: 8px
                            height: auto
                          text: TIMER
                          visible: =!props.hideTimerFunction
                      - component: oh-button
                        config:
                          action: analyzer
                          actionAnalyzerItems: =props.itemAnalyze
                          class:
                            - display-flex
                            - flex-direction-column
                            - padding-top-half
                          iconF7: chart_bar_alt_fill
                          iconSize: 19px
                          outline: false
                          style:
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            --f7-button-border-width: 1px
                            font-size: 8px
                            height: auto
                          text: GRAPH
                          visible: =!props.hideChartFunction
                      - component: oh-button
                        config:
                          action: toggle
                          actionCommand: ON
                          actionCommandAlt: OFF
                          actionItem: =props.itemTempUnitDisplay
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          fill: "=(items[props.itemTempUnitDisplay].state === 'ON') ? true : false"
                          icon-f7: temperature
                          iconSize: 19px
                          outline: true
                          style:
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            --f7-button-border-width: 1px
                            font-size: 8px
                            height: auto
                          text: C/F
                          visible: =!props.hideCFButton
          - component: f7-col
            config:
              width: "33"
            slots:
              default:
                - component: f7-row
                  config:
                    class:
                      - padding-right-half
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-right
                                color: var(--f7-theme-color)
                                f7: house
                                size: 15
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                style:
                                  font-size: 12px
                                  overflow: hidden
                                  text-overflow: elipsis
                                  white-space: nowrap
                                text: =items[props.itemIndoorTemp].state
                - component: f7-row
                  config:
                    class:
                      - padding-right-half
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-right
                                color: var(--f7-theme-color)
                                f7: tree
                                size: 15
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                style:
                                  font-size: 12px
                                  overflow: hidden
                                  text-overflow: elipsis
                                  white-space: nowrap
                                text: =items[props.itemOutdoorTemp].state
                - component: f7-row
                  config:
                    class:
                      - padding-right-half
                    visible: =!props.hideSolarplant
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-right
                                color: var(--f7-theme-color)
                                f7: sun_max
                                size: 15
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                style:
                                  font-size: 12px
                                  overflow: hidden
                                  text-overflow: elipsis
                                  white-space: nowrap
                                text: =items[props.itemSolarplantACPower].state
    - component: f7-row
      config:
        class:
          - justify-content-center
      slots:
        default:
          - component: oh-knob
            config:
              item: =props.itemTargetTemp
              max: =props.MaximumTemperature
              min: =props.MinimumTemperature
              primaryColor: "=(items[props.itemPower].state === 'ON') ? '#e64a19' : 'grey'"
              releaseOnly: true
              responsive: false
              secondaryColor: var(--f7-card-outline-border-color)
              size: 150
              stepSize: =props.TemperatureStepsize
              strokeWidth: "12"
    - component: f7-segmented
      config:
        class:
          - margin-left-half
          - margin-right-half
          - margin-top
          - margin-bottom-half
        style:
          --f7-button-border-radius: 4px
          --f7-button-font-size: 8px
          --f7-button-font-weight: 300
          --f7-button-outline-border-width: 1px
          --f7-button-padding-horizontal: 0px
          --f7-button-padding-vertical: 0px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
        visible: true
      slots:
        default:
          - component: oh-repeater
            config:
              for: modeRow
              fragment: true
              in:
                - command: AUTO
                  icon: arrow_2_squarepath
                  text: AUTO
                - command: COOL
                  icon: thermometer_snowflake
                  text: COOL
                - command: HEAT
                  icon: thermometer_sun
                  text: HEAT
                - command: DRY
                  icon: drop_fill
                  text: DRY
                - command: FAN_ONLY
                  icon: wind
                  text: FAN ONLY
              sourceType: array
            slots:
              default:
                - component: oh-button
                  config:
                    action: command
                    actionCommand: =loop.modeRow.command
                    actionItem: =props.itemMode
                    class:
                      - display-flex
                      - flex-direction-column
                      - padding-top-half
                    fill: "=(items[props.itemPower].state === 'ON')&&(items[props.itemMode].state === loop.modeRow.command) ? true : false"
                    iconF7: =loop.modeRow.icon
                    iconSize: 15px
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
                    text: =loop.modeRow.text
          - component: oh-button
            config:
              action: toggle
              actionCommand: ON
              actionCommandAlt: OFF
              actionItem: =props.itemTurboMode
              class:
                - padding-top-half
                - display-flex
                - flex-direction-column
              fill: "=(items[props.itemPower].state === 'ON')&&(items[props.itemTurboMode].state === 'ON') ? true : false"
              icon-f7: snow
              iconSize: 19px
              outline: true
              style:
                --f7-button-border-color: var(--f7-card-outline-border-color)
                --f7-button-border-width: 1px
                font-size: 8px
                height: auto
              text: TURBO
          - component: oh-button
            config:
              action: variable
              actionVariable: options
              actionVariableValue: "=(items[props.itemPower].state === 'ON') && vars.options || vars.options === undefined ? false : true"
              class:
                - display-flex
                - flex-direction-column
              fill: "=vars.options || vars.options === undefined ? false : true"
              iconF7: ellipsis_vertical
              iconSize: 15px
              outline: true
              style:
                --f7-button-border-color: var(--f7-card-outline-border-color)
                height: auto
                width: 50%
    - component: f7-segmented
      config:
        class:
          - margin-left-half
          - margin-right-half
          - margin-top
          - margin-bottom-half
        style:
          --f7-button-border-radius: 4px
          --f7-button-font-size: 8px
          --f7-button-font-weight: 300
          --f7-button-outline-border-width: 1px
          --f7-button-padding-horizontal: 0px
          --f7-button-padding-vertical: 0px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
        visible: =vars.options === false
      slots:
        default:
          - component: oh-repeater
            config:
              for: optionsRow
              fragment: true
              in:
                - icon: wind ellipsis_vertical
                  option: fanspeed
                - icon: move ellipsis_vertical
                  option: swing
              sourceType: array
            slots:
              default:
                - component: oh-button
                  config:
                    action: variable
                    actionVariable: =loop.optionsRow.option
                    actionVariableValue: "=vars[loop.optionsRow.option] || vars[loop.optionsRow.option] === undefined ? false : true"
                    class:
                      - display-flex
                      - flex-direction-column
                    fill: "=vars[loop.optionsRow.option] || vars[loop.optionsRow.option] === undefined ? false : true"
                    iconF7: =loop.optionsRow.icon
                    iconSize: 15px
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
          - component: oh-button
            config:
              action: variable
              actionVariable: timer_menu
              actionVariableValue: "=vars.timer_menu || vars.timer_menu === undefined ? false : true"
              fill: "=vars.timer_menu || vars.timer_menu === undefined ? false : true"
              iconF7: timer ellipsis_vertical
              iconSize: 15px
              outline: true
              style:
                --f7-button-border-color: var(--f7-card-outline-border-color)
              visible: =!props.hideTimerFunction
    - component: f7-segmented
      config:
        class:
          - margin-left-half
          - margin-right-half
          - margin-top
          - margin-bottom-half
        style:
          --f7-button-border-radius: 4px
          --f7-button-font-weight: 300
          --f7-button-outline-border-width: 1px
          --f7-button-padding-horizontal: 0px
          --f7-button-padding-vertical: 0px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
        visible: "=vars.fanspeed === false && vars.options === false ? true : false"
      slots:
        default:
          - component: oh-repeater
            config:
              for: fanspeedRow
              fragment: true
              in:
                - command: AUTO
                  icon: arrow_2_squarepath
                - command: LOW
                  text: LOW
                - command: MEDIUM
                  text: MEDIUM
                - command: HIGH
                  text: HIGH
                - command: UNKNOWN
                  text: FULL
              sourceType: array
            slots:
              default:
                - component: oh-button
                  config:
                    action: command
                    actionCommand: =loop.fanspeedRow.command
                    actionItem: =props.itemFanSpeed
                    class:
                      - display-flex
                      - flex-direction-column
                    fill: "=(items[props.itemPower].state === 'ON') && (items[props.itemFanSpeed].state === loop.fanspeedRow.command) ? true : false"
                    iconF7: =loop.fanspeedRow.icon
                    iconSize: 15px
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
                    text: =loop.fanspeedRow.text
    - component: f7-segmented
      config:
        class:
          - margin-left-half
          - margin-right-half
          - margin-top
          - margin-bottom-half
        style:
          --f7-button-border-radius: 4px
          --f7-button-font-weight: 300
          --f7-button-outline-border-width: 1px
          --f7-button-padding-horizontal: 0px
          --f7-button-padding-vertical: 0px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
        visible: "=vars.swing === false && vars.options === false ? true : false"
      slots:
        default:
          - component: oh-repeater
            config:
              for: swingRow
              fragment: true
              in:
                - command: OFF
                  text: OFF
                - command: VERTICAL
                  icon: resize_v
                - command: HORIZONTAL
                  icon: resize_h
                - command: BOTH
                  icon: view_3d
                - command: UNKNOWN
                  icon: resize_flow
              sourceType: array
            slots:
              default:
                - component: oh-button
                  config:
                    action: command
                    actionCommand: =loop.swingRow.command
                    actionItem: =props.itemSwing
                    class:
                      - display-flex
                      - flex-direction-column
                    fill: "=(items[props.itemPower].state === 'ON') && (items[props.itemSwing].state === loop.swingRow.command) ? true : false"
                    iconF7: =loop.swingRow.icon
                    iconSize: 15px
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
                    text: =loop.swingRow.text
    - component: f7-row
      config:
        class:
          - margin-left-half
          - margin-right-half
          - margin-bottom-half
        visible: "=vars.timer_menu === false && vars.options === false && !props.hideTimerFunction === true ? true : false"
      slots:
        default:
          - component: f7-col
            slots:
              default:
                - component: oh-slider-card
                  config:
                    item: =props.itemTimerDuration
                    label: true
                    max: =props.TimerMaximum
                    min: =props.TimerMinimum
                    outline: true
                    scale: true
                    scaleSteps: =props.TimerScaleSteps
                    scaleSubSteps: =props.TimerScaleSubSteps
                    step: =props.TimerStep
                    unit: min

as you see here in this section.

 - context: item
      description: Item for analyze button
      label: Analyze
      name: itemAnalyze
      required: false
      type: TEXT
      multiple: true

and this section

 - component: oh-button
                        config:
                          action: analyzer
                          actionAnalyzerItems: =props.itemAnalyze
                          class:
                            - display-flex
                            - flex-direction-column
                            - padding-top-half
                          iconF7: chart_bar_alt_fill
                          iconSize: 19px
                          outline: false
                          style:
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            --f7-button-border-width: 1px
                            font-size: 8px
                            height: auto
                          text: GRAPH
                          visible: =!props.hideChartFunction

This looks intimidating and fun at the same time. I will take some time to go through and post a new topic if needs be. Thank you very much!

It depends on your persistence method. If rrd4j is your standard (settings - persistence - general…) then you should be able to see the graph after clicking “Analyze”

Ok, so it wasn’t my default but after changing it to my default I was able to see the plots. Now I just need to figure out how to move it to mapdb because according to the docs rrd4j averages old data: “So while you might store a sample value every minute for the last 8 hours, you might store the average per day for the last year”. I don’t want to lose any data.

Turns out it wasn’t intimidating at all. I got it to work. OpenHAB is way easier to use than I expected.

When starting OH for the first time there should have been a menu about regional settings so that all your items are created with the desired unit. Obviously you found how to change, but I believe you can still set the default on the Settings>Regional>Advanced (metric/US at bottom). I’ll change the verbiage on the channel a bit to make clearer.

This is the easiest. I’m in the middle of something else right now, so can’t do right away.

mapdb only stores the last value (bad for graphs!). It is good for restore on startup as it can handle both numbers and strings. rrd4j only does numbers and ON/OFF. The averaging is just to avoid an ever increasing database.

Allow me to offer an alternative:
Esphome has a firmware for midea or midea compatible ac units wifi dongles (esp8266s).
You can buy them here:

Much cheaper than the official ones I’ve been looking at. And we have the esphome binding already in the store so no need to move around jars.

Changing this setting fixed the issue where I was seeing many zeros for the different readings. That’s great!

No problem at all. Hopefully I will get to start my openHAB dev journey soon.

I get it, it looks like I have to use it but I hope there is a way to set the maximum size or something that will allow me to have control over when it starts summarizing stuff.

This looks really good, and I love the ability to add other peripherals to it as well. However, I have already invested in the system recommended by the suppliers of my AC. But hopefully your link will help other persons.