From 157c6e9e37c1128c54f8657d67b88418cbea14a2 Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Mon, 5 Apr 2021 19:29:52 +0200 Subject: [PATCH 1/7] support for xiaomi multi cooker --- custom_components/xiaomi_miio_cooker/__init__.py | 9 +++++++-- custom_components/xiaomi_miio_cooker/manifest.json | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/custom_components/xiaomi_miio_cooker/__init__.py b/custom_components/xiaomi_miio_cooker/__init__.py index 75714b2..041c934 100644 --- a/custom_components/xiaomi_miio_cooker/__init__.py +++ b/custom_components/xiaomi_miio_cooker/__init__.py @@ -39,6 +39,7 @@ MODEL_NORMAL3 = "chunmi.cooker.normal3" MODEL_NORMAL4 = "chunmi.cooker.normal4" MODEL_NORMAL5 = "chunmi.cooker.normal5" +MODEL_MULTI = "chunmi.cooker.eh1" SUPPORTED_MODELS = [ MODEL_PRESSURE1, @@ -48,6 +49,7 @@ MODEL_NORMAL3, MODEL_NORMAL4, MODEL_NORMAL5, + MODEL_MULTI, ] CONFIG_SCHEMA = vol.Schema( @@ -119,9 +121,12 @@ def setup(hass, config): raise PlatformNotReady if model in SUPPORTED_MODELS: - from miio import Cooker + from miio import Cooker, MultiCooker - cooker = Cooker(host, token) + if model == MODEL_MULTI: + cooker = MultiCooker(host, token) + else: + cooker = Cooker(host, token) hass.data[DOMAIN][host] = cooker diff --git a/custom_components/xiaomi_miio_cooker/manifest.json b/custom_components/xiaomi_miio_cooker/manifest.json index 2f2b538..f0ba2ce 100644 --- a/custom_components/xiaomi_miio_cooker/manifest.json +++ b/custom_components/xiaomi_miio_cooker/manifest.json @@ -8,7 +8,7 @@ "issue_tracker": "https://github.com/syssi/xiaomi_cooker/issues", "requirements": [ "construct==2.10.56", - "python-miio>=0.5.6" + "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.6" ], "dependencies": [], "codeowners": [ From 51d4579a52505b9083668690a624036df8ef8323 Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Tue, 6 Apr 2021 19:54:14 +0200 Subject: [PATCH 2/7] add cooking_delayed sensor --- custom_components/xiaomi_miio_cooker/sensor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/custom_components/xiaomi_miio_cooker/sensor.py b/custom_components/xiaomi_miio_cooker/sensor.py index d20948d..9f37fa5 100644 --- a/custom_components/xiaomi_miio_cooker/sensor.py +++ b/custom_components/xiaomi_miio_cooker/sensor.py @@ -20,6 +20,7 @@ "menu": ["Menu", None, "menu", None, "mdi:menu"], "temperature": ["Temperature", None, "temperature", "°C", None], "remaining": ["Remaining", None, "remaining", "min", "mdi:timer"], + "cooking_delayed": ["Cooking delayed", None, "cooking_delayed", "min", "mdi:timer"], "duration": ["Duration", None, "duration", "min", "mdi:timelapse"], "favorite": ["Favorite", None, "favorite", None, "mdi:information-outline"], "state": ["State", "stage", "state", None, "mdi:playlist-check"], From 297f4bf15b7a1aad96174801ffd6a08216eec08b Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Sat, 10 Apr 2021 19:56:43 +0200 Subject: [PATCH 3/7] duration and schedule time for multi cooker --- .../xiaomi_miio_cooker/__init__.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/custom_components/xiaomi_miio_cooker/__init__.py b/custom_components/xiaomi_miio_cooker/__init__.py index 041c934..60094d3 100644 --- a/custom_components/xiaomi_miio_cooker/__init__.py +++ b/custom_components/xiaomi_miio_cooker/__init__.py @@ -71,6 +71,9 @@ ATTR_MODEL = "model" ATTR_PROFILE = "profile" +ATTR_DURATION = "duration" +ATTR_SCHEDULE = "schedule" +ATTR_AKW = "akw" SUCCESS = ["ok"] @@ -80,7 +83,14 @@ } ) -SERVICE_SCHEMA_START = SERVICE_SCHEMA.extend({vol.Required(ATTR_PROFILE): cv.string}) +SERVICE_SCHEMA_START = SERVICE_SCHEMA.extend( + { + vol.Required(ATTR_PROFILE): cv.string, + vol.Optional(ATTR_DURATION): cv.positive_int, + vol.Optional(ATTR_SCHEDULE): cv.positive_int, + vol.Optional(ATTR_AKW): cv.boolean, + } +) SERVICE_START = "start" SERVICE_STOP = "stop" @@ -168,7 +178,14 @@ def update(event_time): def start_service(call): """Service to start cooking.""" profile = call.data.get(ATTR_PROFILE) - cooker.start(profile) + duration = call.data.get(ATTR_DURATION) + schedule = call.data.get(ATTR_SCHEDULE) + akw = call.data.get(ATTR_AKW) + + if model == MODEL_MULTI: + cooker.start(profile, duration, schedule, akw) + else: + cooker.start(profile) def stop_service(call): """Service to stop cooking.""" From f32cc3696582bb1ba6316363dfb26e5ea4c1e17f Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Sun, 18 Jul 2021 00:08:23 +0200 Subject: [PATCH 4/7] add advanced config example for multi cooker --- README.md | 178 +++++++++++++++++++ lovelace_advanced_example_multi_cooker_0.png | Bin 0 -> 26613 bytes lovelace_advanced_example_multi_cooker_1.png | Bin 0 -> 18318 bytes 3 files changed, 178 insertions(+) create mode 100644 lovelace_advanced_example_multi_cooker_0.png create mode 100644 lovelace_advanced_example_multi_cooker_1.png diff --git a/README.md b/README.md index 72d1c07..4b533f4 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Credits: Thanks to [Rytilahti](https://github.com/rytilahti/python-miio) for all | | chunmi.cooker.normal5 | | | Mi Smart Pressure Cooker | chunmi.cooker.press1 | YLIH01CM | | | chunmi.cooker.press2 | | +| Mi Smart Multi Cooker | chunmi.cooker.eh1 | | ## Features @@ -146,6 +147,183 @@ icon_height: 40px ![Lovelace button to start cooking](lovelace-button-start-cooking.png "lovelace button") +## Advanced Setup Example (only chunmi.cooker.eh1) [WIP] +The following is an advanced example for a configuration of chunmi.cooker.eh1 supporting the following: + +- Show current cooker status: mode, temp, cooking time +- Start the cooker + - with cooking profile selection + - with optional schedule +- Stop the cooker + +![Lovelace button to start cooking](lovelace_advanced_example_multi_cooker_0.png "Multi Cooker Example") +![Lovelace button to start cooking](lovelace_advanced_example_multi_cooker_1.png "Multi Cooker Example") + +```yaml +# lovelace + +type: vertical-stack +title: Multi Cooker +cards: + - type: entities + state_color: false + entities: + - entity: sensor.xiaomi_miio_cooker_mode + - entity: sensor.xiaomi_miio_cooker_temperature + - entity: sensor.cooker_time_remaining + name: Remaining Cooking Time + - type: conditional + conditions: + - entity: sensor.xiaomi_miio_cooker_mode + state_not: Waiting + - entity: sensor.xiaomi_miio_cooker_mode + state_not: Unknown + card: + type: horizontal-stack + cards: + - type: entities + entities: + - entity: sensor.xiaomi_miio_cooker_menu + show_header_toggle: true + - type: button + tap_action: + action: call-service + service: script.rice_cooker_stop + show_icon: true + name: Stop Cooking + show_state: false + icon: 'mdi:gesture-tap' + icon_height: 40px + - type: conditional + conditions: + - entity: sensor.xiaomi_miio_cooker_mode + state: Waiting + card: + type: horizontal-stack + cards: + - type: entities + entities: + - entity: input_select.cooker_programm + show_header_toggle: true + - type: button + tap_action: + action: call-service + service: script.rice_cooker_start + show_icon: true + name: Start Cooking + show_state: false + show_name: true + icon: 'mdi:gesture-tap' + icon_height: 40px + - type: conditional + conditions: + - entity: sensor.xiaomi_miio_cooker_mode + state: Waiting + card: + type: entities + entities: + - entity: input_boolean.rice_cooker_schedule + - type: conditional + conditions: + - entity: input_boolean.rice_cooker_schedule + state: 'on' + card: + type: entities + entities: + - entity: input_datetime.rice_cooker_schedule_time +``` + +```yaml +# configuration.yaml + +sensor: + - platform: template + sensors: + cooker_time_remaining: + friendly_name: "Remaining Cooking Time" + icon_template: "mdi:clock-outline" + value_template: > + {% if is_state('sensor.xiaomi_miio_cooker_mode', 'Waiting') %} + 0:00 + {% else %} + {% if is_state('sensor.xiaomi_miio_cooker_mode', 'PreCook') %} + {{ ('%02d' % (((states('sensor.xiaomi_miio_cooker_cooking_delayed') | int) / 60) | int)) | string + ':' + ( ('%02d' % ((states('sensor.xiaomi_miio_cooker_cooking_delayed') | int) % 60)) | string) }} + {% else %} + {{ ('%02d' % (((states('sensor.xiaomi_miio_cooker_remaining') | int) / 60) | int)) | string + ':' + ( ('%02d' % ((states('sensor.xiaomi_miio_cooker_remaining') | int) % 60)) | string) }} + {% endif %} + {% endif %} + cooker_menu: + friendly_name: "Menu" + icon_template: "mdi:menu" + value_template: > + {{ + { + "0000000000000000000000000000000000000001": "Fine Rice", + "0101000000000000000000000000000000000002": "Quick Rice", + "0202000000000000000000000000000000000003": "Congee", + "0303000000000000000000000000000000000004": "Keep warm", + "0505000000000000000000000000000000000009": "Cake" + }[states('sensor.xiaomi_miio_cooker_menu')] + }} + +input_datetime: + rice_cooker_schedule_time: + name: Time + has_time: true + has_date: true + +input_boolean: + rice_cooker_schedule: + name: Schedule + +input_select: + cooker_programm: + name: Modus + options: + - Fine Rice + - Quick Rice + - Congee + - Keep warm + - Cake + initial: Fine Rice + icon: mdi:menu +``` + +```yaml +# scripts.yaml + +rice_cooker_start: + alias: StartRiceCooker + sequence: + - service: xiaomi_miio_cooker.start + data: + schedule: | + {% if is_state('input_boolean.rice_cooker_schedule', 'on') %} + {{ ((state_attr('input_datetime.rice_cooker_schedule_time', 'timestamp') - now().timestamp()) / 60) | int }} + {% else %} + 0 + {% endif %} + profile: | + {{ + { + "Fine Rice": "02010000000001e101000000000000800101050814000000002091827d7800050091822d781c0a0091823c781c1e0091ff827820ffff91828278000500ffff8278ffffff91828278000d00ff828778ff000091827d7800000091827d7800ffff91826078ff0100490366780701086c0078090301af540266780801086c00780a02023c5701667b0e010a71007a0d02ffff5701667b0f010a73007d0d032005000000000000000000000000000000cf53", + "Quick Rice": "02010100000002e100280000000000800101050614000000002091827d7800000091823c7820000091823c781c1e0091ff827820ffff91828278000500ffff8278ffffff91828278000d00ff828778ff000082827d7800000091827d7800ffff91826078ff0164490366780701086c007409030200540266780801086c00760a0202785701667b0e010a7100780a02ffff5701667b0f010a73007b0a032005000000000000000000000000000000ddba", + "Congee": "02010200000003e2011e0400002800800101050614000000002091827d7800000091827d7800000091827d78001e0091ff877820ffff91827d78001e0091ff8278ffffff91828278001e0091828278060f0091827d7804000091827d7800000091827d780001f54e0255261802062a0482030002eb4e0255261802062a04820300032d4e0252261802062c04820501ffff4e0152241802062c0482050120000000000000000000000000000000009ce2", + "Cake": "02010400000afe8801000100003700000100000000000000002091827d7800000091827d7800000091827d78001e0066787d7816000091827d7800000091826e7800000091827d7800000091826e7810ffff918266780a000091827d7800000091827d78000000000078821400108714780300000000007882140010871478030000000000788214001087147a050100000000788214001087147d05012000000000000000000000000000000000aa25", + "Keep warm": "020103000000040c00001800000100800100000000000000002091827d7800000091827d7800000091827d78000000915a7d7820000091827d7800000091826e78ff000091827d7800000091826e7810000091826e7810000091827d7800000091827d780000a082007882140010871478030000eb820078821400108714780300012d8200788214001087147a0501ffff8200788214001087147d0501200000000000000000000000000000000090e5" + }[states('input_select.cooker_programm')] + }} + - service: input_boolean.turn_off + data: {} + entity_id: input_boolean.rice_cooker_schedule + mode: single + +rice_cooker_stop: + alias: StopRiceCooker + sequence: + - service: xiaomi_miio_cooker.stop +``` + ## Debugging If the custom component doesn't work out of the box for your device please update your configuration to increase the log level: diff --git a/lovelace_advanced_example_multi_cooker_0.png b/lovelace_advanced_example_multi_cooker_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7e3f8493469868fff17d39a437a8ea7dd93125 GIT binary patch literal 26613 zcmd432{@L2yEghXDnv?%4AG!6Rb(b*D2bvn6B!~y=6NWEBAU!|k|cA;5XxL6WXhCz zou?ZE>RGP1G_`F3~CojccB;J|BTWz}CB5#mSBn`zN0qT@8Mughb@jq<$UkG(X{ z#)n=uiteDGh`-HW>x_w&sb%&PoisxukvT@Qz&MI{C5u*PzuArr zRKM`i`Q$va&~CYf?^Xq6Z*Q;l>&cGcg^BhY9x3U5)`N0hh1ZjBl&mR5@ahyYc%Cu; zWzf1_!DRWnudnpwF_lwhmR*Iy82k5{xjc<-l*}TutgNgUOj5~AUuEr`Ss!ZF?Z1=L zioRe5Q?(1aR!ThYw4{cuFiE%yO-@ekUvL>o2)XOva8yDfnp-pH^_@$KibhMb1Gb|- zAB79tQO-8Ku90n8{$4%HH!!fywp-MGJl3+i=x4HO;MbrNjp=&lG5kUflO1kjiYNH_ ziK}nkvPIZ^)iFQkwDI@dd-j|w_1=}Fm3OL6Vufq!(_)wQ%HP2V%jub!o`DcuqoMCn zw&ShOj$eQGBSkZp>>XAVi({80*bK`$-m9O+-B#QR6kjN5Z~tJj_u|Eiw8yXcmXwqztmNhAH>BxG z>bNf%iiwNY4$REV{F&^GaOiUK`Q)M5Ot$S< z^OIdnXP!nz`sd~fs;21}*1wYZVAl3LO4Pw9X+6(oXtvEbre}2YD+Y*Dx2Ui!$8E(P zUo6D}|LDFZk{}<{i*e%8&VOk?@vC#+GU@8otF}{JQEMxUF9a=hW(R8{5=5k>`_roH z+3F$$d7m%|9>LO2Pfw>@c^%NKnQi*e&+k$|Q$vcT;2Xs#`Nhf3P1Ccp`lCOS6rx0e zj>fpo-ph3utl3XGe(kNNmshFyN)gtx{{i9W*fHVXjwnV};Tkiuv%Ox_)PzW#7a z8fyrzZjrJ0w-8?AFAsJKiHOY3RI;kX%kIjWm>u{=$-w6sA!vE(?(ehqlO5F#-ENgw z#ZHrXL%sn4-|yb=u(jp48~v$=88vIqc|xp)OLg(SzN-SljQux~g94aEHy?Y^_5Ats zhV1TqJ3s8h%|9}3$-TdEM=|(C%KGY@5($@CEE$WI^oZVAUo0jO10WxCJj`54Y-a0e zqneWP@`r9K3p0IzlHulYad9L{Mt@`loBwm)x3BvC15usKEZV_sgEIT6`(i`|h? z3O{`sY0sU~9_#*SRVvoVhfN?&^*^u7gi zM~XTGV0-PQq4|s(+izZ2yyUA%eNjFnpi0FU6U^*-+BxE48cO%R=Iu7B`b#5?L^Q`*3m%OEV*qCTo%UT&feQR zXgqLQCHtZBvT`NHQm=ISJ^ z92|&eq;M%h?Ctg(Zs4;DM9Q~sIT38%UWwbh z_o$+RLsl5D#og7vRuUVlHeHT=yMWo`u$KN}ARhVoap)Gg67lxjL-Nkt1zbOzSid%d z3SDlC+JJffAtChc?(VLCdwdGl7TUSgGamrATz#XkAIU?=ZJGb6weV~G^2gMxu8({# zEV#Vpm@RagYj`C?LBdvdXtC?4K}I=c{QW?_?Z`Q7$wvVJ6?~M@9_vnDzI>^<^Ig5C zxA%+x{?owNCHfh^hlfKao0F)Iv$1(%=hf$0>bknR`aXFwfU`L|In`$xUZUgCsuG@KHX0@#13p5k$y99n+hd zTy$7hcWrIUK7Za+%7>Iva!lau3ml@LP=?tU9Q2NlkLMnv!^81oRRLZ9M)nsH7S_v9 z*huAsOZp8--3dIC*NrCnF}_+ z(UT|Z3u!F^s#0#8P*ildtWOM_R#|oR&g7ZH5^xyOe^;@gHioeUt)`)DB z?J+Ks!bq!#ffeV?H)_I8JG!{o0P7Vizwxc=?!um%Sy&hZq8!ZpSsb^rI3*a;S?Kg4 z)9~9Y;zqYa#N}}QgJNQ2i&h{*8hJeiV{uwtTeGsaAN>8< z3#Un62M(_>^r2$@^7->UPfyPki_=0vp#WB!?k>$5;%*-K`c|cj=U#a#`2b`r6T7$| zI880%K7RNW%TDvmg9Vgsb#=92+Y%=I7&a7G0$&KTnB!9*w!V=Or*3m#!Z4%+N!tQ$ z&MMX~xY;@+Her{A_jz2x!eO|#U^;G%j;4*QItdO=&Kik<)QqxOz0G4SX^Egqf5uv-QYY-eXf8*b*+fJx?_Es6 zJ?kESd&oeG0FdI%+jIOGPTn6LzD)u=D5sWOJ$w5$XN=pze&DcM_N)@IY#yAz>Yy?S zqMwRzifF9Y1I)~|hTeM9OG7b@#U38v{3hpsHNtS^lP6CSY=gAASiF${*2sUS*&l0n z@18ySsUF}g&8gbo${y`aLJm@rT;u=z`Ln~5Uoz6`Nko`#N>;`4;KJk|<>T9p6&CHj zY~sE&K%c6W_XW(WhRyOv>?U20H33Y@;G?6_znfHb4^9FO1%=mld%g&}K452G=&3#$L;Q3ATLVOMFD>oXvlG9v)gc&w!}os+3B*p` z{Ci-aJW|+3t;kiFo>zxosaP|m+2@x>k?T@TjJCFRh8kB{Ma3Rg);eUeQ)?^HQD%Gk zFMEHlYo2(hME<>bqBBsBfexB>oA0%9ziqLJO2XOq}gS6;r2t&@|P?btEI z(#J$1aNiI0L=RhHB)BtA96LG_s)zOPkAuW`FaH_YayClDj^VTs<)%%WAd7^0SQh{7 zr63Y4Le$Ls{NYolo`dojyIiL8+eSu4W>YMDF|m2$J{HQ%L~i#UIy%{iGv?`P4U$nH z6mbwn0GR5uf`NW}N_~>lGT1FFEND;M;Odm7DCMh(`4)7-r^$2xr+j(*`eSU7J%|6XS=K^a0!JMM=rm;mb8b?@8QRf9~E*} zRL`|GH3cDPg|&>_vo$u$dU1c1_jYUg!RqR2v+klO+@oP@B0v;@>djiy?|~F|xv!XO zX=~TEO%O!C!hb)~$lbn*UD%jLsbkpb;EN2W40a&0uw%t-+Oi$w=dYZ#E9N*B8xx0L zNmPuo?a?f-H%CHxtC9UK@4f9v!+Y(5VC=FClg1;&HQ4%8#;{jP^)u3~`ecFfrc3PX z5GkRx(Xg<5k2~+<2+4${cX(1sYMow4RJ0L*3B*xf$0JXrB~{yLzDd;yJIti%-M)WQ zCmbCeNk5WRd5PTuXi`Z;+80U^VHRr_UmUrbqv)$F5tlD+S& zPivjFOlBnhaeg3BP(*61(eqkb2X0jcBw*}3gv+K3UZ{+9hTkY{K^t z@PJ!i&b`uXH0`&lTRj5s!M;IzrdZ|Bi%-zJPS;%JSN5A#AzO6s^ zrBm}0?evzGQwkfQ{XVA*kZx3UDs`XA0Z+X6&010 zmm7X$F6Co@x(RKW!1mhh_qLEZE)9gtEG`}eRCvZAM?ftz$za@WUfbKN@jIxgkBW&! zLZZErZ)-AV<>)BH!^4xqGs8>p<*u$SJX~u&EzPq7bDa*|C+)}8pqW)6KoVgl?b8Ay zwuZopKa*epQn!fxIPnn_)w;Wy#jCRvAw1gbIQ#z7Mo&XSca&t@swCDo?)AaLhbKXU z7bZKud2ZU0x#noyDKOjd{&xK)J=&iM2FZ9kJ#hN9c$@g+pNRbgS_ z{hko!l@XO>{TcKY5Y>-EaU2APM_4y#pXvWqoR3tJSp8!uho>*DCPFZf&_xhjx9?&s zL!2eGezfAackdp7VM=_%o z6v!fu-}pFXiD0*DDKrtg?%iZ>RT8Oi$^k;!F|Lb7oY{>VgxKW-VZ32} z9&mfUMYnF@TYBD^s);6#^*Poe)@ zxe0L|pYm|&7DWOn&q9PsY#+q(LmA>00%Rm)%#*h&Ld`L715i+~9%vXDzv9pa?ZhQe zdh(0K{3Xz@8hJ_BEEj*xH}Qtz=|b5Tb25d9?F?Ai>B7b6tcep_XTTm|4WO zI*QMV9mYsIA+nh@bXv-6ufbMx~8N13-kAjN7f=c2xVLcm+~ ztRp8>Qx$So5giqx#g@|OJ$$tG_LIHh;WMdjR%k!U-S+j~+xMTCG83@zPMQDWFIrpB zRE&|Rh5iK4;Fizleg%9Cc_AJ1D6u@ufs&6`a`Fj8Jbu%kz6Z~H6QTIkt5*zsH%UNG zb$3M(3I=n#-TR0tOkK42pQ&!i&ZK$QrCBH>L`=nKmSD|-FrRjq)N)^$5WJD5f(SOZ_)4gKnZ<> zBU&DlLwfQXctzuM(%b%Rgvkmpq|KVNAb_eIcZ+}3rtodS ziE5tngpkh(pj@8`XbDcZaHqY3)`o{rY$gqtbC$ zb?Z`2X<}%$=~4RlTa%`jcFoTha2(TMqjuA1!J#jAy@MWD?PkXE@5quQrc?5Qe(XAX zY$QDa7M1U>p6z!EwiNzSKFn~gsP#gDv-=+tZ8!%oR{i8>KFLO(DO>sQuKJ6^hD^b7 zP|a?imnvfzX#JjojaN#^;Uw2j1Dt@Z=@)B(Gb-BKnNS&mmVCSU{eI-p%!}Nle`#uB z?JE**5&4PCKiZt)S6nQK3_k!V{ABzrSnA4216$v3zg1sT}&J!At}E*lseBCHW$Ue=6`ype>=bDxI(#WFZ$?C+NSH8Zs@&t*20dP@1*R{lRlPq-Uobf(Hgj1;X z516$zmlB1w`VS^55fi%7*3nI-0BC-2tHb-mu2V}Ip6-#-%?}YX8 zACtKmRGS@9@}6E?B=9g21PRKO54;0J3Pt(g6?6!~Q~+E!)2wOPGc~1z)uLADn30zf z8p_b+G{pQ)HBGVU-Sz!Kci99jI{4bRY~BnFcNYor4Ld*oOE_TqhKA%oVT2v0Z+g2` zqD(W@^@)i4NUMYx3FI5*mU1ImU4@XA07MB2BO}vkx7yRwLwIzireZ9dV7!3tc7MsS z@y%tijn%np@710`Z^;6Ewq2WQi9QY&!tdWV2?+t&L&*6LCvh4%xrn+MKvd!(|DivH zv*ZN*X+c&L#r}DN=fi?KZPv;MVDYr4XwtZ=&3JkxSmbMH?==q3=7)`bMzty0@F~Yw=`yrqcOdjA4 z^|4Z0iZ<3=NbDROQ=`~I@QSFL*72O#IlJX5J;^bnt2ActvbIBek7Q=To8n&F0n{;) zC&YsKL?u>$p>iZfP=`b;enJ==-zcS)fR6uqDUt+B(M!N} zLc)U4Ma_JUG-3(N%$ z4i315u!Mzi{TFP3A}-rJq2Ew{dh*jwDYC#hCR+F?3IKpNS$BKR5pEMU!w1c8E;9jA zokywG5h_37qygJM)4~Kw1PPKTvSFtY9Sx3Kg?NZ zYgo^<;%TDA%cIF3EIJA6)qO87Vf%3g5aRs{DbVymi%Q{+f=pn&vS4mg_UU##J5lXJ z#CZ$f607U9)SDImz`)AJ#<}RaCg2Z3JtT-fb_8K0!ojdQMRH{)hKswLNmflW!kUNs zh_i7GTmCV&&|U_H3mAK0>;4_2Zns5d;0u3dQ92I~k6*c#N=P%4>MLG%|4Zbl?mr?) z@63|rq%(Qqv-AMfNrT<>C>HfiOt{spC%IuiYn#o^WbGYNk##dMPLzE6fmO-n=ehIe zVR?G&^e(|=aT2a1W>3WbJ^S}pL-Vd($7Du|y99fBl1PNap94-58t+8%E59ERL4-vT z?J?yCDA3F`DoI++k6tIZqE4aXo9uyaA$6;5rKMhFWzrViMNhzp#8>k3^C7vRLVFlm zIl^Dq{AM9x!}VlX-p*-hX}y^s6|XO!z%o$E<>KRe3aP;;i5XVK`?~H+4}s&9A^W>b zPJJIbm|dijs0c;DFDomnEqY<2Qg;A?rG-m$bo9vjMt(uTme7!`|99T?J;z!4&=^zD^s{UHWmh0!8c)6>TZ>1|uyr6Z}rhjpE?wRC{cUq&o+uRi$u_s25MiEyb z+djm8h$tpKJtbO*YmYSNwG7Yb5CSfqS^dLp8X`KVrF&unttKo_RiYw_&{?$iQ_P;j z^65|)3WBF#5CB}LhXnyoJ4s&C-*12#Qi)sp!GRBUC=sc{=EnQ!&mI)fshw}DaRu9M zq?y&0mk*?>th6mvoWs=Gk%&^yY=8BZ5)2On+^^H8bWjz*_Q+pqHO>BqS`WETw3Q$6 zs4x7aEX%pbc-g1$*VBlZoqwVWAFC(Z@7`;9xg|Q^Vl;;(0Tlacj+r`Q=`eN=Vi0KP zX2NoUIC|{*yO&F8s8kH{mV5m|0qY;OePTfQ%bILa+vk4?>Q*Qa*r@-yv+Cdsjo~k3 zlG<;ZlIXb9Zt5t*3@3&}eW|4g3~5fIaqZW^f$){r7he#WgF(#kZvNA{cgWs%$6HTg z5Ni!hJltPm+5MaBKR6}-XwPAOcKVEG$Tqz_J)glEY7Hv`nBzea_fwI8&?ZOkWTzi@o-vG~R<&xTG4+*~0ra=pN`F6+0lR$IE`1%1+dw=yTqZ#m|nJJGACeIdKk0>}4PI|1n zDn^S{qb5^<(6xh#>btV&>ePo8I9ckD8h7m4<@USJ8N4+^BZVl!amWRvo3&+{MU5}8 z0hgHkd`olQn^F(N3c38`%@R^YAgkpIXX*73Y)(Qc!x;up(S@&+moPg(!HRH`So@>0 z{+Gk>IkCbB3l#i+040P|YqTZJQb)0XK$jPvlD*{K{<LTC14!H*Pm0YJ<1XWR76 zME?{AhI4m6Kjn0+szUd5Z-0MTyJc}LLLlLwfJM&;u+Md6BA4H!;Q@q2)SJ)2n#5wd zg4ELwI6>?k2$Oube-IWtYq1)*X)dC8;@I~@kXUsBciwbd=gn$tfZ(wc^`~1PlZAg8 zE)jJY>>C;eh8+YrfVuA`X5aokzFqcoOL$#M&l6`@n2QX}!h%E{UJ z)SYH7`>C$WSS&lKsS}~es2BM^?Ie6RuwxPhVe?-fK7(t+>(Ta_j^-W>hwN|QZ6KnN z&H_OIk)iAsoh`~o(%cXP4v2?8*Txrmu)K#bs|lD))K~~ZQFuE6&aGgK6~tD?%)}d1 z%h5mP4b=XcFs!!x;oVY6%;AmYM2?zeqoY8M2A~{Yl-1_IO))qTCqUz zEA{Sih1^}$?#Mz0!$0DnvRR{WSrNc|2}^ZCqU@HwK0#-&Jo}*25UWGGz}|37?gz}a zhac*|WSDE#Dd`%Ad!Z8lxLiLD?ni=5#GQLs zT%O%dY$24V-zbEg!&TJtZI5A=sxn-D`1$tpM?`5T1uZcBcuZGy9;|BzrzY20OQ@{& z@3EMG&~DYPoah+YK6dumz@UYn`L$jLl#6zn558m8dK~b{xVVzSu_4!v`$?G$9MIh6 zPlp~eec8Gc!Vc=#P8FjM9OozZuF@Jsye8QU3^F{U9u;bhPCw;-HHhJUjt_vd>_k zK|*vg?F94t%tyHeN(%H1tja!w)v~fOlplQc7|!r$@zBFo*15|@YH`jXOySfh+1K66v6ThqAs)lYbCy%O}y$EZxar zmMDK@Q!gD|a4uuB6X%Nb!O?5SFQUY$8FD1h6E|3psb`b~>2==g zK1#iu{44g9(@SD++H;O}T=%ZgIzP^RLObHx;kVYuzS8ktP$&%Aa&;&y&y^M?+kj3dd59PRMQty=rQX`)g?BHxWwT0V zb55vPzdTa#2;Z462(URR;%#v`Ie}v415zE|`&;5-osmm*%WHuj&;8r&7$Lq)+uFR* zUXvfpgmP6&*Jb7c)FhR zeDGSml3z&Yc-lTGHKjDy>j&I{QN?*=j* z37+W4+v_Kzl<3=E_~zb#?3;A+F}*@M^8bfS=s!U9nslt(b)L|q`y45W;>98g~)%nWBN zyJ{d8Y=Tg75<2mh1@sR9H3Ww7ZixXDOOfm+E=t<3l|+m0g#mF1~>(i8Z75Aw<PJ!EU8p<*DS>Qa;Dgq(pde;Bh<&G)FYC%+U%HO-9?uY57>` zVQGP3!fI~tG9vI@J3F^nH#o_{Vq@8gmPb#Z1W*cYXJy?GL^yTyx6O6fe27}G8Jt~A zVDq?uBB?&4L*lLx`1=s`^caj>03J}u310#|4+ngE&Z{fY+t=6l(ET{#JYwYOj&8s? z*y#vQEKy@J>-hMLz!Mwy9{F~PI`(efP%n=0+V2|ncy$d9K4ri$!j4Rst>6`N$d*Lq z2<0>ge03omGl;(%KN2hYlsS!nwQ==Jt;54MD#NxB+7stMc6(GdX1G!LvWN8KwOC z{92+8t#?Zl{B4&JK@1jKp0WI>u`e*rqREqOK!t$bZt^&yA&e80n+*NxvrPmxf2GT^ zQ-4k|%!pzEb7=bTQ6AY!(y{pAEm_UOjJYI{Y#w%f`mXV7tV)7Iw%@3vwPP3iuPbO3 zmdjqhXc1d&fw&xNHgn%~ezKV1)SQcAWT0Y8j=RI_C-0tjoaKOTS@c51_Bjt*=aVXLr=qQ3H2CtPAN` zYq7};fMR;athEHJC+}|0W^8}=*V(>R@hx2GVon{}p&uP7GIA{>f1a6)JbQFO?nNgH zv8$o})_ib7QS?kwJjevm@FQ$9_yZnK5Ghu5Zgzbpsr3ZTW%wTuB)r- zsDN#NLD1p=MCzk3Llw?`J@IF}?KD#~GfnkQltKC%Kby1sO|_Jv=&u)yTibOzvz>#8 zM(9$s({Ua-48~be^^7A4l~2UHO4DpYqQg@VJyBT7gliuNkPOmYU$I1=Q+`F07#k$`Nnl)Z4rh&e;5=R;?9$y=MVh@jIeF#^_D#XKl*_% zJ?<>BoZ*Zxxv5T|G1vhBzXK-XEOQ7t1PWc8i2Pr-T{ zsPAX$m2O8^l7WUtdaGS<1|?~Tp5Z8V5M@LJ={h0?ppc5y&<{ZvnyZ{t^tPl;QR<;5 z%47}|9IIkIhsp-ZgCoI&BM${ggM7tb>ma4&P_{73dp)7&5CRH32_^xrAo~UAF`!3> zvyrVhi^{M39DKcy2x`+e;0r;c%moMS&f3~1=sMYsMVu8p6zxI2(vBbZw;;Px#%l>>XZ9g?(7(K+#&)=De=&~A@>j0Zc0IOs`TH2JhIk5dVWo8JY zM(D@;aJzo9oLnX4if)1Z6GZsl@ksYz(@~~vrF^j681;O4h|bmN)cG{s;#9V}SE8j_ z2YJ|qWndET=;%PHM>fa24yYfJB*LJZs%G``uFw=-W@*x%&wH4ob>?XyY$Auihst z%NxWRN zI!DhBSR?15Vk}tZndNF+lpve$f z#T$3pvU?mYURz*-b*mrx5YfQ{A3_)m@O-HKgKf*hEMzyV}I6X0A*sq3&bA+q}@`B=i zO^B}hMYseuqV+I?!~g&>s2977?_%Wtm|TYqv0u_%jMeQA4Wa|eeNW)cP=N)Pw0ZO9 zzmT=QJ=nQ-xILE_uHBz$x-l?{^R)-49?A`u^pF59<mJmYc$6D%g7_;Q#t(YD| zVM*03wm@s-*WI8|Xzc2P=q~H(TKEi98exjTIm);eHabeIUk)tL&RNtP`_Q^1c*dgR zHXvpvr^*}ur8K}fqhdf`hP1-j$5->L4dbl`zRJQo=8rrTHUaP^`1R$nTSUN?O}>%h zk5Bh^WA^hWf{v+FIF6;{o_cQyT~ijixj#Z&R}&ptzEH4b#P-a{<2rJrV#m&%CkgW{ zY6_Jw^F7Q!fvKRm^MlEY`XV=%QiSujI-l}qV0&Uj{pDnPG1>s)5gXB;ar*P}nSb{J ztQj$Q>tUZUqRA93f~^6gI84Axw9 zP^}V;0&hULhVQQi%M>#CE02wJX}Lt#nEWQw1l$XPv@hbpN#{Se!K42ITb%BE({cG< zgVFeAqopg#N9H<@J82`j?dJ9?S9WW;>%V&QC|u_WEnkS%*Tdz9Yd`!<9phfKz9f@U zP4B$yJ?I<^^CqxQHS?Y@@0xfuDVB8k`30le0MT- zrRtt58gi>M@k4P+4_kxi{v*;f+I(5G^KGTDxJZOK@}u+oaS|K4A5ah8^3=}57bDc0 z5Tf%uzYy%qA6dN@krj%c*M}Ia?2Gp(NN{~2+}%4DcNT#!vbpYz(Gkf;ZHI|p4-wYz z(7OmBkQ56M^TMS|=dWF(B`n*w`56fx=51)qIOmZR%`_eH!kG#tHADoo9gnAXBKwYa z7SLlpYFh+mz<*+~s+EDbCZ8Y?gZt1ylOiMRZ@^>^9vX^Qr-0K@b?+N^!fnmYE(%ay z3Tx2r{rh)H?FP=Uecf!Mladuuo}TM?gYxW!ix)q``DleY2)csz;u?0GD!5zJy_q16QhifR(I9RC;dDRNd2JRI zV2rZw7WHnLr*>16Bq5J=v9H10Cmsqt71(mLILnTc!Yk63GXj-}SRgjShy`n;KYAbg zPy;T5=_xAJ1{cHY5O$(Trve2Gg0SFi3#qMR+ejXS|IQFnE(-ZExAG)*N+m0FCv!|+5F9*)gW1Bj~0c|8Hp&p;29}MdBFuJz67YBF7=_V1mPlz62uaaS>dY^QRl3p)%?ngr{Ccz z8~+*A&vev1O^QA~N!d2u)3b>!d4=AwBXet};?_(Drx;)i znJ)la-4l#L90CDcI_yLpo-~3UwaEhbC-@jBeIGrN!g8H~MQxBX{@QV(mJGKZE3)_( z0Fhl$iay}QY)6i4hjZik7eRLR%|t^AdW-mAIu1_h2AGv4R?~K@L7Q>y$A9hZ1FLpl%7k>@87>s?)qoXR$XjFduN)QWBpKFL%It z?m-(yb}b5nzIe z9eBfrM~ngT(`R%SrQ41u6S)5^Oa?dJtKEZ!(g(E#!+>}zguxz_<$xjA)p?1%ye26qtlFaOy(5ghDwF>;Fqv z6?p!hfq{nrXM{n=n(+q&XSGa&o#2Dsc+r5+rw9X`YsdGYTX-7QZ;s=~$+2@`bSpv1 zn00$`VDnb5&urleN6_XcHnWLY`VcjM2G+f|Z2Yr)Pc(@-Myi!XY#KEBgch$3bn43zsjK7fcn6jgD4t$8PY|`T`Fa za{m_;9@EX+&mcIW>TwH`s#JLEfUy2koaGz8MTc5`E%!dE#2CzKH3RX*3l$9g0Fs?o{RI8PdKNq|B516 zR$3+qy$3<^+a8|l`LR4`rTAy@*_u#DelrYFHAbf)1jV(CX=^L7A18g%3HVq)G&W~g^i53g{#q(dDRAc%*paNAM-`jLRQD026Zu- zAjO;;x#!}Zrrv9JNNDf-=Tgi=_i^l|O0SOfqclP8ZKdsP{HIxlq-O`lg;WiBe~$~` zw@%Et7|ed&6{}=xk4}3-P zEwY%USdjuX`*F}A$^Reg?mzoVQ1XehI5k;LrMC#jjxQ?j9&!A$;P>V|bXYLVA?50> z^Pi6*mi@~oZk(bko$g_7cPZ|(1-UTZ`%Y|-%v%&a9quAyI`mr)%H3|?{ONURBysqk zknuQk7xQcl=HT`$YAdYR-Car?HT#JtsS+=PukFuDMMTMZ0lVU1zmFzW$2Db6#99e& zN?W2BRvEAoEI2pgsH}F;N0``>(N1mWJLrDjNZ!X}x%qT&in3#Sfyr*GxnN)IT+jV8 zn7H_zLiSU9X<)qe9~o4U8W)QW0IeiM0exj*ZR>q0Lyrs@97ZagAwt$BCH zTR!3VjERZaGx{se&LV)g_mC-xmuM07XfXQdG`nJW*nndST1QV=bO^zabzIl5<-NKW z8Wi`n7d`ToFYwsVtC&qTIyAgNKGShuto`Sydeeuuvw!FE%fy}QFk0HkOie|M7pXSXymLUm zSu(l&{@!C>*<18xE!CwgBpoL$Te98%tnPBP>lcjtTLTz;2q;=lc)L{AblqXZPlW{nHUg&-jCiq%7#AS@0K zSCoBy<-^<_Em6*BT}Xz+0%db$w3HX)zIry!*h9%D>PKt|CQZ1CwTfK#LmoPU z^2rsH1d?iSD;YLJig;ZSJ+gWzS}O?qKhd7;S#59*5CcVvhmZ+wq37l{G#HH>vqzxK zx8VCEk~LwcfsK`TSCksuMGXxNd?+*(!U;!wN@x^B%j<2_ZSG0>=%f*V1mi)52C6M! z#9w@AIMN-abbjL1R;@+6?Ch!^%{g!15lg<*Y45gbAv=>Dot7wBq^P5;@BFW|E9Q-})Ar>umK*>^dHU7i>Xn_l83E3fK+l{pt1s z^^_ZgIEp+ki#~VL=J$_aabri0Ir3sB3Gg`sUTS3Ecoezc>K03&OO`|;lvaRrAGFcq z{`TUfC?$BE(9JUu8MtH4AbG-036G5|fFXsrqd6WC9eI_1XZqkM@dZse$i+no^1>a> z`^dNIVI-B=w}-dB37x3%i`VQt(&S$}bTikcB{RRV{YBkkeT@I|T^%jCT z8uD|@#kudZ#X`U)3UMe-QQ~z4=&z>+Ly>`k#UkeD30xyTuw~1Z8FZy15t6FN30^${ zV=e`9?9ZRq2>wDSELdWAX^THV@@M@FP+=OpU`Yl|A_UFa#ow|edyHm|eG%r4@6`Qs7y11-eGnI7XByc|uxPT8xn$+&C4<0;V zJ9KC(6b>1bm_XWh#onIVI#e6sgWf(Nu4J^>ZIybexczadoNrV?~$n6ecAlQGG*wa0iTo1kHk;tE?(aT1ER+C|>3EGkX%^hap}Z=mX)8 zosaLz^3d2AMUebMLLfz-i~TQgyh36p&|haOD+wvprc)K19CpCX5PM7{VVHv$&;4Uj zO8Oe(^#;0wzqZES*ZeG3D5`QYpA+F!IQmtlMT|LFDzKUq0F}8^;1CRUI4S3Nf6yUp#k?G zs(!Q{AU~oI>IqUjkSrh$ixYG&24Hysq9Yk(RVylUC`0%VjXJml)Y&q0H9@YYC#mbL0zVgStglp6Rh@-gcM`YgYF-Ta zB|K!?fme-{fZq{L>GxWBdmyDtL*h)ZTU%WvC_WsKB%DAB zSo#NEo1?WD-#C&EQ3&>=S2zKjdt69= zQ>!KGij&rU3AnyH2rx1Gyl>J%J@>4GfkTX4avSBPH#_$Svh=>HW|kcNMrX2-b-&?9 z{QaHq@&35Ye)4qp2@vc-(y4MD8cNH_Y4CK+M%MM%p7% zaFjf|+hOym>9`HImnT%IKxP0}sZwTpDXrW5HGpr9zcpncr%diy4bNNallcdCWoowN2dD)Kwo4Q0S|NedH zgTB5G8s-`HiK73y35^Ap*b_nO)R&Q`u5i*~j9?Ntzw+S_f6KzIYZb`L>tx zhlw@(&nynMvI~YOyh>@}e#{Pv2~`V!q^}zI5o7$&jN>OJi2u!Ha;p_OFgoQqX3`dX z@|HG(+Hxi4-T1c1PsF>YTE0cs6=pFJMEWAP^~zZPf+XgrJ!& zkJhd{p2~EOzobLSuEBggx`&-46#zwdU?{I}(K<+BcJq~z-M zljWe7ze^=~`?t-jD)3p2uHN2%J{5-NZObJ4{#&QWkIZ!Kztvv$Ffs=>>G$wLE#VIj z599Tc|0_uFpN6%+LJ`+?@dc(9KR&Qg`_8lbxMTxWGZq0Ptoj6K;l`RN+X1l}18>fJ z&gME*g?H^?_r4D=H7Oh$dmZgvRY$tkWF!oHOz!e*LW4>AQviP1z|M%C7Y)aNCHgBr zaE_)Ru|P>g0b0z453X$%j*HLWgv8*8LjMEvEkE3;Tfm(kc{c_Q{~0iR9AeNmhw6_U z1${@FxN_gO;+2(^q%TE+B@YT1Nnk^x`_}gbAa57&_&ew39u7Z&Js4IN<<2Pxo8y5C z57-5$q(wyV5hx<(vC+U)vj@+QNPm*gl?s}_E7G zJaO%<0dx^n1Lt5`ksemjN|`ts+7Ln^Q8oKCTo7nM0cLyc}Ibv&}a8SOQ`!d5EIJbW3aq88}*c>1XTR@_TY|HQj!f(0WNMq2%gK5^Ih4Wwp zASn|W<)d}&`>~)7Jh?2y%Nyh0wUME01!90KW-QS>jx@Lf9XxRKuQvU320U}{{1ijh zhbC;$eh{DlVfF~yhuxL+!>sChS|AT1x$Ap+6evp|d4K_Ni*+vqB2Ci4N=r$F2e5x5 zE=4X8a~m-mSa*7Rc&KduRsz;aIh+W)g;%d${b*zg1F1Xv{7FbSdI9wJ1RD|9!n^;vT!bqi71CYjBKbu{%do9ifxci zJ3I^0GYo0EPYxeR#h5r~$3^>C3&a-F;ichV3owaX-As^I1vqP|Hv8dX&lF=g}@&d`eGW8}lRRO$>|Qc5qNnJ+;l<+dZ@-W5RZN z*dq!9iiv;ppO>JYP_{zjgHeYnF+2nS3I2vS@USk3g|N8o2m%beiDU(vB6b>p0ZRzu z113Zu&pH}I#n&1dZCOdVYbx|xGS{>^*X`aKQvY~zlh>60(-e2hydwfa!oJ?E6Y5~6 z$R&X~@Ish5S^p3mHG}gKm6VJCz2J<~R>!NCqMTvu1^inNT7hI^V~zl?ErLM2#8}2M zF*!zvEMl$+UICuS;ms&=c=*81Jp=!J(xUAvEf2mbClR{pn-K61%8A@UKNuewukb`L z1XYxJVnKgKc3o~Kw&E58{+MM67j=J zFz9aqXmKNG%3}^mE6JM!z5|gT4o}Le?vRY!cG{N!#@?oq7Ys#%`tdUp!=wAwwGS8- z+PVQ8u~fNulo)S9=7XSSP{8cXo6r$924HRlZ3%qYLixB3 zcCe3k+rPSXrz;kf^1y*B_3pL6{`6M-G+VtmTg}^1_S*+LisE-8-w_~45sV?u)TUP= zbngDh8V`(Fpeu^w-3C&Ulyf_G&4v5) z#rH#;dRP?RqD}U7S!XZJybqz%G}wBp_EvWh|nz=M#B1F^!1nz>hZc zE+0l9$UTD`#XqHCNW>L%h{u8-{Bdw-D9Nn{9I7(a|GC>6(k8eXT%hC;<{UqMJoaNi zlPi?NGgEJ%c8y*!?dLD<&egUcB^cEch*qD?vLp0@f|pJ(rV;`SIEU=(D`qD7f)kqI z%Q*gveAIy_013FU0#+KA`t^8=aJ#6}P`^pC|#Up9wRqAX~Cm-0bF<_A}#z^-{ zLyLZLzLL;2L>m<&Nkg`iy>j_d#Po(@Pq{&|(l&tt0=Up9XdcQI5kOf@xHsuVsg?b^ zL9ULY-kKD3nk&jkN%0rj#zJnbdm#?b7+Y0NMzGNZSX6oNr|b1XUNM~W7TNE6s^cN? z$wGtBMlpz3%|FZZ52@3cnF_E8jox^m&F(u`+H}(TXzbJUNOihFeZ+D@d11wuKY41p z-rKBJwQys%j>_kw+Oh7`*&ov?&VsM5}CfbX=U8uaqZbD+InE zN(rLTCtWGDce0!Eo&!?Bbb~}ZyDRfLKKRezS80Gg*0s-|{^Bp%&OS6Ut!xF%_ zxtAg zd9vRes)AO+7W<7UTlPzPkd3)x!d~-Z6xF6Ru3UWa?33QxmC!Tt!v-&{Q+lo1e%5J(<6lv=Rj zF&`bJE^y>8xu)`G9G9>7`Ab?>k*>aI9;aXE2W|_qyGd)q$2ifW9$GrVQ^HN(b!U$F zV-WP+41?j!^r)&I%VwdAp_$k2_;r!f_lKCDa8?O(HflD05T?8Wgmu!t=%+ zr;@{ugT&viPN}#z)_1+>(IykwJ3Sa^GnP(=zc72DbtKh)hli4;j_78Qy)`J%xd#t+ zsLs&wf>`TF$u~eUxRuu3O3F$q2O%H`@LQR2aC(xPS+*FP{h*3}U)!JWu;$&&8Y35_ zPVF8Z1W6@kweY`k(ErVN`ERECFSIonK#}PRwXzl*qo|D>71))Sfg5GwEZ52hT=^SS zjrZW!iZIIy0}4VHh`;+ck{aA$PUnc2f`Z7+t`%kWYJP=+V3s9WV&DtV`>tEJ4sp;X z;H7{&Fs*#OJIEb&1o{L96(#@(ph+MHb_0%mKI59jB>`g-zpw8*BZ=?rp|-IsnAc65 G!~O{Y%wvcE literal 0 HcmV?d00001 diff --git a/lovelace_advanced_example_multi_cooker_1.png b/lovelace_advanced_example_multi_cooker_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6925789dae5b1d1b3e1fd2917db8f480aa2462 GIT binary patch literal 18318 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 literal 0 HcmV?d00001 From ecdb9c8134103e578155a389308a226bfb9e9c26 Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Tue, 20 Jul 2021 22:54:37 +0200 Subject: [PATCH 5/7] miio custom dev version --- custom_components/xiaomi_miio_cooker/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/xiaomi_miio_cooker/manifest.json b/custom_components/xiaomi_miio_cooker/manifest.json index f0ba2ce..c2bc4f6 100644 --- a/custom_components/xiaomi_miio_cooker/manifest.json +++ b/custom_components/xiaomi_miio_cooker/manifest.json @@ -8,7 +8,7 @@ "issue_tracker": "https://github.com/syssi/xiaomi_cooker/issues", "requirements": [ "construct==2.10.56", - "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.6" + "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.6+sschirrdev" ], "dependencies": [], "codeowners": [ From 5be452a32815c8b8857bc3c1dd3f214ec948ae6c Mon Sep 17 00:00:00 2001 From: Fabian Seitz Date: Mon, 7 Mar 2022 09:18:58 +0100 Subject: [PATCH 6/7] Bump upstream source code to 2022.3.0 --- README.md | 13 ++++++------- .../xiaomi_miio_cooker/__init__.py | 17 ++++------------- .../xiaomi_miio_cooker/manifest.json | 4 ++-- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4b533f4..35e7871 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # Xiaomi Mi Electric Rice Cooker +![GitHub actions](https://github.com/syssi/xiaomi_cooker/actions/workflows/ci.yaml/badge.svg) +![GitHub stars](https://img.shields.io/github/stars/syssi/xiaomi_cooker) +![GitHub forks](https://img.shields.io/github/forks/syssi/xiaomi_cooker) +![GitHub watchers](https://img.shields.io/github/watchers/syssi/xiaomi_cooker) +[!["Buy Me A Coffee"](https://img.shields.io/badge/buy%20me%20a%20coffee-donate-yellow.svg)](https://www.buymeacoffee.com/syssi) + This is a custom component for home assistant to integrate the Xiaomi Mi Electric Rice Cooker V2. Please follow the instructions on [Retrieving the Access Token](https://home-assistant.io/components/xiaomi/#retrieving-the-access-token) to get the API token to use in the configuration.yaml file. @@ -161,7 +167,6 @@ The following is an advanced example for a configuration of chunmi.cooker.eh1 su ```yaml # lovelace - type: vertical-stack title: Multi Cooker cards: @@ -235,7 +240,6 @@ cards: ```yaml # configuration.yaml - sensor: - platform: template sensors: @@ -265,17 +269,14 @@ sensor: "0505000000000000000000000000000000000009": "Cake" }[states('sensor.xiaomi_miio_cooker_menu')] }} - input_datetime: rice_cooker_schedule_time: name: Time has_time: true has_date: true - input_boolean: rice_cooker_schedule: name: Schedule - input_select: cooker_programm: name: Modus @@ -291,7 +292,6 @@ input_select: ```yaml # scripts.yaml - rice_cooker_start: alias: StartRiceCooker sequence: @@ -317,7 +317,6 @@ rice_cooker_start: data: {} entity_id: input_boolean.rice_cooker_schedule mode: single - rice_cooker_stop: alias: StopRiceCooker sequence: diff --git a/custom_components/xiaomi_miio_cooker/__init__.py b/custom_components/xiaomi_miio_cooker/__init__.py index 60094d3..a99ea43 100644 --- a/custom_components/xiaomi_miio_cooker/__init__.py +++ b/custom_components/xiaomi_miio_cooker/__init__.py @@ -1,18 +1,9 @@ -import asyncio import logging -from collections import defaultdict from datetime import timedelta -from functools import partial import homeassistant.helpers.config_validation as cv import voluptuous as vol -from homeassistant.const import ( - ATTR_ENTITY_ID, - CONF_HOST, - CONF_NAME, - CONF_SCAN_INTERVAL, - CONF_TOKEN, -) +from homeassistant.const import CONF_HOST, CONF_NAME, CONF_SCAN_INTERVAL, CONF_TOKEN from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers import discovery from homeassistant.helpers.dispatcher import dispatcher_send @@ -106,7 +97,7 @@ def setup(hass, config): host = config[DOMAIN][CONF_HOST] token = config[DOMAIN][CONF_TOKEN] - name = config[DOMAIN][CONF_NAME] + # name = config[DOMAIN][CONF_NAME] model = config[DOMAIN].get(CONF_MODEL) scan_interval = config[DOMAIN][CONF_SCAN_INTERVAL] @@ -233,8 +224,8 @@ def state(self): return self._state @property - def device_state_attributes(self): - """Return the state attributes of the device.""" + def extra_state_attributes(self): + """Return the extra state attributes of the device.""" return self._state_attrs diff --git a/custom_components/xiaomi_miio_cooker/manifest.json b/custom_components/xiaomi_miio_cooker/manifest.json index c2bc4f6..88c2a29 100644 --- a/custom_components/xiaomi_miio_cooker/manifest.json +++ b/custom_components/xiaomi_miio_cooker/manifest.json @@ -1,14 +1,14 @@ { "domain": "xiaomi_miio_cooker", "name": "Xiaomi Mi Electric Rice Cooker", - "version": "0.2.5", + "version": "2022.3.0", "iot_class": "local_polling", "config_flow": false, "documentation": "https://github.com/syssi/xiaomi_cooker", "issue_tracker": "https://github.com/syssi/xiaomi_cooker/issues", "requirements": [ "construct==2.10.56", - "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.6+sschirrdev" + "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.10+sschirrdev" ], "dependencies": [], "codeowners": [ From 548604521c7cfaf6c753ecbba9133aefc14cbbad Mon Sep 17 00:00:00 2001 From: Simon Schirrmacher Date: Sat, 2 Apr 2022 16:57:02 +0200 Subject: [PATCH 7/7] custom python miio version --- custom_components/xiaomi_miio_cooker/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/xiaomi_miio_cooker/manifest.json b/custom_components/xiaomi_miio_cooker/manifest.json index d62a53f..bc018ae 100644 --- a/custom_components/xiaomi_miio_cooker/manifest.json +++ b/custom_components/xiaomi_miio_cooker/manifest.json @@ -8,7 +8,7 @@ "issue_tracker": "https://github.com/syssi/xiaomi_cooker/issues", "requirements": [ "construct==2.10.56", - "git+https://github.com/sschirr/python-miio.git@master#python-miio==0.5.11+sschirrdev" + "git+https://github.com/sschirr/python-miio.git@dev_version#python-miio==0.5.11+sschirrdev" ], "dependencies": [], "codeowners": [