Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Anbefalte innlegg

Skrevet

Det hender at min Neato Botvac Connected ikke returnerer til docken sin når den er ferdig. Jeg har derfor brukt det uoffisielle API-et pybotvac til å få Domoticz til å sende meg (og kona) pushvarsel via Pushbullet når dette skjer. Jeg bruker foreløpig IFTTT til å starte/stoppe roboten i Domoticz, men man kan også gjøre dette via pybotvac. Da er det bare å modifisere scriptet mitt litt.

 

Steg 1: Last ned pybotvac fra https://github.com/stianaske/pybotvac og pakk opp pybotvac-mappa her: \Domoticz\scripts\python\pybotvac

 

Steg 2: Lag et par virtuelle sensorer av typen "Text" via "Create Virtual Sensors" som vist her: https://www.domoticz.com/wiki/Hardware_Setup#Dummy_Hardware . Kall den ene for f.eks. Robot - Dockstatus og den andre for Robot - Status. Det er kun den første som brukes til å pushvarslingen.

 

Steg 3: Opprett robot.py (eller robot.pyw i Windows for å slippe å se vindu som popper opp når scriptet kjører) i \Domoticz\scripts\python\. 

import requests
from pybotvac import Robot

#Do this first to get Robot info:
#>>> from pybotvac import Account
#>>> # List all robots associated with account
#>>> for robot in Account('[email protected]', 'sample_password').robots:
#    print(robot)
#Name: my_robot_name, Serial: OPS01234-0123456789AB, Secret: 0123456789ABCDEF0123456789ABCDEF, Traits: ['maps']

robotSerial = 'OPS01234-0123456789AB' #Replace this with the serial of your robot
robotSecret = '0123456789ABCDEF0123456789ABCDEF' #Replace this with the secret of your robot
robotName = 'Neato' #Replace this with the name of your robot
hostname = 'http://10.0.0.100:8080'
username = '' #Username for Domoticz - leave blank if not used
password = '' #Password for Domoticz - leave blank if not used
idxDockStatus = '100' #IDX of a dummy text device created in Domoticz
idxSelectedFew = '101' #IDX of another dummy text device created in Domoticz
response = ''

try:
	robot = Robot(robotSerial, robotSecret, robotName)
except requests.exceptions.HTTPError as e:
	robot = ''

# Do the HTTP get request  
try:
	response = requests.get(hostname, verify=True)
except requests.exceptions.RequestException as e:
	print('Status: Unable to communicate with Domoticz')
	print(e)
	exit()
	
print('Status:', response.status_code, '-', 'Connection to Domoticz established')

#Function that updates dummy text devices in Domoticz
def updateValue(idx, value):
    url = hostname + '/json.htm?type=command&param=udevice&idx='
    url += idx + '&nvalue=0&svalue=' + value

    session = requests.Session()
    session.auth = (username, password)
    response = session.get(url)
    print('Status:', response.status_code, '-', 'Device', idx, 'updated in Domoticz')

#A few selected elements of interest
try:
	isCharging = robot.get_robot_state().json()['details']['isCharging']
	isDocked = robot.get_robot_state().json()['details']['isDocked']
	charge = robot.get_robot_state().json()['details']['charge']
	dockHasBeenSeen = robot.get_robot_state().json()['details']['dockHasBeenSeen']
#Ugly error handling a few exceptions in robot.py when Robot is not responding
except Exception:
    isCharging = "Error"
    isDocked = "Error"
    charge = "Error"
    dockHasBeenSeen = "Error"


print('Charging: ', isCharging)
print('Docked: ', isDocked)
print('Charge: ', charge)
print('Dock seen: ', dockHasBeenSeen)

#state = robot.get_robot_state().json()

#Example of state when vacuuming: {'version': 1, 'reqId': '1', 'result': 'ok', 'error': 'ui_alert_invalid', 'data': {}, 'state': 2, 'action': 1, 'cleaning': {'category': 2, 'mode': 2, 'modifier': 1, 'spotWidth': 0, 'spotHeight': 0}, 'details': {'isCharging': False, 'isDocked': False, 'isScheduleEnabled': True, 'dockHasBeenSeen': True, 'charge': 53}, 'availableCommands': {'start': False, 'stop': True, 'pause': True, 'resume': False, 'goToBase': False}, 'availableServices': {'houseCleaning': 'basic-1', 'spotCleaning': 'basic-1', 'manualCleaning': 'basic-1', 'schedule': 'basic-1', 'maps': 'basic-1'}, 'meta': {'modelName': 'BotVacConnected', 'firmware': '2.2.0'}}

#Concatenating a string of several elements as text for Domoticz device
selectedElements = 'Charging: ' + str(isCharging) + '; Charge: ' + str(charge) + '; Docked: ' + str(isDocked) + '; Dock seen: ' + str(dockHasBeenSeen)

updateValue(idxDockStatus, str(isDocked)) #Updating device in Domoticz
updateValue(idxSelectedFew, selectedElements) #Updating device in Domoticz

 

Her må man først få tak i sin egen robots serial, secret og navn. Dette får man ved å kjøre følgende:

from pybotvac import Account
for robot in Account('[email protected]', 'dittpassord').robots:
print(robot)

Dette legges inn i robot.py bak robotSerial, robotSecret og robotName. I tillegg må hostname endres til Domoticz sin IP og port og eventuelle login/pass til Domoticz legges inn. Til slutt må man skrive inn device ID på begge de to virtuelle sensorene som ble opprettet i steg 2. 

 

I robot.py-eksemplet over er det noen få utvalgte verdier jeg ville ha. isCharging viser om roboten lader eller ikke, isDocked viser om den er i docken, charge viser batteristatus i prosent og dockHasBeenSeen viser om den har sett docken. I robot.py-eksempelet har jeg lagt inn hvilke verdier som kan hentes ut bak "#Example of state when vacuuming:". Disse kan man også se dersom man kjører robot.get_robot_state().json(). 

 

Steg 4: Lag en knapp i Domoticz som sjekker dockstatus. Switches - Manual Light/Switch - Hardware: Dummy. Kall den f.eks. Robot - Sjekk dockstatus.

 

Steg 5: Opprett batch-filen pushbullet.bat i \Domoticz\scripts\batch\. Man kan egentlig bruke det innebygde varslingssystemet i Domoticz, men jeg laget en batch-fil for å kunne sende varsel til flere Pushbullet-kontoer.

 

@echo off
set api=lkuashfalkjfhaskljfhaskjlfshafkljashfkaj
set api2=mnsdbgkjlshsiutiuaysdajskhtjnasfmnasmfn
set title=%~1
set body=%~2
curl -u %api%: https://api.pushbullet.com/v2/pushes -d type=note -d title="%title%" -d body="%body%"
curl -u %api2%: https://api.pushbullet.com/v2/pushes -d type=note -d title="%title%" -d body="%body%"

Bytt ut api og api2 med API-keyen man får på pushbullet.com. Fjern linjen for api2 og den siste linjen dersom det kun skal sendes til én person.

 

Steg 6: Lag følgende dzVents-script i Domoticz under Setup - More options - Events. Scriptet kjører python-scriptet robot.py og sjekker den virtuelle sensoren Robot - Dockstatus om roboten er i docken. Deretter sender det pushvarsel dersom roboten ikke er i docken.

 

local switch = 'Robot - Sjekk dockstatus'
local text_sensor = 'Robot - Dockstatus'
local title = 'Robot dockstatus'
local robot_path = 'C:\\Program Files (x86)\\Domoticz\\scripts\\python\\robot.pyw'
local push_path = 'C:\\Program Files (x86)\\Domoticz\\scripts\\batch\\pushbullet.bat'

return {
	on = {
		devices = { switch, text_sensor },
	},

	execute = function(dz, dev)
        if  dev.name == switch and dev.state == 'On' then
            os.execute('"'..robot_path..'"')
            dev.switchOff()
            dz.log('Sjekker Robots dockstatus')
        elseif dev.name == text_sensor then
            if dz.devices(text_sensor).text == 'True' then
                dz.log('Robot er i docken')
            elseif dz.devices(text_sensor).text == 'False' then
            message = 'Robot er ikke i docken!'
            tit_msg = title..'"' .. ' "' ..message
            combined = '""'..push_path..'" "'..tit_msg..'""'
            dz.log('Robot er ikke i docken')
            os.execute(combined)
            else 
            message = 'Oppnår ikke kontakt med Robot!'
            tit_msg = title..'"' .. ' "' ..message
            combined = '""'..push_path..'" "'..tit_msg..'""'
            dz.log('Oppnår ikke kontakt med Robot')
            os.execute(combined)
        end
        end
    end
}

Pass på å endre variablene i starten til å passe det du selv har laget. 

 

Steg 7: Trykk på Robot - Sjekk dockstatus i Domoticz og de to virtuelle sensorene vil oppdateres. Du vil også få varsel om roboten ikke svarer eller ikke er i docken. Deretter legger du inn på knappen under TIMERS at den skal kjøres hver dag f.eks. klokka 20:00. 

 

Scriptet henter som sagt bare ut info fra roboten (via get_robot_state()) fordi jeg bruker IFTTT ellers, men kan med små tilpasninger også brukes til å styre den. På githuben til pybotvac (https://github.com/stianaske/pybotvac) står det noen kommandoer som kan brukes: start_cleaning(), pause_cleaning(), stop_cleaning(), send_to_base(), enable_schedule(), disable_schedule(), get_schedule().

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.