11"""Support to manage a shopping list."""
2- import asyncio
32import logging
4- import uuid
53
64import homeassistant .helpers .config_validation as cv
75import voluptuous as vol
2119CONF_BRING_USERNAME = "bring_username"
2220CONF_BRING_PASSWORD = "bring_password"
2321CONF_BRING_LANGUAGE = "bring_language"
22+ CONF_BRING_LIST_NAME = "bring_list_name"
2423
2524_LOGGER = logging .getLogger (__name__ )
2625CONFIG_SCHEMA = vol .Schema (
2928 vol .Required (CONF_BRING_USERNAME ): str ,
3029 vol .Required (CONF_BRING_PASSWORD ): str ,
3130 vol .Optional (CONF_BRING_LANGUAGE , default = "en-EN" ): str ,
31+ vol .Optional (CONF_BRING_LIST_NAME , default = "" ): str ,
3232 }
3333 },
3434 extra = vol .ALLOW_EXTRA ,
3535)
36+
3637EVENT = "shopping_list_updated"
3738ITEM_UPDATE_SCHEMA = vol .Schema ({"complete" : bool , ATTR_NAME : str })
3839PERSISTENCE = ".shopping_list.json"
3940
4041SERVICE_ADD_ITEM = "add_item"
4142SERVICE_COMPLETE_ITEM = "complete_item"
42- SERVICE_SYNC_BRING = "sync_bring"
43+ SERVICE_BRING_SYNC = "bring_sync"
44+ SERVICE_BRING_SELECT_LIST = "bring_select_list"
4345
4446SERVICE_ITEM_SCHEMA = vol .Schema ({vol .Required (ATTR_NAME ): vol .Any (None , cv .string )})
47+ SERVICE_BRING_SELECT_LIST_SCHEMA = vol .Schema ({vol .Required (ATTR_NAME ): str })
4548
4649WS_TYPE_SHOPPING_LIST_ITEMS = "shopping_list/items"
4750WS_TYPE_SHOPPING_LIST_ADD_ITEM = "shopping_list/items/add"
@@ -82,13 +85,15 @@ async def async_setup(hass, config):
8285 CONF_BRING_USERNAME : "" ,
8386 CONF_BRING_PASSWORD : "" ,
8487 CONF_BRING_LANGUAGE : "" ,
88+ CONF_BRING_LIST_NAME : "" ,
8589 }
8690 return True
8791
8892 hass .data [DOMAIN ] = {
8993 CONF_BRING_USERNAME : config [CONF_BRING_USERNAME ],
9094 CONF_BRING_PASSWORD : config [CONF_BRING_PASSWORD ],
9195 CONF_BRING_LANGUAGE : config [CONF_BRING_LANGUAGE ],
96+ CONF_BRING_LIST_NAME : config [CONF_BRING_LIST_NAME ],
9297 }
9398
9499 hass .async_create_task (
@@ -123,13 +128,23 @@ async def complete_item_service(call):
123128 else :
124129 await data .async_update (item ["id" ], {"name" : name , "complete" : True })
125130
126- async def sync_bring_service (call ):
131+ async def bring_sync_service (call ):
127132 """Sync with Bring List"""
128133 await hass .data [DOMAIN ].sync_bring ()
129134
135+ async def bring_select_list_service (call ):
136+ """Select which Bring List HA should synchronize with"""
137+ data = hass .data [DOMAIN ]
138+ name = call .data .get (ATTR_NAME )
139+
140+ await data .switch_list (name )
141+
130142 username = hass .data [DOMAIN ][CONF_BRING_USERNAME ]
131143 password = hass .data [DOMAIN ][CONF_BRING_PASSWORD ]
132144 language = hass .data [DOMAIN ][CONF_BRING_LANGUAGE ]
145+ list_name = hass .data [DOMAIN ][CONF_BRING_LIST_NAME ]
146+
147+ _LOGGER .debug ("Selected list: %s" , list_name )
133148
134149 session = aiohttp_client .async_create_clientsession (hass )
135150 bring_data = BringData (username , password , language , session )
@@ -148,7 +163,10 @@ async def sync_bring_service(call):
148163 DOMAIN , SERVICE_COMPLETE_ITEM , complete_item_service , schema = SERVICE_ITEM_SCHEMA
149164 )
150165 hass .services .async_register (
151- DOMAIN , SERVICE_SYNC_BRING , sync_bring_service , schema = {}
166+ DOMAIN , SERVICE_BRING_SYNC , bring_sync_service , schema = {}
167+ )
168+ hass .services .async_register (
169+ DOMAIN , SERVICE_BRING_SELECT_LIST , bring_select_list_service , schema = SERVICE_BRING_SELECT_LIST_SCHEMA
152170 )
153171
154172 hass .http .register_view (ShoppingListView )
@@ -376,6 +394,11 @@ async def async_clear_completed(self):
376394 await self .sync_bring ()
377395 await self .hass .async_add_executor_job (self .save )
378396
397+ async def switch_list (self , list_name ):
398+ self .map_items = {}
399+ await self .bring .api .select_list (list_name )
400+ await self .sync_bring ()
401+
379402 async def sync_bring (self ):
380403 await self .bring .update_lists (self .map_items )
381404
0 commit comments