BMW i3 v chytrém domě
V tomto článku ukážeme jak načítat informace o BMW i3 do tabletu pomocí OpenHAB. Samozřejmě lze použít aplikace MyBMW ale pomocí API máme možnost vlastního vzhledu, přehledných informací na jedné stránce a hlavně nám to nikdo dookola stále nemění. Lze také posílát přes API podporované povely jako otevřít, zavřít, spustit klimatizaci atd. a hlavně je možné tyto akce provázat s chytrým domem.
Příklady použití:
- automatické uzamknutí auta v 22:00 pokud jsme doma
- hlasové povely přes Alexu - klimatizace, otevření
- alarm na zahradě - zablikání světel v případě pohybu na zahradě atd.
Hardware
Pi-Home - pokud nemáte, viz sekci Jak na to
Ideálně tablet v centrální místnosti případně také Alexu dle potřeby
Software
OpenHAB 4
Postup:
1) Nainstalujeme MyBMW binding v OpenHAB
Vytvoříme bridge Things - > MyBMW -> MyBMWAccount
Edit: V nové verzi máte u Account ještě Captcha token. Stačí si rozliknout odkaz:
https://bimmer-connected.readthedocs.io/en/stable/captcha/rest_of_world.html
potvrdit, že nejste robot a vygenerovat token. Token zkopírujte a vložte do požadováného pole v OpenHAB. Uložte.
Nově přidaný thing BMWAccount by měl zezelenat na stav "Online".
Pak přidáme auto přes Things - > MyBMW -> Electric vehicle. Nezapomeňte zadat reálný VIN vašeho vozu.
Po rozkliknutí thing přidaného auta by měl stav opět zezelenat na "Online". Rozklikněte si Channels. Z nich jsou pak vytvořit Items. Né všechny Channels jsou podporovány, můžete vyzkoušet vytvořit všechny a pak zjistit co je aktivní. Pokud Vám stačí to co máme v našem dashboardu, můžete Items přidat i najednou z textu níže. (Developer Tools -> Add Items from Textual Definition)
Group CarBMW "BMW" (bmw) ["Equipment"]
Image BMWRenderedVehicleImage "BMW Image" (CarBMW) ["Point"] { channel="mybmw:bev:bmwaccount:bmwi3:image#png" }
Number BMWBatteryChargeLevel "Battery Charge Level [%.0f%]" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:range#soc"}
Number BMWElectricRange "Electric Range" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:range#electric"}
String BMWPlugConnectionStatus "Plug Connection Status" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#plug-connection"}
String BMWChargingStatus "Charging Status" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#charge"}
Number BMWChargingRemainingTime "Remaining Charging Time [%.0f min]" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#charge-remaining"}
String BMWDoorsStatus "Overall Door Status" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#doors"}
String BMWWindowsStatus "Overall Window Status" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#windows"}
String BMWDoorsLocked "Doors Locked" (CarBMW) ["Point"] {channel="mybmw:bev:bmwaccount:bmwi3:status#lock"}
Switch BMWLock "Lock" (CarBMW) {expire="1s,command=OFF"}
Switch BMWUnlock "Unlock" (CarBMW) {expire="1s,command=OFF"}
Switch BMWLights "Lights" (CarBMW) {expire="1s,command=OFF"}
Switch BMWClimateStart "Climate Start" (CarBMW) {expire="1s,command=OFF"}
Switch BMWLights "Lights" (CarBMW) {expire="1s,command=OFF"}
Switch BMWClimateStart "Climate Start" (CarBMW) {expire="1s,command=OFF"}
Zkopírujte výše uvedené Items. Pozor na název Channel, pokus jste měnili ID pro thing BMWAccount a BMWi3 tak upravte dle potřeby.
Teď už můžete vyrobit Dashboard. V Settings -> Pages si založte novou stránku a naskládejte pole. Pokud chcete ušetřit čas a líbí se vám náš dashboard, přejděte na záložku Code a zkopírujte si následující kód níže:
config:
label: Auto
order: ""
sidebar: true
blocks:
- component: oh-block
config: {}
slots:
default:
- component: oh-grid-cells
config: {}
slots:
default:
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
action: navigate
actionPage: page:overview
label: Zpět na hlavní stránku
- component: oh-grid-row
config: {}
slots:
default: []
- component: oh-block
config: {}
slots:
default:
- component: oh-grid-row
config: {}
slots:
default:
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-gauge-card
config:
borderColor: "#2196f3"
borderWidth: "20"
item: BMWBatteryChargeLevel
max: 100
min: 0
size: 200
type: semicircle
valueFontSize: "30"
valueTextColor: "#2196f3"
title: Aktuální stav baterie
action: analyzer
actionAnalyzerItems:
- BMWBatteryChargeLevel
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-image-card
config:
item: BMWRenderedVehicleImage
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-list-card
config: {}
slots:
default:
- component: oh-label-item
config:
item: BMWDoorsStatus
title: Dveře
- component: oh-label-item
config:
item: BMWWindowsStatus
title: Okna
- component: oh-label-item
config:
item: BMWDoorsLocked
title: Stav
- component: oh-label-item
config:
item: BMW_i3_Check_Control
title: Chyby
- component: oh-label-item
config:
item: BMW_i3_Total_Distance_Driven
title: Najeto celkem
action: analyzer
actionAnalyzerItems:
- BMW_i3_Total_Distance_Driven
- component: oh-label-item
config:
item: BMW_i3_Address
title: Aktuální poloha
- component: oh-block
config: {}
slots:
default:
- component: oh-grid-row
config: {}
slots:
default:
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
item: BMWElectricRange
label: =items.BMWElectricRange.displayState
title: Aktuální dojezd
trendItem: BMWElectricRange
action: analyzer
actionAnalyzerItems:
- BMWElectricRange
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
action: command
actionItem: BMWLock
icon: iconify:icon-park-solid:lock
iconUseState: false
iconSize: 50
actionCommand: ON
vertical: true
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
action: command
actionItem: BMWUnlock
icon: iconify:icon-park-solid:unlock
iconUseState: false
iconSize: 50
actionCommand: ON
vertical: true
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
action: command
actionItem: BMWClimateStart
icon: iconify:mingcute:fan-fill
iconUseState: false
iconSize: 50
actionCommand: ON
vertical: true
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
action: command
actionItem: BMWLights
icon: iconify:mdi:car-light-high
iconUseState: false
iconSize: 50
actionCommand: ON
vertical: true
- component: oh-grid-row
config: {}
slots:
default:
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
item: BMWPlugConnectionStatus
title: Nabíječka
fontSize: 20px
- component: oh-grid-col
config: {}
slots:
default:
- component: oh-label-card
config:
title: Stav nabíjení
item: BMWChargingStatus
fontSize: 20px
- component: oh-grid-col
config: {}
slots:
default:
- component: widget:widget_remainingchargingtime
config: {}
masonry: []
grid: []
canvas: []
A je to. Mělo by to být funkční, případně napište do komentářů. Poslední věc, aby fungovali tlačítka odemčení, zamčení, blikání a klimatizace, přidáme pravidlo, které nastaví RemoteCommand dle tlačítka, které stiskneme. Přidejte nové pravidlo v Rules.
Přejděte do založky Code a zkopírujte zdrojový kód pravidla.
configuration: {}
triggers:
- id: "2"
configuration:
itemName: BMWLock
state: ON
previousState: OFF
type: core.ItemStateChangeTrigger
- id: "3"
configuration:
itemName: BMWUnlock
state: ON
previousState: OFF
type: core.ItemStateChangeTrigger
- id: "4"
configuration:
itemName: BMWLights
state: ON
previousState: OFF
type: core.ItemStateChangeTrigger
- id: "8"
configuration:
itemName: BMWClimateStart
state: ON
previousState: OFF
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "1"
configuration:
type: application/vnd.openhab.dsl.rule
script: "if(BMWLock.state == ON){
\ sendCommand(BMW_i3_Remote_Command, \"door-lock\")
\ }
if(BMWUnlock.state == ON){
\ sendCommand(BMW_i3_Remote_Command, \"door-unlock\")
\ }
if(BMWLights.state == ON){
\ sendCommand(BMW_i3_Remote_Command, \"light-flash\")
\ }
if(BMWClimateStart.state == ON){
\ sendCommand(BMW_i3_Remote_Command, \"climate-now-start\")
\ }\
\ "
type: script.ScriptAction
Mělo by to vypadat nějak takto:
Hotovo. Vyzkoušejte funkčnost. Někdy zaslání příkazu zlyhá, hlavně pokud zadáte více příkazu za sebou. To nedoporučuji. V Items je také položka BMW Service_Execution_State kde si ověříte zpracování zaslaného příkazu. Někdy se tam objeví Error 403 přesto se informace do auta dostane. Charge Start/Stop mě konkrétně nefunguje, proto jej tam nedávám. Budu rád za vaše zkušenosti a praktické použití v komentářích.
Bonus: Pro Čas do úplného nabití, používame Widget, který převede minuty na hodiny a minuty, případně vypíše N/A když není auto na nabíječce. Widget přidáte v Developer Tools -> Widgets. Vytvořte nový a vložte kód níže:
uid: widget_remainingchargingtime
tags: []
props:
parameters:
- description: A text prop
label: Prop 1
name: prop1
required: false
type: TEXT
- context: item
description: An item to control
label: Item
name: item
required: false
type: TEXT
parameterGroups: []
timestamp: Jan 4, 2025, 9:34:49 PM
component: f7-card
config:
item: DurationInMinutes
content: '=(items["BMWChargingRemainingTime"].state === "NULL"
|| items["BMWChargingRemainingTime"].state === "UNDEF" ? "N/A" :
Math.floor(items["BMWChargingRemainingTime"].state / 60) + "h " +
(items["BMWChargingRemainingTime"].state % 60) + "m")'
title: Čas do úplného nabití
style:
font-size: 22px
text-align: center
Přidat komentář