Time To Share Config: Venta Humidifier with pyscript
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