So, I decided to buy a venta evaporative humidifier (AH550) which has wifi support. Unfortunately there is no homeassistant integration for this, so I needed to find a workaround solution with pyscript.
What to do to get there:
- download the venta home app to your smartphone (you need this to initially connect your humidifier to your wifi)
- create an account (sigh)
- in the app connect your humidifier to your wlan
- delete the account
- delete the venta home app
- in homeassistant install pyscript integration via hacs
- create a pyscript folder in your config
- create the necessary sensors input_booleans, input_numbers, input_selects in homeassistant
- restart homeassistant
- add a file “requirements.txt” in your pyscript folder
- add the text “venta_protocol_v3_device” in your requirements txt
- create a python file, I called mine “venta_humidifier.py”
- add the below code into the python file and voila all services and data available in local api can be used in homeassistant through automations
from venta_protocol_v3_device import Venta_Protocol_v3_Device
import json
@service
def venta_setfanspeed(myip=None,mytarget=None):
"""yaml
name: Sets the Fan Speed of the Venta device
description: Sets the Fan Speed of the Venta device
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
mytarget:
description: provide fan speed between 1 and 3
example: 1
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.setFanSpeed, target=mytarget)
@service
def venta_setautomatic(myip=None,mytarget=None):
"""yaml
name: Enables / disables the Automatic mode of the Venta device
description: Enables / disables the Automatic mode of the Venta device
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
mytarget:
description: set if True or False
example: True
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.setAutomatic, target=mytarget)
@service
def venta_setsleepmode(myip=None,mytarget=None):
"""yaml
name: Enables / disables the Sleep mode of the Venta device
description: Enables / disables the Sleep mode of the Venta device
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
mytarget:
description: set if True or False
example: True
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.setSleepMode, target=mytarget)
@service
def venta_setpower(myip=None,mytarget=None):
"""yaml
name: Enables / disables the the Venta device
description: Enables / disables the the Venta device
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
mytarget:
description: set if True or False
example: True
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.setPower, target=mytarget)
@service
def venta_settargethumidity(myip=None,mytarget=None):
"""yaml
name: Sets the target humidity of the Venta device
description: Sets the target humidity of the Venta device
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
mytarget:
description: sets target humidity in 5% steps
example: 55
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.setTargetHum, target=mytarget)
@service
def venta_getstatus(myip=None):
"""yaml
name: Contacts the Venta device and populates / updates the class properties
description: Contacts the Venta device and populates / updates the class properties
fields:
myip:
description: provide IP of venta humidifier
example: 192.168.40.108
required: true
"""
d = Venta_Protocol_v3_Device(myip)
mytask = task.executor(d.getStatus)
data= task.executor(d.toJSON)
x = json.loads(data)
service.call("input_number", "set_value", blocking=True, entity_id="input_number.venta_temperature", value=round(x['Temperature'],2))
service.call("input_number", "set_value", blocking=True, entity_id="input_number.venta_humidity", value=round(x['Humidity'],2))
service.call("input_number", "set_value", blocking=True, entity_id="input_number.venta_targethumidity", value=round(x['TargetHum'],0))
service.call("input_number", "set_value", blocking=True, entity_id="input_number.venta_daystoservice", value=round(x['DaysToService'],0))
if x['SleepMode'] == True:
service.call("input_boolean", "turn_on", blocking=True, entity_id="input_boolean.venta_sleepmode")
else:
service.call("input_boolean", "turn_off", blocking=True, entity_id="input_boolean.venta_sleepmode")
if x['Power'] == True:
service.call("input_boolean", "turn_on", blocking=True, entity_id="input_boolean.venta_power")
else:
service.call("input_boolean", "turn_off", blocking=True, entity_id="input_boolean.venta_power")
if x['Warnings'] == True:
service.call("input_boolean", "turn_on", blocking=True, entity_id="input_boolean.venta_lowwaterwarning")
else:
service.call("input_boolean", "turn_off", blocking=True, entity_id="input_boolean.venta_lowwaterwarning")
if x['Automatic'] == True:
service.call("input_boolean", "turn_on", blocking=True, entity_id="input_boolean.venta_automatic")
else:
service.call("input_boolean", "turn_off", blocking=True, entity_id="input_boolean.venta_automatic")
if x['FanSpeed'] == 1:
service.call("input_select", "select_option", blocking=True, entity_id="input_select.venta_fanspeed", option="low")
elif x['FanSpeed'] == 2:
service.call("input_select", "select_option", blocking=True, entity_id="input_select.venta_fanspeed", option="medium")
elif x['FanSpeed'] == 3:
service.call("input_select", "select_option", blocking=True, entity_id="input_select.venta_fanspeed", option="high")
Damn, you put in a lot of effort! Personally I didn’t want to spend so much money on the super complicated one and bought the normal one and put a smart plug on it. With almost no effort it tells me when it needs refilling and it turns on and off based on the humidity in my room.
:) understand, I went this way to control fan speed actually because the humidifier is in my bedroom - so that when I am in the room (motion sensor), fan speed goes to minimum and when I leave it goes to medium and high depending on targeted humidity difference