@@ -173,3 +173,226 @@ async def test_connect_adam_onoff_cooling_fake_firmware(self):
173173
174174 await smile .close_connection ()
175175 await self .disconnect (server , client )
176+
177+ @pytest .mark .asyncio
178+ async def test_connect_adam_plus_anna (self ):
179+ """Test Adam (firmware 3.0) with Anna setup."""
180+ self .smile_setup = "adam_plus_anna"
181+
182+ testdata = self .load_testdata (SMILE_TYPE , self .smile_setup )
183+ server , smile , client = await self .connect_wrapper ()
184+ assert smile .smile_hostname == "smile000000"
185+
186+ self .validate_test_basics (
187+ _LOGGER ,
188+ smile ,
189+ smile_version = "3.0.15" ,
190+ )
191+
192+ await self .device_test (smile , "2020-03-22 00:00:01" , testdata )
193+ assert smile .gateway_id == "b128b4bbbd1f47e9bf4d756e8fb5ee94"
194+ assert smile ._last_active ["009490cc2f674ce6b576863fbb64f867" ] == "Weekschema"
195+ assert smile .device_items == 70
196+ assert "6fb89e35caeb4b1cb275184895202d84" in self .notifications
197+
198+ result = await self .tinker_thermostat (
199+ smile , "009490cc2f674ce6b576863fbb64f867" , good_schedules = ["Weekschema" ]
200+ )
201+ assert result
202+ switch_change = await self .tinker_switch (
203+ smile , "aa6b0002df0a46e1b1eb94beb61eddfe"
204+ )
205+ assert switch_change
206+ await smile .close_connection ()
207+ await self .disconnect (server , client )
208+
209+ server , smile , client = await self .connect_wrapper (raise_timeout = True )
210+ await self .device_test (smile , "2020-03-22 00:00:01" , testdata )
211+ result = await self .tinker_thermostat (
212+ smile ,
213+ "009490cc2f674ce6b576863fbb64f867" ,
214+ good_schedules = ["Weekschema" ],
215+ unhappy = True ,
216+ )
217+ assert result
218+ switch_change = await self .tinker_switch (
219+ smile , "aa6b0002df0a46e1b1eb94beb61eddfe" , unhappy = True
220+ )
221+ assert switch_change
222+ await smile .close_connection ()
223+ await self .disconnect (server , client )
224+
225+ @pytest .mark .asyncio
226+ async def test_connect_adam_plus_anna_copy_with_error_domain_added (self ):
227+ """Test erroneous domain_objects file from user."""
228+ testdata = {
229+ # Central
230+ "2743216f626f43948deec1f7ab3b3d70" : {
231+ "binary_sensors" : {"heating_state" : False },
232+ },
233+ }
234+
235+ self .smile_setup = "adam_plus_anna_copy_with_error_domain_added"
236+ server , smile , client = await self .connect_wrapper ()
237+ assert smile .smile_hostname == "smile000000"
238+
239+ self .validate_test_basics (
240+ _LOGGER ,
241+ smile ,
242+ smile_version = "3.0.23" ,
243+ )
244+
245+ await self .device_test (smile , "2020-03-22 00:00:01" , testdata )
246+ assert smile .device_items == 70
247+
248+ assert "3d28a20e17cb47dca210a132463721d5" in self .notifications
249+
250+ await smile .close_connection ()
251+ await self .disconnect (server , client )
252+
253+ @pytest .mark .asyncio
254+ async def test_connect_adam_plus_anna_new (self ):
255+ """Test extended Adam (firmware 3.8) with Anna and a switch-group setup."""
256+ self .smile_setup = "adam_plus_anna_new"
257+
258+ testdata = self .load_testdata (SMILE_TYPE , self .smile_setup )
259+ server , smile , client = await self .connect_wrapper ()
260+ assert smile .smile_hostname == "smile000000"
261+
262+ self .validate_test_basics (
263+ _LOGGER ,
264+ smile ,
265+ smile_type = None ,
266+ smile_version = "3.7.8" ,
267+ )
268+
269+ await self .device_test (smile , "2023-12-17 00:00:01" , testdata )
270+ assert smile .gateway_id == "da224107914542988a88561b4452b0f6"
271+ assert smile ._last_active ["f2bf9048bef64cc5b6d5110154e33c81" ] == "Weekschema"
272+ assert smile ._last_active ["f871b8c4d63549319221e294e4f88074" ] == "Badkamer"
273+ assert smile .device_items == 145
274+ assert smile .device_list == [
275+ "da224107914542988a88561b4452b0f6" ,
276+ "056ee145a816487eaa69243c3280f8bf" ,
277+ "67d73d0bd469422db25a618a5fb8eeb0" ,
278+ "e2f4322d57924fa090fbbc48b3a140dc" ,
279+ "854f8a9b0e7e425db97f1f110e1ce4b3" ,
280+ "ad4838d7d35c4d6ea796ee12ae5aedf8" ,
281+ "29542b2b6a6a4169acecc15c72a599b8" ,
282+ "1772a4ea304041adb83f357b751341ff" ,
283+ "2568cc4b9c1e401495d4741a5f89bee1" ,
284+ "e8ef2a01ed3b4139a53bf749204fe6b4" ,
285+ ]
286+
287+ result = await self .tinker_thermostat (
288+ smile ,
289+ "f2bf9048bef64cc5b6d5110154e33c81" ,
290+ good_schedules = ["Weekschema" , "Badkamer" , "Test" ],
291+ )
292+ assert result
293+
294+ # Special test-case for turning a schedule off based on only the location id.
295+ await smile .set_schedule_state ("f2bf9048bef64cc5b6d5110154e33c81" , "off" )
296+
297+ # Special test-case for turning a schedule off for a location via the option "off".
298+ await smile .set_schedule_state ("f2bf9048bef64cc5b6d5110154e33c81" , "on" , "off" )
299+
300+ # bad schedule-state test
301+ result = await self .tinker_thermostat_schedule (
302+ smile ,
303+ "f2bf9048bef64cc5b6d5110154e33c81" ,
304+ "bad" ,
305+ good_schedules = ["Badkamer" ],
306+ single = True ,
307+ )
308+ assert result
309+
310+ smile ._schedule_old_states ["f2bf9048bef64cc5b6d5110154e33c81" ][
311+ "Badkamer"
312+ ] = "off"
313+ result_1 = await self .tinker_thermostat_schedule (
314+ smile ,
315+ "f2bf9048bef64cc5b6d5110154e33c81" ,
316+ "on" ,
317+ good_schedules = ["Badkamer" ],
318+ single = True ,
319+ )
320+ result_2 = await self .tinker_thermostat_schedule (
321+ smile ,
322+ "f2bf9048bef64cc5b6d5110154e33c81" ,
323+ "on" ,
324+ good_schedules = ["Badkamer" ],
325+ single = True ,
326+ )
327+ assert result_1 and result_2
328+
329+ switch_change = await self .tinker_switch (
330+ smile ,
331+ "e8ef2a01ed3b4139a53bf749204fe6b4" ,
332+ ["2568cc4b9c1e401495d4741a5f89bee1" , "29542b2b6a6a4169acecc15c72a599b8" ],
333+ )
334+ assert switch_change
335+ switch_change = await self .tinker_switch (
336+ smile , "056ee145a816487eaa69243c3280f8bf" , model = "dhw_cm_switch"
337+ )
338+ assert switch_change
339+ switch_change = await self .tinker_switch (
340+ smile , "854f8a9b0e7e425db97f1f110e1ce4b3" , model = "lock"
341+ )
342+ assert switch_change
343+ switch_change = await self .tinker_switch (
344+ smile , "2568cc4b9c1e401495d4741a5f89bee1"
345+ )
346+ assert not switch_change
347+
348+ await self .tinker_regulation_mode (smile )
349+
350+ await self .tinker_max_boiler_temp (smile )
351+
352+ # Now change some data and change directory reading xml from
353+ # emulating reading newer dataset after an update_interval
354+ testdata_updated = self .load_testdata (
355+ SMILE_TYPE , f"{ self .smile_setup } _UPDATED_DATA"
356+ )
357+ self .smile_setup = "updated/adam_plus_anna_new"
358+ await self .device_test (
359+ smile , "2022-01-16 00:00:01" , testdata_updated , initialize = False
360+ )
361+
362+ await smile .close_connection ()
363+ await self .disconnect (server , client )
364+
365+ @pytest .mark .asyncio
366+ async def test_adam_plus_jip (self ):
367+ """Test Adam with Jip setup."""
368+ self .smile_setup = "adam_jip"
369+
370+ testdata = self .load_testdata (SMILE_TYPE , self .smile_setup )
371+ server , smile , client = await self .connect_wrapper ()
372+
373+ await self .device_test (smile , "2021-06-20 00:00:01" , testdata )
374+ assert smile .gateway_id == "b5c2386c6f6342669e50fe49dd05b188"
375+ assert smile ._last_active ["d58fec52899f4f1c92e4f8fad6d8c48c" ] is None
376+ assert smile ._last_active ["06aecb3d00354375924f50c47af36bd2" ] is None
377+ assert smile ._last_active ["d27aede973b54be484f6842d1b2802ad" ] is None
378+ assert smile ._last_active ["13228dab8ce04617af318a2888b3c548" ] is None
379+ assert smile .device_items == 219
380+
381+ # Negative test
382+ result = await self .tinker_thermostat (
383+ smile ,
384+ "13228dab8ce04617af318a2888b3c548" ,
385+ schedule_on = False ,
386+ good_schedules = [None ],
387+ )
388+ assert result
389+
390+ result = await self .tinker_thermostat_schedule (
391+ smile ,
392+ "13228dab8ce04617af318a2888b3c548" ,
393+ "off" ,
394+ good_schedules = [None ],
395+ )
396+ assert result
397+ await smile .close_connection ()
398+ await self .disconnect (server , client )
0 commit comments