From 3ddef352fc9a07b09bd4664fb847d8c059cc22b5 Mon Sep 17 00:00:00 2001 From: sudoxnym <76703581+sudoxnym@users.noreply.github.com> Date: Thu, 16 May 2024 19:55:27 -0600 Subject: [PATCH] 0.0.5 added service for alarm --- custom_components/saas/__init__.py | 64 ++ .../saas/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4346 bytes .../saas/__pycache__/button.cpython-312.pyc | Bin 0 -> 14654 bytes .../__pycache__/config_flow.cpython-312.pyc | Bin 0 -> 8542 bytes .../saas/__pycache__/const.cpython-312.pyc | Bin 0 -> 3602 bytes .../saas/__pycache__/sensor.cpython-312.pyc | Bin 0 -> 27176 bytes .../saas/__pycache__/services.cpython-312.pyc | Bin 0 -> 5240 bytes custom_components/saas/button.py | 575 ++++++++++++++++ custom_components/saas/config_flow.py | 126 ++++ custom_components/saas/const.py | 154 +++++ custom_components/saas/manifest.json | 10 + custom_components/saas/sensor.py | 633 ++++++++++++++++++ custom_components/saas/services.py | 73 ++ custom_components/saas/translations/ar.json | 75 +++ custom_components/saas/translations/de.json | 75 +++ custom_components/saas/translations/en.json | 75 +++ custom_components/saas/translations/es.json | 75 +++ custom_components/saas/translations/fr.json | 75 +++ custom_components/saas/translations/it.json | 75 +++ custom_components/saas/translations/ja.json | 75 +++ custom_components/saas/translations/ko.json | 75 +++ custom_components/saas/translations/nl.json | 75 +++ custom_components/saas/translations/pl.json | 75 +++ custom_components/saas/translations/pt.json | 75 +++ custom_components/saas/translations/pue.json | 75 +++ custom_components/saas/translations/ru.json | 75 +++ custom_components/saas/translations/sv.json | 75 +++ custom_components/saas/translations/zh.json | 75 +++ 28 files changed, 2760 insertions(+) create mode 100644 custom_components/saas/__init__.py create mode 100644 custom_components/saas/__pycache__/__init__.cpython-312.pyc create mode 100644 custom_components/saas/__pycache__/button.cpython-312.pyc create mode 100644 custom_components/saas/__pycache__/config_flow.cpython-312.pyc create mode 100644 custom_components/saas/__pycache__/const.cpython-312.pyc create mode 100644 custom_components/saas/__pycache__/sensor.cpython-312.pyc create mode 100644 custom_components/saas/__pycache__/services.cpython-312.pyc create mode 100644 custom_components/saas/button.py create mode 100644 custom_components/saas/config_flow.py create mode 100644 custom_components/saas/const.py create mode 100644 custom_components/saas/manifest.json create mode 100644 custom_components/saas/sensor.py create mode 100644 custom_components/saas/services.py create mode 100644 custom_components/saas/translations/ar.json create mode 100644 custom_components/saas/translations/de.json create mode 100644 custom_components/saas/translations/en.json create mode 100644 custom_components/saas/translations/es.json create mode 100644 custom_components/saas/translations/fr.json create mode 100644 custom_components/saas/translations/it.json create mode 100644 custom_components/saas/translations/ja.json create mode 100644 custom_components/saas/translations/ko.json create mode 100644 custom_components/saas/translations/nl.json create mode 100644 custom_components/saas/translations/pl.json create mode 100644 custom_components/saas/translations/pt.json create mode 100644 custom_components/saas/translations/pue.json create mode 100644 custom_components/saas/translations/ru.json create mode 100644 custom_components/saas/translations/sv.json create mode 100644 custom_components/saas/translations/zh.json diff --git a/custom_components/saas/__init__.py b/custom_components/saas/__init__.py new file mode 100644 index 0000000..f72cc8a --- /dev/null +++ b/custom_components/saas/__init__.py @@ -0,0 +1,64 @@ +import logging +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from .const import DOMAIN +from homeassistant.helpers.dispatcher import async_dispatcher_connect +from .services import async_setup_services # Import the service setup function + +_logger = logging.getLogger(__name__) + +async def async_setup(hass: HomeAssistant, config: dict): + """Set up the SAAS - Sleep As Android Status component.""" + _logger.info("Starting setup of the SAAS component") + return True + +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): + """Set up a config entry.""" + _logger.info(f"Starting setup of config entry with ID: {entry.entry_id}") + hass.data.setdefault(DOMAIN, {}) + + if entry.entry_id not in hass.data[DOMAIN] and entry.data: + hass.data[DOMAIN][entry.entry_id] = entry.data + + _logger.info(f"hass.data[DOMAIN] after adding entry data: {hass.data[DOMAIN]}") + + # Forward the setup to the sensor and button platforms + for platform in ["sensor", "button"]: + _logger.info(f"Forwarding setup to {platform} platform") + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, platform) + ) + + _logger.info(f"hass.data[DOMAIN] before async_setup_services: {hass.data[DOMAIN]}") + + # Setup the services + _logger.info("Starting setup of services") + await async_setup_services(hass) + _logger.info("Finished setup of services") + + _logger.info(f"hass.data[DOMAIN] after setup of services: {hass.data[DOMAIN]}") # New log + + async def reload_entry(): + _logger.info("Reloading entry") + await hass.config_entries.async_reload(entry.entry_id) + + async_dispatcher_connect(hass, f"{DOMAIN}_reload_{entry.entry_id}", reload_entry) + + _logger.info("Finished setup of config entry") + return True + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): + """Unload a config entry.""" + _logger.info(f"Starting unload of config entry with ID: {entry.entry_id}") + + # Remove the sensor platform + _logger.info("Removing sensor platform") + await hass.config_entries.async_forward_entry_unload(entry, "sensor") + + # Ensure hass.data[DOMAIN] is a dictionary before popping + if isinstance(hass.data.get(DOMAIN, {}), dict): + hass.data[DOMAIN].pop(entry.entry_id, None) + + _logger.info(f"hass.data[DOMAIN] after removing entry data: {hass.data[DOMAIN]}") + _logger.info("Finished unload of config entry") + return True \ No newline at end of file diff --git a/custom_components/saas/__pycache__/__init__.cpython-312.pyc b/custom_components/saas/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b2206af9dad37f95cad3e0504f83c6e55625013 GIT binary patch literal 4346 zcmb7HUu+b|8K2#oyIZf%XP=FY|HODv4D3n2s?*KmLxOt9NxlLlAGWple{pL@4^ z+FgV0>R1p^ZA+2Ts7)|RQh4COh*qI}DCVW$hbWcG!(DySSz9bcY9E@nQ%xkoQ@`20 zy+8J~=Zv&7J2T&WGvA;2ec$}8riMjOhVBo9n&9uBq+=DF`&s`Cey$?{2~-4)k(Q27 zQF@G~$iFROi{dd1|5&g`>`}*6`z1|@L$~I% z92Nbl8df!4(!L>kz^LQYkB9t&guIzo<5Dmngw+_Y1t&x$5R@fJ3~Dg9&74z3Z7LQ} zMde~RD5^T1;8j(302yo(q|HMcwGHa4@U0()>UBhc$~0qwRFhF;1Hhxe>pAgzMr)BBB`M{3_>{1Vs)D+=#|&Qz{pfqcK?$CC!)Ugds%> zOXHkzTuu%Z805)Dy|nHOMC9>tQPFW&3dvqtse(f(#0OL&3&%a*+il9$9h_1%ISLBN z?V@(8Jg;^K0%0kv1p>ZUT(2%tkx~om4MxPi|3=R)qkrM**|S&9COxmD@sZW)+V522 zQtxkXp>#VOTZxzG&k1ve{{8~GnnknJ)^s>eOfkO*$xkxF8VRf0^mA&Q1x5Bmjd3s^L3LZyqg?p*)1luX} z)&N59(G_^(Y5G$n*gv8 zv+AzTxOb-9J2P%y%I#a6`eNqJ%!<1&!}R@~>3gmcAiCP;ucDSI%J0O>v;+QiCXnNw z*sdKNZmw5)gEcDNIlic})yxy!s1;Tvols90y+{ z4s1#ejtF^(Lad|^1A4I;x{1Y>B%IUlJ^8KDa^{nnc@Wq)sXXfySRr6K9-JN1u7IxkA-SDLtuayoo^et%*;}7DG zn^MPqlI;6w(sM42N3sso==~4Ec6N@j%(Z>r;_1bndl!<8$I{I4RmPQJcBGgctFF3? zt0U#=$heNCTt}C7J!)QYo%z;ASFu?;FnH=hc9)TPG@N*J=&Pg4M<2hDIyss=aX#sJ zBaMId)M3qgy3*M9gx#^At+1UL+?m9kPpqVcO#S~Oe~W4Rv8N2Ow=ay|4&8cl@y&bU zed&)<^5y>IivxdkrSW--f#*OPAA}Sr+k))7o~tB+Ttxe;ah(OM%vodpWZ?)R3R=EWlhst&YGqv!Dhv201I3S7Fsn(VHDsXst)6yru+fajqEm>|5EnG?S{Jd4~nJ@EULe zy#CIBS0>SPULxqqZH%Ped^nmi2_We&#-XB6+I&uo$`{S&0SS`%AgBnw~dQAn8ZRjsOh$t9JAgl z#5r>B6%*s?P0l8-9LVhkA`$`AKSNcDalK3DAHMzI?PM>!O@`8VxCjvTrSbk%)}3M7 zQ*3*NJ(6ONEHyr2R#-s5!6Y68Ql|dbo!7k|d9QbU)OFjjNUzlI`~7Izc@Xd^4|*A< zJ;k&yh&QDh(xQ-NUb29o;rOF%U$rc^JU*QApGzJeNqR;BCi0+jFpXa#FyTS=Gn9!F z@B6o(?4g!hsFO$Va_fl>=y>aOCwa$#MfDdZ;E4;FlKI5-l}1~IWDt7&MiNC-$eT&G z1GSpdGFM78Ax2`N0{K_|X>5cYov~6CBNXXXV5PI>i;@WhBt9wz0%r80p%HBq zVvRd!9cpBl>^ajLm4&H@*ryzTG4e83gHUB{6h-|5x!2I4HMD;XwXC83HMI9@wry@t zhHXo+Z40MY*j<;MS!|=~7KXA2ntO-VNt0!FQgyewvIv@`>UGj&2Pij;{V0o|S!#Pq K8s&$u&wl}15V&Ii literal 0 HcmV?d00001 diff --git a/custom_components/saas/__pycache__/button.cpython-312.pyc b/custom_components/saas/__pycache__/button.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..944502d2b137ed74be3f883cdf384c53b96fac02 GIT binary patch literal 14654 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 literal 0 HcmV?d00001 diff --git a/custom_components/saas/__pycache__/config_flow.cpython-312.pyc b/custom_components/saas/__pycache__/config_flow.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7ec5d18d046e72639262833bd27b5eb22f81446 GIT binary patch literal 8542 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 G*#7|wK>L^g literal 0 HcmV?d00001 diff --git a/custom_components/saas/__pycache__/const.cpython-312.pyc b/custom_components/saas/__pycache__/const.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35bf02920edf5aadfbb2a0cbfaadaddcc41d5aa0 GIT binary patch literal 3602 zcmaJ@&2Jmm5q~7Lq$GZe6sd2mY{xcbS(X*~GyYnMl%kj-Ws-7WqQzp(Sxc-)F1x$3 zBO)$z%%MO6vxN*IsDkknNrX^yC|roXSf(vrAEwW0a77J2P))-n@Cg z_jdp3_YX4s{r8*I7x4&V|0d<+7wQPV{N2IWcMMpOfuraEXVD3+q6_+peZUnta2MU+ zDSDv4*bf860T?U}g16`eU(tvEe(*zJ+gS{3GYJ00Q4B%|!Z38`M0><~Mh~6E5DY^M z;xGcEFb3l=ap)9H{d4XEx3(%2ks(%0{0N_!vn;J@CXE~YZ+D`2`N~GHTV?P;WKy) z>BGQZ9mR+o`Ca0qL8s5Zb;Kn5ntkmkxyr2M{B1vDzi~45n!R>>>G+a;>-^(jA1k?D zJ6^NmFigYE?ra-}?qaNGw#*?{jKe*6fE8sAUBwZro=xo2C{}eDW?>HIVF4Cl32wt( ztnSI7w>Snf5P%DC5psup#qs@c$?53K_lhO*je9FfP1B{CuJJDvmDhJk@jEYr4FxN_ttT&6|CiBx#Mw{~OVWc7~tIs)kYg!u-Pgb+fM~ zRb?}vEA?_o)a7cuBI&Z}`n{r=0qK>rD~qsaPh$o&D&RBC^Q|l&>ALS5#1?(r&r7jq6eBbr}*|dmy9eyyaxNa&oopO_#TKbh`uX z!6fy;iv2(eN!4XAIqHp^NjOy(P3QypWw|7arHZ6!rn`zIDYb;t}qn}DwPuri~t5l@t`@}}9)px2Y^>*Y$d#Y6SsxqI% zWvc;-4N`10zoWe3yNl>dIQ$+hHl;mHhF@(pwgXdwIz;LGl+M>%Vk4ASaHsgxOSz`= z%UEF}+-q4;_O^G@b~UJn8RnCPS_E| z<@M6VjO(~8QCGz0GKhAJMC?>Qrm4a`7JF4^DQqzS+Y#yYgAT7djP1}Iy@H*Zkiue( zC>(r`2xe46dWhPIgI$n%jY@H;auu(J)CS%*#7nVm^Ky{}BhM}Vif2Zy(1^cclhv+X zogB?D9n+BImB|*?SD%RmA-9$)n6YGPRoF@w#P_D@+TWWgde*;_xobT$ zpD&-v`wL&8&GJuNJ!Q(`BD-+Fc(xH5i0Xy$M(^)!{s zcf7izk?uTesjktV&u(RsT{W2AO5+Ttb4HTu`NCFiS;(xM21SIlklPS(mQ0}=8ne?E za>B}EtoFo??|a9t>3FHpD}G_2ed$_Bsl6y~Un}itx>6NOO0}-k@IYwS=qrjwHGRIm z-|oLxRp_<*Kvgl4z7n)L=4iPb4#&UP^3g!>zf*~UiG!Vl>Mkq{jD10334>}LLKS%kf6U%8WJNU5E=<|QI z-*TaJ)Hl(by4m7T#LV0zDIQY#88^|KTxt!FGT0gMlHz0B_?v9YPjbNWnr{V32{CT! z%^zA}l7|>K(j1*{MM#MM3c@T(iGagrw( z7x^aBnk0G33SVeVlfpAD`iO&H!m+0>;yegqo1!yV4epd3>0`s^jfpG9 zxMbv@2bfEz4kcCmma z(rgkh?sosbn%!(Z^sr-RjXO8QzpJXNtNwcaU;SP6>#uWiOcY%9^=*BIS1Ia$qes4U zamV6sXo{MmJd}s_QV!`(J81B0yc(a@q4jAT8XCj3UdE?$=!l!~>U~*`ET6$)Aby?K z=rcJ?#I5&c`^*kAac6mRe7TNX;x>3KKC2^-xQ*U?UxA|l+$K-9x6oJQDDtgytn(E+ zihU)H5?`sK)K}&x^OZZweHD%hU!|kcSLLYkt#_>Vu@2T(?Wp$EIBI+w92oVatg51`C=IU2dfftMw>n!~0*783E$Ten zYeO77FLecn{cfkgyWE$Y_|Vz!7dZZPmshk(kK8V=*Xe~_2VH{uBF8)3 z0l%Mf3-HV$Jqr$<54!pO^O%jk-7oYD!{E|*Fbd;)O%Q&Itzyd)^=&7*T06Q$PCRBktChTaULpdwN@Y+k4_cJ)Q0CC*`05Rjjttr&@bEPIQY> zpcGFDw03m&wjYsVNV(~{PPDamia8{8XIJaVlO5ehzp>Yxm*y zL||)Y>!~hh`%CTJy-MIZDZ}1Vt%r|8LQ1%$^K@rt>!CABK+!39@l;Q|SW0k#Qm`XR zPHw5wNmLW}EM5f1TQHhA3P-R*| z!`nqyFenj_enBh@i`RpVO)v!d z`Y$xOhk`=D2Lr-481O?xu;a}4auy*XipA5lNlK&xsV6rAFO zA>I$oH{|b!$$;%>vx{bA*(tH?oTYi>2X2jU3u0z0ZwD$GrB|S;LWQcLD4~@Y9}6@_ zE$FHIs%g)U27WLw{Yu!<7&bKWTj5C(@7SQEJJf(S*ZIJZKw8Gbz25KU>^4Ts?)Sj(=U;r^ zShEa|MI&91$G*g`Lz2>nVz!hnjI6#uXq~EtRN>gri`a+9s3ikcRXfxBzT;g-xS}~+ zzIDE^Wa`+>WA`gI-!Cfrol$2sEl@h6DRUiO#f1JI$lLT=)NzVVs>=z@1ob_rX?ga& z3e(!Rpw_>ynbQ7&P6x5c?5eqD7^MYl5pqpX14>QGVHA})bij~^A-e>V>?#EZyl0mE zi90?KurkSoz7bl+GwECo)6Y@YzX89j|E#@C!&s|1HRNY6U*!BOHk&Za#v3)jp66JX z$HRH--ATh4JITL?-{O848*kI`ic%)4OdSilo6@ximxRbr3@S{iqyb~%x$FY@LF2?G z$ETry1KIM^#NDIB7}bnu#!6MG<|JatE)SEM>acc#8Bi)xjz>|M@)}9xr5(|JyJQ63 zbt(-A=@ca1mtAt#p{Zf*uokO-R`;OvsLSv1!ZgQSX1iYO?PYyjFzC9#1?>-tPjPOp z|8>rj^q_?mb=>RFR^1P3y8~Ee8_YqR>grI;6cxjmvascBGLruD#=@r zrdnSR#48Xd=EI+WS4AU~M~Wbc7aS2NP{$+@V~v;6$;XQr+N~PgQjVnWIfVcbb%)GQyeX{jkkYlDI6cYZ!Mm(+_Z#iUbuVZ?m(D*an5>b-ntIr zmR9~K=Lb2l5?iFicB?L0(mdWVZz%~|YUisOCYk?`J#Q_HS+_^5+dsDMT+mV0x-S>8 zPhUM$cBqn`HNYf4GzgPlL58C7*yZ_pAR+@*>yjo$#38&D$gGysAb%Dk7@bbH7jTW! z8N?a?T)aMcH+Vu-D_0?zTQQX{Nk#oSw_xHzB-a+r-4ruy3L7>pG5N+_OLoc<7wETY zKWvBsev#@4&FKi~4vmPq5txfj0~X?!Jo)*sCc#0-ImA+WHWGH(82VH;%} zq#rDzjJ=lMx}E+$-P*)VwW9MQ8{N8<`KVEk?yWS?Su-Lgl*vw~XmUD1Dq!z&ie{(t zwIP=`{v^xk^aR{aC*K6AiiSZx0M#fA^Ur~oNEiM9x{e^hN)U76HRR@CVS^y24?+np zI7qr4&tg<0`S1%~0P@8(>VGkZKV$T|>IEyM&;6Z7quaEo1=j+)77X#QMkTCK2`g8^ z%Hv^KI#WChT%YHc>jvos3MmmfBxht)xnv3bb>n^l?OMGq-q((^NsqJwIQFP302WXI zOOj(rdckFu1lSypz9b+^2}P6;pCW6?asdY&xrS*TJEAR10$p|BCS#1uY%ur18hD7? z3d;ms78BIZ+aOK?`b)h9yIrUf2UcoTDbOBKS8zL!RiJ%wIUszqg7*o~PX{8{9dKwb zvOrb>%M#G%F=MfW0DBiUrjy768RTb%#yEJS*&?k_3dlbPaTXIGzfqbEZdHUWyTXQD z>3k#4gm0|%mH3uHKEDSd@;G~k%<7JlnPr0JOEb0u&J-LZlM&Z%4qKYShNg6W*NE%+ zeaPj0Bq`XGOgy2oj4ToSjtd3;Ad<8d5%yV9S=e`;3}WXGVa_igNo5=-%Me-Cr!~I{ zRtNCaqewEce-)nme+QQNV^Hd6Xc#IX`FcEPnD2yC`4^EmfGAV3gc%6{3LVNg-ZG%7 zlKO{%JsU>AM^q`5pQDZ$Q3 zIFrh#0Fo(utr^KyAW3WYM?x3*lG+gKU=6r}2x&E23Z(cEa1%^GirSgB_m91MY-VrR z(i}E4r!$M=5r1Sw@sN-LRD;Ox3SdG~Z6>;i9dX2akRAU#lC-LOOn{*%wbck#n8hp) zX3X~~zzXH5JgZ>BpCHrEU_z2kZ6%lhpI4t|r5R0>U>UTGnU!E3=7ab|KMHCvP=RGZ zcOVz2!182w;;vSKNeVE&3!d`bNKOFh7MX7NzA|g%Phk)WGrkweX(R}j`InJ2AgM)i z2FbE`VP9(3eJH5#V@P|E2l5znOP^-YBi&vXE!hp4q_Pd;ZP$;_o2@Z(Q^ef#v3aYk zKB5k3=@lW$hBXxM4i;lYbdqP>wzTn4(8(5pPBtgdNs_q1mHJi8{3Yo1|1T+u6Z-Z6 z)X}9}%ZwGBdaQh#9nmIIaVl!>MA!g|%9Kkzek2vLO`ke~_>=GwKLNy+y~-%U{SlIO zF?l@M82+31=oKV5EP2>@LItroQHd+5MzBLk%Sg4fPgT#}!xtxk$l6)>BGYoSW!n9t zOFy_2EodA!{Mul-VV*FDi|x0r+!_cM?U^&QfW|eibjp0wJpFRiS~sryG}}79?>?w; zPfVN$R~@>$`)*^nqHE6FJ#Wqjjc-xuRM*X}SYchHux^IC^-{EO$GCAmyD*&1!q~bF zW9zWJbRYl)9)Nsf~+j97R@bF~CehFP(Buz+sNS4z!k~ImB2saInzlniJ z-iBWgwO&Nc*!!7At!CV+VDGI8_I?C4<5GSJAn||Nk+0h(!Ewyk4L{{l;5aTGo-`a+ z?Jg)L(-UqT=*3Ma@M$3q$UDE1qEXt6ASbzus`2ZGw2EE9>Wjdr3af9q)%&4i)^V#dY}pew>`6z*Uj?gM;(JTvI$Hs> zS1iXkg7+_w=VBnKANQNWmTh5!G&GXr(__N)L_eIV*$KA)KiK96k)*9Do&szy;fM4A zYFA-=*gE(OsIWi{|+;{j>Lsz8O`3N zhsY3i!BYJ9FfmlCWmdl-!r_tp7Jdo!+e^vfzC{uDEsD6`u7qt@!d6wkp}1e5kV^6% zbABr1eG%4cTYnJt`kZ(9-CSJSpZrSFUX|X{ri3Hk+*SOg$oq}hb(*nnq|N=0q>7V1 z^m!8Xy9QyuK4X(4M13>zcsV1FUqz~$Syi>HAkxVfG*#4i4WdBbiJYNoJ-zneiKH7W z1IO~)@>ctNM>JdMnG?C)g1H~enEO*8w+Vzx=UgSV47?z>Zf=+8))VP zWgFXo37Ac}Ml@el8%HFyZ8gjH_UXKg5bfQjeuZtU*);j${n+*goN< zVhGInslX6iVmo2Ll^tVg=+t_Jb$$il~7{HZ!RK zHij*@&+&v=Hj}N^)A#>XVe78d;tAfFbcEAL#p!*h?Oxpq5tl zL88eAsd0f@gRqu%0O2bVZ;GV;PsrSpSkkLnXa&J69e_;mg;M!LWa){n<)sZhiCm!; z1@6x<+k-Gno=VwEfM8_wMVs;`^zG)ody^6^*}F;|M<8RE$yW-(WaqWI$p5b+U|6OerTCQQJDb}ryx;$Xj< z92^3TStEp#htip}yXgH0$$v-k7fAjR$wnYSEF*5CAy?`#qtupEGy{K&-5%R*jG9lj zAW%^?&deD~=i~SLRSmau=c*21V0n^fzG7oMX8c}Q0!NaJ^JTSgv&3x=qzlSN`cjcc z6c3~+uW@MRcb53I!kyu%={oQnBI&}fv$n?crS%KVdv zsme#0j}lK4M_&dM?R?^C;z;@*f$gOcEl}o%jGQw~2^KkSrUUXLT2ErnAoDeGsV7`! zjWEEg;fMMJuOlF#F2MxGw|R8xdHZYP%SiY#scR2UO$_AAHJG@+PVwjANns*Hb`79j zFy(?&G=0i(ep-@x$`0tSsdU+-zRl{=4HE-61Neb6<%*ZDBqbQUYc8MClfTyT=$RDZXY@r{ZV5{3LPry)->bhF$dRprGLisIh`xOE9A_`zvft*xkL%D1pAMnYR7wlrzY5ygE;IcntY+<{= zd=SJ8F{}_^AJF!Y0TRFi(`=}Nbq9vL9@ZZa&{hUo5Q3Nx&Bc<}Su!Kr*&a?1U|(L` zSdkQp(Hi2}G}uEHB_nb!nGLhWMgn8jt3QWC6T!GZ+q_Hr(s z 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 rilb`LQT1NOlB4dj^=r0~>Y%= self.awake_duration for _, timestamp in self.awake_bucket): + if self._state != "Awake": + _LOGGER.debug("State changed to 'Awake'") + self._state = "Awake" + + # If any message in the sleep bucket has reached the sleep duration, set the state to "Asleep" + elif self.sleep_bucket and any(now - timestamp >= self.sleep_duration for _, timestamp in self.sleep_bucket): + if self._state != "Asleep": + _LOGGER.debug("State changed to 'Asleep'") + self._state = "Asleep" + + # Remove messages from the awake bucket that are older than the awake duration and log if a message is removed + self.awake_bucket = [(val, timestamp) for val, timestamp in self.awake_bucket if now - timestamp < self.awake_duration] + for val, timestamp in self.awake_bucket: + if now - timestamp >= self.awake_duration: + _LOGGER.debug("Removed message from awake bucket.") + + # Remove messages from the sleep bucket that are older than the sleep duration and log if a message is removed + self.sleep_bucket = [(val, timestamp) for val, timestamp in self.sleep_bucket if now - timestamp < self.sleep_duration] + for val, timestamp in self.sleep_bucket: + if now - timestamp >= self.sleep_duration: + _LOGGER.debug("Removed message from sleep bucket.") + + # Log the contents of the awake bucket if it is not empty + if self.awake_bucket: + _LOGGER.debug(f"Awake bucket: {self.awake_bucket}") + + # Log the contents of the sleep bucket if it is not empty + if self.sleep_bucket: + _LOGGER.debug(f"Sleep bucket: {self.sleep_bucket}") + + async def interval_callback(self, _): + """Wrapper function for async_track_time_interval.""" + # Call the async_update method to update the state + await self.async_update() + + async def async_added_to_hass(self): + """Run when entity about to be added.""" + await super().async_added_to_hass() + + # Schedule the interval callback to run every second + async_track_time_interval( + self.hass, + self.interval_callback, + timedelta(seconds=1) + ) + + # Subscribe to the MQTT topic to receive messages + await mqtt.async_subscribe( + self.hass, + self.mqtt_topic, + lambda message: self.process_message(json.loads(message.payload)) + ) + +async def async_setup_entry(hass, entry, async_add_entities): + """Set up the SAAS sensor platform from a config entry.""" + name = entry.data.get(CONF_NAME, "Default Name") + topic = entry.data.get(CONF_TOPIC) + awake_states = entry.data.get(CONF_AWAKE_STATES) + sleep_states = entry.data.get(CONF_SLEEP_STATES) + awake_duration = entry.data.get(CONF_AWAKE_DURATION) + sleep_duration = entry.data.get(CONF_SLEEP_DURATION) + entry_id = entry.entry_id + hass.data[DOMAIN][entry.entry_id] = entry.data + + entities = [ + SAASSensor(hass, name, STATE_MAPPING, entry_id), + SAASAlarmEventSensor(hass, name, ALARM_EVENT_MAPPING, entry_id), + SAASSoundSensor(hass, name, SOUND_MAPPING, entry_id), + SAASSleepTrackingSensor(hass, name, SLEEP_TRACKING_MAPPING, entry_id), + SAASDisturbanceSensor(hass, name, DISTURBANCE_MAPPING, entry_id), + SAASLullabySensor(hass, name, LULLABY_MAPPING, entry_id), + SAASSleepStage(hass, name, SLEEP_STAGE_MAPPING, entry_id), + SAASWakeStatusSensor(hass, name, awake_states, sleep_states, awake_duration, sleep_duration, topic, entry_id) + ] + + for entity in entities: + if hasattr(entity, "async_setup"): + await entity.async_setup() + + async_add_entities(entities) \ No newline at end of file diff --git a/custom_components/saas/services.py b/custom_components/saas/services.py new file mode 100644 index 0000000..d61ad18 --- /dev/null +++ b/custom_components/saas/services.py @@ -0,0 +1,73 @@ +import logging +from homeassistant.core import ServiceCall, HomeAssistant +from .const import DOMAIN, DAY_MAPPING + +_LOGGER = logging.getLogger(__name__) + +class SAASService: + def __init__(self, hass, name, notify_target): + self._hass = hass + self._name = name + self._notify_target = notify_target + _LOGGER.debug(f"SAASService initialized with name: {name}, notify_target: {notify_target}") + + async def call_service(self, service_call: ServiceCall): + """Call the service.""" + service_name = self._notify_target # Remove the "notify." prefix + + # Extract parameters with default values + params = ['message', 'day', 'hour', 'minute'] + defaults = ['Default Message', 'monday', 0, 0] + message, day, hour, minute = (service_call.data.get(param, default) for param, default in zip(params, defaults)) + + _LOGGER.debug(f"Extracted parameters from service call: message: {message}, day: {day}, hour: {hour}, minute: {minute}") + + # Convert day name to number + day_number = DAY_MAPPING.get(day.lower(), day) + + _LOGGER.debug(f"Converted day name to number: {day_number}") + + _LOGGER.info(f"Service called with message: {message}, day: {day_number}, hours: {hour}, minutes: {minute}") + + service_data = { + "message": "command_activity", + "data": { + "intent_action": "android.intent.action.SET_ALARM", + "intent_extras": f"android.intent.extra.alarm.SKIP_UI:true,android.intent.extra.alarm.MESSAGE:{message},android.intent.extra.alarm.DAYS:{day_number}:ArrayList,android.intent.extra.alarm.HOUR:{hour},android.intent.extra.alarm.MINUTES:{minute}" + }, + } + + _LOGGER.debug(f"Prepared service data: {service_data}") + + try: + await self._hass.services.async_call( + "notify", + service_name, + service_data, + blocking=True, + ) + _LOGGER.info(f"Service call completed") + except Exception as e: + _LOGGER.error(f"Error occurred while calling service: {e}") + +async def async_setup_services(hass: HomeAssistant) -> None: + """Set up services for the SAAS component.""" + _LOGGER.info(f"Setting up services for {DOMAIN}") + # Register the service for each entry + for entry_id, entry_data in hass.data.get(DOMAIN, {}).items(): + if entry_data: + name = entry_data.get('name', 'default name') + notify_target = entry_data.get('notify_target', 'default notify target') + if notify_target: # Only register the service if notify_target was chosen + _LOGGER.debug(f"Found notify_target: {notify_target} for name: {name}. Registering service.") + saas_service = SAASService(hass, name, notify_target) + try: + hass.services.async_register(DOMAIN, f'saas_{name}_alarm_set', saas_service.call_service) + _LOGGER.info(f"Registered service: saas_{name}_alarm_set") + except Exception as e: + _LOGGER.error(f"Error occurred while registering service: {e}") + else: + _LOGGER.warning(f"No notify_target found for name: {name}. Skipping service registration.") + else: + _LOGGER.warning(f"No entry data found for entry_id: {entry_id}") + _LOGGER.info(f"Finished setting up services for {DOMAIN}") \ No newline at end of file diff --git a/custom_components/saas/translations/ar.json b/custom_components/saas/translations/ar.json new file mode 100644 index 0000000..1e3a4a8 --- /dev/null +++ b/custom_components/saas/translations/ar.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - حالة Sleep As Android", + "config": { + "step": { + "user": { + "title": "التكوين لـ SAAS - حالة Sleep As Android", + "description": "تكوين الإعدادات الأساسية لتكامل SAAS.", + "data": { + "name": "الاسم للمستشعر", + "topic_template": "موضوع MQTT لأحداث Sleep As Android", + "qos": "جودة الخدمة (QoS) لـ MQTT", + "awake_duration": "مدة اليقظة", + "sleep_duration": "مدة النوم", + "awake_states": "حالات اليقظة*", + "sleep_states": "حالات النوم*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "إعدادات تكامل SAAS", + "description": "تكوين الإعدادات الأساسية لتكامل SAAS.", + "data": { + "name": "الاسم للمستشعر", + "topic_template": "موضوع MQTT (من Sleep As Android)", + "qos": "جودة الخدمة (QoS) لـ MQTT", + "awake_duration": "مدة اليقظة", + "sleep_duration": "مدة النوم", + "awake_states": "حالات اليقظة*", + "sleep_states": "حالات النوم*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "غير معروف", + "Sleep Tracking Started": "بدأ تتبع النوم", + "Sleep Tracking Stopped": "توقف تتبع النوم", + "Sleep Tracking Paused": "تم إيقاف تتبع النوم مؤقتًا", + "Sleep Tracking Resumed": "استأنف تتبع النوم", + "Alarm Snoozed": "تأجيل الإنذار", + "Snooze Canceled": "تم إلغاء التأجيل", + "Time for Bed": "وقت النوم", + "Alarm Alert Started": "بدأ تنبيه الإنذار", + "Alarm Dismissed": "تم تجاهل الإنذار", + "Skip Next Alarm": "تخطي الإنذار التالي", + "Show Skip Next Alarm": "إظهار تخطي الإنذار التالي", + "REM": "REM", + "Smart Period": "الفترة الذكية", + "Before Smart Period": "قبل الفترة الذكية", + "Lullaby Start": "بداية التهليل", + "Lullaby Stop": "توقف التهليل", + "Lullaby Volume Down": "خفض صوت التهليل", + "Deep Sleep": "نوم عميق", + "Light Sleep": "نوم خفيف", + "Awake": "مستيقظ", + "Not Awake": "غير مستيقظ", + "Apnea Alarm": "إنذار الأنابيب", + "Antisnoring": "مضاد للشخير", + "Before Alarm": "قبل الإنذار", + "Snore Detected": "تم اكتشاف الشخير", + "Talk Detected": "تم اكتشاف الكلام", + "Cough Detected": "تم اكتشاف السعال", + "Baby Cry Detected": "تم اكتشاف بكاء الطفل", + "Laugh Detected": "تم اكتشاف الضحك", + "Alarm Rescheduled": "تم إعادة جدولة الإنذار", + "None": "لا شيء" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/de.json b/custom_components/saas/translations/de.json new file mode 100644 index 0000000..dea54ce --- /dev/null +++ b/custom_components/saas/translations/de.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Sleep As Android Status", + "config": { + "step": { + "user": { + "title": "Konfiguration für SAAS - Sleep As Android Status", + "description": "Konfigurieren Sie die grundlegenden Einstellungen für die SAAS-Integration.", + "data": { + "name": "Name für Sensor", + "topic_template": "MQTT-Thema für Sleep As Android Ereignisse", + "qos": "Quality of Service (QoS) für MQTT", + "awake_duration": "Wachdauer", + "sleep_duration": "Schlafdauer", + "awake_states": "Wachzustände*", + "sleep_states": "Schlafzustände*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS-Integrationseinstellungen", + "description": "Konfigurieren Sie die grundlegenden Einstellungen für die SAAS-Integration.", + "data": { + "name": "Name für Sensor", + "topic_template": "MQTT-Thema (von Sleep As Android)", + "qos": "MQTT Quality of Service (QoS)", + "awake_duration": "Wachdauer", + "sleep_duration": "Schlafdauer", + "awake_states": "Wachzustände*", + "sleep_states": "Schlafzustände*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Unbekannt", + "Sleep Tracking Started": "Schlafüberwachung Gestartet", + "Sleep Tracking Stopped": "Schlafüberwachung Gestoppt", + "Sleep Tracking Paused": "Schlafüberwachung Pausiert", + "Sleep Tracking Resumed": "Schlafüberwachung Fortgesetzt", + "Alarm Snoozed": "Alarm Snoozed", + "Snooze Canceled": "Snooze Abgebrochen", + "Time for Bed": "Zeit fürs Bett", + "Alarm Alert Started": "Alarmalarm Gestartet", + "Alarm Dismissed": "Alarm Abgewiesen", + "Skip Next Alarm": "Nächsten Alarm Überspringen", + "Show Skip Next Alarm": "Zeige 'Nächsten Alarm Überspringen'", + "REM": "REM", + "Smart Period": "Intelligenter Zeitraum", + "Before Smart Period": "Vor Intelligenter Zeitraum", + "Lullaby Start": "Wiegenlied Start", + "Lullaby Stop": "Wiegenlied Stop", + "Lullaby Volume Down": "Wiegenlied Lautstärke Runter", + "Deep Sleep": "Tiefschlaf", + "Light Sleep": "Leichter Schlaf", + "Awake": "Wach", + "Not Awake": "Nicht Wach", + "Apnea Alarm": "Apnoe Alarm", + "Antisnoring": "Antischnarchen", + "Before Alarm": "Vor Alarm", + "Snore Detected": "Schnarchen Erkannt", + "Talk Detected": "Gespräch Erkannt", + "Cough Detected": "Husten Erkannt", + "Baby Cry Detected": "Babyweinen Erkannt", + "Laugh Detected": "Lachen Erkannt", + "Alarm Rescheduled": "Alarm Neu Geplant", + "None": "Keine" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/en.json b/custom_components/saas/translations/en.json new file mode 100644 index 0000000..630e021 --- /dev/null +++ b/custom_components/saas/translations/en.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Sleep As Android Status", + "config": { + "step": { + "user": { + "title": "Configuration for SAAS - Sleep As Android Status", + "description": "Configure the basic settings for the SAAS integration.", + "data": { + "name": "Name for Sensor", + "topic_template": "MQTT Topic for Sleep As Android Events", + "qos": "Quality of Service (QoS) for MQTT", + "awake_duration": "Awake Duration", + "sleep_duration": "Asleep Duration", + "awake_states": "Awake States*", + "sleep_states": "Asleep States*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS Integration Settings", + "description": "Configure the basic settings for the SAAS integration.", + "data": { + "name": "Name for Sensor", + "topic_template": "MQTT Topic (from Sleep As Android)", + "qos": "MQTT Quality of Service (QoS)", + "awake_duration": "Awake Duration", + "sleep_duration": "Asleep Duration", + "awake_states": "Awake States*", + "sleep_states": "Asleep States*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Unknown", + "Sleep Tracking Started": "Sleep Tracking Started", + "Sleep Tracking Stopped": "Sleep Tracking Stopped", + "Sleep Tracking Paused": "Sleep Tracking Paused", + "Sleep Tracking Resumed": "Sleep Tracking Resumed", + "Alarm Snoozed": "Alarm Snoozed", + "Snooze Canceled": "Snooze Canceled", + "Time for Bed": "Time for Bed", + "Alarm Alert Started": "Alarm Alert Started", + "Alarm Dismissed": "Alarm Dismissed", + "Skip Next Alarm": "Skip Next Alarm", + "Show Skip Next Alarm": "Show Skip Next Alarm", + "REM": "REM", + "Smart Period": "Smart Period", + "Before Smart Period": "Before Smart Period", + "Lullaby Start": "Lullaby Start", + "Lullaby Stop": "Lullaby Stop", + "Lullaby Volume Down": "Lullaby Volume Down", + "Deep Sleep": "Deep Sleep", + "Light Sleep": "Light Sleep", + "Awake": "Awake", + "Not Awake": "Not Awake", + "Apnea Alarm": "Apnea Alarm", + "Antisnoring": "Antisnoring", + "Before Alarm": "Before Alarm", + "Snore Detected": "Snore Detected", + "Talk Detected": "Talk Detected", + "Cough Detected": "Cough Detected", + "Baby Cry Detected": "Baby Cry Detected", + "Laugh Detected": "Laugh Detected", + "Alarm Rescheduled": "Alarm Rescheduled", + "None": "None" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/es.json b/custom_components/saas/translations/es.json new file mode 100644 index 0000000..c600e23 --- /dev/null +++ b/custom_components/saas/translations/es.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Estado de Sleep As Android", + "config": { + "step": { + "user": { + "title": "Configuración para SAAS - Estado de Sleep As Android", + "description": "Configura los ajustes básicos para la integración de SAAS.", + "data": { + "name": "Nombre para el Sensor", + "topic_template": "Tema MQTT para Eventos de Sleep As Android", + "qos": "Calidad de Servicio (QoS) para MQTT", + "awake_duration": "Duración Despierto", + "sleep_duration": "Duración Durmiendo", + "awake_states": "Estados Despierto*", + "sleep_states": "Estados Durmiendo*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Configuración de Integración SAAS", + "description": "Configura los ajustes básicos para la integración de SAAS.", + "data": { + "name": "Nombre para el Sensor", + "topic_template": "Tema MQTT (de Sleep As Android)", + "qos": "Calidad de Servicio (QoS) de MQTT", + "awake_duration": "Duración Despierto", + "sleep_duration": "Duración Durmiendo", + "awake_states": "Estados Despierto*", + "sleep_states": "Estados Durmiendo*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Desconocido", + "Sleep Tracking Started": "Seguimiento del Sueño Iniciado", + "Sleep Tracking Stopped": "Seguimiento del Sueño Detenido", + "Sleep Tracking Paused": "Seguimiento del Sueño Pausado", + "Sleep Tracking Resumed": "Seguimiento del Sueño Reanudado", + "Alarm Snoozed": "Alarma en Snooze", + "Snooze Canceled": "Snooze Cancelado", + "Time for Bed": "Hora de Dormir", + "Alarm Alert Started": "Alerta de Alarma Iniciada", + "Alarm Dismissed": "Alarma Desactivada", + "Skip Next Alarm": "Saltar Próxima Alarma", + "Show Skip Next Alarm": "Mostrar Saltar Próxima Alarma", + "REM": "REM", + "Smart Period": "Periodo Inteligente", + "Before Smart Period": "Antes del Periodo Inteligente", + "Lullaby Start": "Inicio de Canción de Cuna", + "Lullaby Stop": "Fin de Canción de Cuna", + "Lullaby Volume Down": "Bajar Volumen de Canción de Cuna", + "Deep Sleep": "Sueño Profundo", + "Light Sleep": "Sueño Ligero", + "Awake": "Despierto", + "Not Awake": "No Despierto", + "Apnea Alarm": "Alarma de Apnea", + "Antisnoring": "Antirronquidos", + "Before Alarm": "Antes de la Alarma", + "Snore Detected": "Ronquido Detectado", + "Talk Detected": "Habla Detectada", + "Cough Detected": "Tos Detectada", + "Baby Cry Detected": "Llanto de Bebé Detectado", + "Laugh Detected": "Risa Detectada", + "Alarm Rescheduled": "Alarma Re-programada", + "None": "Ninguno" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/fr.json b/custom_components/saas/translations/fr.json new file mode 100644 index 0000000..30becb7 --- /dev/null +++ b/custom_components/saas/translations/fr.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Statut de Sleep As Android", + "config": { + "step": { + "user": { + "title": "Configuration pour SAAS - Statut de Sleep As Android", + "description": "Configurez les paramètres de base pour l'intégration de SAAS.", + "data": { + "name": "Nom pour le Capteur", + "topic_template": "Sujet MQTT pour les Événements de Sleep As Android", + "qos": "Qualité de Service (QoS) pour MQTT", + "awake_duration": "Durée Éveillé", + "sleep_duration": "Durée Endormi", + "awake_states": "États Éveillé*", + "sleep_states": "États Endormi*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Paramètres d'Intégration SAAS", + "description": "Configurez les paramètres de base pour l'intégration de SAAS.", + "data": { + "name": "Nom pour le Capteur", + "topic_template": "Sujet MQTT (de Sleep As Android)", + "qos": "Qualité de Service (QoS) de MQTT", + "awake_duration": "Durée Éveillé", + "sleep_duration": "Durée Endormi", + "awake_states": "États Éveillé*", + "sleep_states": "États Endormi*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Inconnu", + "Sleep Tracking Started": "Suivi du Sommeil Commencé", + "Sleep Tracking Stopped": "Suivi du Sommeil Arrêté", + "Sleep Tracking Paused": "Suivi du Sommeil en Pause", + "Sleep Tracking Resumed": "Suivi du Sommeil Repris", + "Alarm Snoozed": "Alarme en Snooze", + "Snooze Canceled": "Snooze Annulé", + "Time for Bed": "Heure du Coucher", + "Alarm Alert Started": "Alerte d'Alarme Commencée", + "Alarm Dismissed": "Alarme Dismissed", + "Skip Next Alarm": "Passer la Prochaine Alarme", + "Show Skip Next Alarm": "Montrer Passer la Prochaine Alarme", + "REM": "REM", + "Smart Period": "Période Intelligente", + "Before Smart Period": "Avant la Période Intelligente", + "Lullaby Start": "Début de Berceuse", + "Lullaby Stop": "Fin de Berceuse", + "Lullaby Volume Down": "Diminuer le Volume de la Berceuse", + "Deep Sleep": "Sommeil Profond", + "Light Sleep": "Sommeil Léger", + "Awake": "Éveillé", + "Not Awake": "Pas Éveillé", + "Apnea Alarm": "Alarme d'Apnée", + "Antisnoring": "Anti-ronflement", + "Before Alarm": "Avant l'Alarme", + "Snore Detected": "Ronflement Détecté", + "Talk Detected": "Parole Détectée", + "Cough Detected": "Toux Détectée", + "Baby Cry Detected": "Pleurs de Bébé Détectés", + "Laugh Detected": "Rire Détecté", + "Alarm Rescheduled": "Alarme Re-programmée", + "None": "Aucun" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/it.json b/custom_components/saas/translations/it.json new file mode 100644 index 0000000..c0e05d0 --- /dev/null +++ b/custom_components/saas/translations/it.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Stato di Sleep As Android", + "config": { + "step": { + "user": { + "title": "Configurazione per SAAS - Stato di Sleep As Android", + "description": "Configura le impostazioni di base per l'integrazione SAAS.", + "data": { + "name": "Nome per Sensore", + "topic_template": "Topic MQTT per Eventi Sleep As Android", + "qos": "Quality of Service (QoS) per MQTT", + "awake_duration": "Durata Sveglio", + "sleep_duration": "Durata Addormentato", + "awake_states": "Stati di Veglia*", + "sleep_states": "Stati di Sonno*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Impostazioni di Integrazione SAAS", + "description": "Configura le impostazioni di base per l'integrazione SAAS.", + "data": { + "name": "Nome per Sensore", + "topic_template": "Topic MQTT (da Sleep As Android)", + "qos": "Quality of Service (QoS) MQTT", + "awake_duration": "Durata Sveglio", + "sleep_duration": "Durata Addormentato", + "awake_states": "Stati di Veglia*", + "sleep_states": "Stati di Sonno*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Sconosciuto", + "Sleep Tracking Started": "Inizio Monitoraggio del Sonno", + "Sleep Tracking Stopped": "Fine Monitoraggio del Sonno", + "Sleep Tracking Paused": "Monitoraggio del Sonno in Pausa", + "Sleep Tracking Resumed": "Ripresa Monitoraggio del Sonno", + "Alarm Snoozed": "Allarme Posticipato", + "Snooze Canceled": "Posticipo Annullato", + "Time for Bed": "Ora di Andare a Letto", + "Alarm Alert Started": "Inizio Allarme", + "Alarm Dismissed": "Allarme Disattivato", + "Skip Next Alarm": "Salta il Prossimo Allarme", + "Show Skip Next Alarm": "Mostra 'Salta il Prossimo Allarme'", + "REM": "REM", + "Smart Period": "Periodo Smart", + "Before Smart Period": "Prima del Periodo Smart", + "Lullaby Start": "Inizio Ninna Nanna", + "Lullaby Stop": "Fine Ninna Nanna", + "Lullaby Volume Down": "Diminuzione Volume Ninna Nanna", + "Deep Sleep": "Sonno Profondo", + "Light Sleep": "Sonno Leggero", + "Awake": "Sveglio", + "Not Awake": "Non Sveglio", + "Apnea Alarm": "Allarme Apnea", + "Antisnoring": "Antirussamento", + "Before Alarm": "Prima dell'Allarme", + "Snore Detected": "Russamento Rilevato", + "Talk Detected": "Conversazione Rilevata", + "Cough Detected": "Tosse Rilevata", + "Baby Cry Detected": "Pianto del Bambino Rilevato", + "Laugh Detected": "Risata Rilevata", + "Alarm Rescheduled": "Allarme Riprogrammato", + "None": "Nessuno" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/ja.json b/custom_components/saas/translations/ja.json new file mode 100644 index 0000000..52dcaa6 --- /dev/null +++ b/custom_components/saas/translations/ja.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - 睡眠如 Android 狀態", + "config": { + "step": { + "user": { + "title": "SAAS - 睡眠如 Android 狀態配置", + "description": "配置 SAAS 整合的基本設置。", + "data": { + "name": "感應器名稱", + "topic_template": "睡眠如 Android 事件的 MQTT 主題", + "qos": "MQTT 的服務質量 (QoS)", + "awake_duration": "清醒持續時間", + "sleep_duration": "睡眠持續時間", + "awake_states": "清醒狀態*", + "sleep_states": "睡眠狀態*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS 整合設置", + "description": "配置 SAAS 整合的基本設置。", + "data": { + "name": "感應器名稱", + "topic_template": "MQTT 主題(來自睡眠如 Android)", + "qos": "MQTT 服務質量 (QoS)", + "awake_duration": "清醒持續時間", + "sleep_duration": "睡眠持續時間", + "awake_states": "清醒狀態*", + "sleep_states": "睡眠狀態*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "未知", + "Sleep Tracking Started": "開始追蹤睡眠", + "Sleep Tracking Stopped": "停止追蹤睡眠", + "Sleep Tracking Paused": "暫停追蹤睡眠", + "Sleep Tracking Resumed": "恢復追蹤睡眠", + "Alarm Snoozed": "鬧鐘貪睡", + "Snooze Canceled": "取消貪睡", + "Time for Bed": "該睡覺了", + "Alarm Alert Started": "鬧鐘警報開始", + "Alarm Dismissed": "鬧鐘解除", + "Skip Next Alarm": "跳過下一個鬧鐘", + "Show Skip Next Alarm": "顯示跳過下一個鬧鐘", + "REM": "REM", + "Smart Period": "智能期間", + "Before Smart Period": "在智能期間之前", + "Lullaby Start": "搖籃曲開始", + "Lullaby Stop": "搖籃曲停止", + "Lullaby Volume Down": "搖籃曲音量下降", + "Deep Sleep": "深度睡眠", + "Light Sleep": "淺度睡眠", + "Awake": "清醒", + "Not Awake": "未清醒", + "Apnea Alarm": "呼吸暫停警報", + "Antisnoring": "防打鼾", + "Before Alarm": "在鬧鐘之前", + "Snore Detected": "檢測到打鼾", + "Talk Detected": "檢測到說話", + "Cough Detected": "檢測到咳嗽", + "Baby Cry Detected": "檢測到嬰兒哭聲", + "Laugh Detected": "檢測到笑聲", + "Alarm Rescheduled": "鬧鐘重新安排", + "None": "無" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/ko.json b/custom_components/saas/translations/ko.json new file mode 100644 index 0000000..9d71829 --- /dev/null +++ b/custom_components/saas/translations/ko.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Sleep As Android 상태", + "config": { + "step": { + "user": { + "title": "SAAS - Sleep As Android 상태 설정", + "description": "SAAS 통합의 기본 설정을 구성합니다.", + "data": { + "name": "센서 이름", + "topic_template": "Sleep As Android 이벤트의 MQTT 주제", + "qos": "MQTT의 서비스 품질(QoS)", + "awake_duration": "깨어 있는 시간", + "sleep_duration": "수면 시간", + "awake_states": "깨어 있는 상태*", + "sleep_states": "수면 상태*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS 통합 설정", + "description": "SAAS 통합의 기본 설정을 구성합니다.", + "data": { + "name": "센서 이름", + "topic_template": "Sleep As Android에서의 MQTT 주제", + "qos": "MQTT의 서비스 품질(QoS)", + "awake_duration": "깨어 있는 시간", + "sleep_duration": "수면 시간", + "awake_states": "깨어 있는 상태*", + "sleep_states": "수면 상태*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "알 수 없음", + "Sleep Tracking Started": "수면 추적 시작", + "Sleep Tracking Stopped": "수면 추적 중지", + "Sleep Tracking Paused": "수면 추적 일시 중지", + "Sleep Tracking Resumed": "수면 추적 재개", + "Alarm Snoozed": "알람 스누즈", + "Snooze Canceled": "스누즈 취소", + "Time for Bed": "침대 시간", + "Alarm Alert Started": "알람 경고 시작", + "Alarm Dismissed": "알람 해제", + "Skip Next Alarm": "다음 알람 건너뛰기", + "Show Skip Next Alarm": "다음 알람 건너뛰기 표시", + "REM": "REM", + "Smart Period": "스마트 기간", + "Before Smart Period": "스마트 기간 이전", + "Lullaby Start": "자장가 시작", + "Lullaby Stop": "자장가 중지", + "Lullaby Volume Down": "자장가 볼륨 다운", + "Deep Sleep": "깊은 잠", + "Light Sleep": "얕은 잠", + "Awake": "깨어 있음", + "Not Awake": "깨어 있지 않음", + "Apnea Alarm": "무호흡 알람", + "Antisnoring": "코골이 방지", + "Before Alarm": "알람 이전", + "Snore Detected": "코골이 감지됨", + "Talk Detected": "대화 감지됨", + "Cough Detected": "기침 감지됨", + "Baby Cry Detected": "아기 울음소리 감지됨", + "Laugh Detected": "웃음소리 감지됨", + "Alarm Rescheduled": "알람 재스케줄", + "None": "없음" + } + } + } + } \ No newline at end of file diff --git a/custom_components/saas/translations/nl.json b/custom_components/saas/translations/nl.json new file mode 100644 index 0000000..2164d9d --- /dev/null +++ b/custom_components/saas/translations/nl.json @@ -0,0 +1,75 @@ +{ + "title": "Configuratie voor SAAS - Sleep As Android Status", + "config": { + "step": { + "user": { + "title": "Configuratie voor SAAS - Sleep As Android Status", + "description": "Configureer de basisinstellingen voor de SAAS-integratie.", + "data": { + "name": "Naam voor Sensor", + "topic_template": "MQTT-onderwerp voor Sleep As Android Gebeurtenissen", + "qos": "Quality of Service (QoS) voor MQTT", + "awake_duration": "Wakker Duur", + "sleep_duration": "Slaapduur", + "awake_states": "Wakker Staten*", + "sleep_states": "Slaap Staten*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS-Integratie-Instellingen", + "description": "Configureer de basisinstellingen voor de SAAS-integratie.", + "data": { + "name": "Naam voor Sensor", + "topic_template": "MQTT-Onderwerp (van Sleep As Android)", + "qos": "MQTT Quality of Service (QoS)", + "awake_duration": "Wakker Duur", + "sleep_duration": "Slaapduur", + "awake_states": "Wakker Staten*", + "sleep_states": "Slaap Staten*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Onbekend", + "Sleep Tracking Started": "Slaaptracking Gestart", + "Sleep Tracking Stopped": "Slaaptracking Gestopt", + "Sleep Tracking Paused": "Slaaptracking Gepauzeerd", + "Sleep Tracking Resumed": "Slaaptracking Hervat", + "Alarm Snoozed": "Alarm Gesnoozed", + "Snooze Canceled": "Snooze Geannuleerd", + "Time for Bed": "Tijd om te Gaan Slapen", + "Alarm Alert Started": "Alarm Alert Gestart", + "Alarm Dismissed": "Alarm Afgeslagen", + "Skip Next Alarm": "Volgende Alarm Overslaan", + "Show Skip Next Alarm": "Toon 'Volgende Alarm Overslaan'", + "REM": "REM", + "Smart Period": "Slimme Periode", + "Before Smart Period": "Voor Slimme Periode", + "Lullaby Start": "Slaapliedje Start", + "Lullaby Stop": "Slaapliedje Stop", + "Lullaby Volume Down": "Slaapliedje Volume Omlaag", + "Deep Sleep": "Diepe Slaap", + "Light Sleep": "Lichte Slaap", + "Awake": "Wakker", + "Not Awake": "Niet Wakker", + "Apnea Alarm": "Apneu Alarm", + "Antisnoring": "Antisnurken", + "Before Alarm": "Voor Alarm", + "Snore Detected": "Snurken Gedetecteerd", + "Talk Detected": "Gesprek Gedetecteerd", + "Cough Detected": "Hoesten Gedetecteerd", + "Baby Cry Detected": "Baby Huilen Gedetecteerd", + "Laugh Detected": "Lachen Gedetecteerd", + "Alarm Rescheduled": "Alarm Herpland", + "None": "Geen" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/pl.json b/custom_components/saas/translations/pl.json new file mode 100644 index 0000000..7cf84d9 --- /dev/null +++ b/custom_components/saas/translations/pl.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Status Sleep As Android", + "config": { + "step": { + "user": { + "title": "Konfiguracja dla SAAS - Status Sleep As Android", + "description": "Konfiguracja podstawowych ustawień dla integracji SAAS.", + "data": { + "name": "Nazwa dla czujnika", + "topic_template": "Temat MQTT dla zdarzeń Sleep As Android", + "qos": "Jakość usługi (QoS) dla MQTT", + "awake_duration": "Czas czuwania", + "sleep_duration": "Czas snu", + "awake_states": "Stany czuwania*", + "sleep_states": "Stany snu*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Ustawienia integracji SAAS", + "description": "Konfiguracja podstawowych ustawień dla integracji SAAS.", + "data": { + "name": "Nazwa dla czujnika", + "topic_template": "Temat MQTT (od Sleep As Android)", + "qos": "Jakość usługi (QoS) MQTT", + "awake_duration": "Czas czuwania", + "sleep_duration": "Czas snu", + "awake_states": "Stany czuwania*", + "sleep_states": "Stany snu*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Nieznane", + "Sleep Tracking Started": "Rozpoczęto śledzenie snu", + "Sleep Tracking Stopped": "Zatrzymano śledzenie snu", + "Sleep Tracking Paused": "Wstrzymano śledzenie snu", + "Sleep Tracking Resumed": "Wznowiono śledzenie snu", + "Alarm Snoozed": "Alarm w drzemce", + "Snooze Canceled": "Drzemka anulowana", + "Time for Bed": "Czas na sen", + "Alarm Alert Started": "Rozpoczęto alarm", + "Alarm Dismissed": "Alarm wyłączony", + "Skip Next Alarm": "Pomiń następny alarm", + "Show Skip Next Alarm": "Pokaż pomiń następny alarm", + "REM": "REM", + "Smart Period": "Inteligentny okres", + "Before Smart Period": "Przed inteligentnym okresem", + "Lullaby Start": "Rozpoczęcie kołysanki", + "Lullaby Stop": "Zakończenie kołysanki", + "Lullaby Volume Down": "Zmniejsz głośność kołysanki", + "Deep Sleep": "Głęboki sen", + "Light Sleep": "Lekki sen", + "Awake": "Czuwanie", + "Not Awake": "Nie czuwa", + "Apnea Alarm": "Alarm apnei", + "Antisnoring": "Przeciw chrapaniu", + "Before Alarm": "Przed alarmem", + "Snore Detected": "Wykryto chrapanie", + "Talk Detected": "Wykryto mówienie", + "Cough Detected": "Wykryto kaszel", + "Baby Cry Detected": "Wykryto płacz dziecka", + "Laugh Detected": "Wykryto śmiech", + "Alarm Rescheduled": "Alarm został przesunięty", + "None": "Brak" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/pt.json b/custom_components/saas/translations/pt.json new file mode 100644 index 0000000..592e132 --- /dev/null +++ b/custom_components/saas/translations/pt.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Status do Sleep As Android", + "config": { + "step": { + "user": { + "title": "Configuração para SAAS - Status do Sleep As Android", + "description": "Configure as configurações básicas para a integração SAAS.", + "data": { + "name": "Nome para Sensor", + "topic_template": "Tópico MQTT para Eventos do Sleep As Android", + "qos": "Qualidade de Serviço (QoS) para MQTT", + "awake_duration": "Duração Acordado", + "sleep_duration": "Duração Adormecido", + "awake_states": "Estados Acordado*", + "sleep_states": "Estados Adormecido*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Configurações de Integração SAAS", + "description": "Configure as configurações básicas para a integração SAAS.", + "data": { + "name": "Nome para Sensor", + "topic_template": "Tópico MQTT (do Sleep As Android)", + "qos": "Qualidade de Serviço (QoS) MQTT", + "awake_duration": "Duração Acordado", + "sleep_duration": "Duração Adormecido", + "awake_states": "Estados Acordado*", + "sleep_states": "Estados Adormecido*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Desconhecido", + "Sleep Tracking Started": "Monitoramento do Sono Iniciado", + "Sleep Tracking Stopped": "Monitoramento do Sono Parado", + "Sleep Tracking Paused": "Monitoramento do Sono Pausado", + "Sleep Tracking Resumed": "Monitoramento do Sono Retomado", + "Alarm Snoozed": "Alarme Adiado", + "Snooze Canceled": "Adiamento Cancelado", + "Time for Bed": "Hora de Dormir", + "Alarm Alert Started": "Alerta de Alarme Iniciado", + "Alarm Dismissed": "Alarme Desligado", + "Skip Next Alarm": "Pular Próximo Alarme", + "Show Skip Next Alarm": "Mostrar 'Pular Próximo Alarme'", + "REM": "REM", + "Smart Period": "Período Inteligente", + "Before Smart Period": "Antes do Período Inteligente", + "Lullaby Start": "Início de Canção de Ninar", + "Lullaby Stop": "Fim de Canção de Ninar", + "Lullaby Volume Down": "Diminuir Volume da Canção de Ninar", + "Deep Sleep": "Sono Profundo", + "Light Sleep": "Sono Leve", + "Awake": "Acordado", + "Not Awake": "Não Acordado", + "Apnea Alarm": "Alarme de Apneia", + "Antisnoring": "Antirronco", + "Before Alarm": "Antes do Alarme", + "Snore Detected": "Ronco Detectado", + "Talk Detected": "Conversa Detectada", + "Cough Detected": "Tosse Detectada", + "Baby Cry Detected": "Choro de Bebê Detectado", + "Laugh Detected": "Risada Detectada", + "Alarm Rescheduled": "Alarme Remarcado", + "None": "Nenhum" + } + } + } + } \ No newline at end of file diff --git a/custom_components/saas/translations/pue.json b/custom_components/saas/translations/pue.json new file mode 100644 index 0000000..b4fac33 --- /dev/null +++ b/custom_components/saas/translations/pue.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - 睡眠如 Android 狀態", + "config": { + "step": { + "user": { + "title": "SAAS - 睡眠如 Android 狀態配置", + "description": "配置 SAAS 整合的基本設置。", + "data": { + "name": "感應器名稱", + "topic_template": "睡眠如 Android 事件的 MQTT 主題", + "qos": "MQTT 的服務質量 (QoS)", + "awake_duration": "清醒持續時間", + "sleep_duration": "睡眠持續時間", + "awake_states": "清醒狀態*", + "sleep_states": "睡眠狀態*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS 整合設置", + "description": "配置 SAAS 整合的基本設置。", + "data": { + "name": "感應器名稱", + "topic_template": "MQTT 主題(來自睡眠如 Android)", + "qos": "MQTT 服務質量 (QoS)", + "awake_duration": "清醒持續時間", + "sleep_duration": "睡眠持續時間", + "awake_states": "清醒狀態*", + "sleep_states": "睡眠狀態*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "未知", + "Sleep Tracking Started": "開始追蹤睡眠", + "Sleep Tracking Stopped": "停止追蹤睡眠", + "Sleep Tracking Paused": "暫停追蹤睡眠", + "Sleep Tracking Resumed": "恢復追蹤睡眠", + "Alarm Snoozed": "鬧鐘貪睡", + "Snooze Canceled": "取消貪睡", + "Time for Bed": "該睡覺了", + "Alarm Alert Started": "鬧鐘警報開始", + "Alarm Dismissed": "鬧鐘解除", + "Skip Next Alarm": "跳過下一個鬧鐘", + "Show Skip Next Alarm": "顯示跳過下一個鬧鐘", + "REM": "REM", + "Smart Period": "智能期間", + "Before Smart Period": "在智能期間之前", + "Lullaby Start": "搖籃曲開始", + "Lullaby Stop": "搖籃曲停止", + "Lullaby Volume Down": "搖籃曲音量下降", + "Deep Sleep": "深度睡眠", + "Light Sleep": "淺度睡眠", + "Awake": "清醒", + "Not Awake": "未清醒", + "Apnea Alarm": "呼吸暫停警報", + "Antisnoring": "防打鼾", + "Before Alarm": "在鬧鐘之前", + "Snore Detected": "檢測到打鼾", + "Talk Detected": "檢測到說話", + "Cough Detected": "檢測到咳嗽", + "Baby Cry Detected": "檢測到嬰兒哭聲", + "Laugh Detected": "檢測到笑聲", + "Alarm Rescheduled": "鬧鐘重新安排", + "None": "無" + } + } + } + } \ No newline at end of file diff --git a/custom_components/saas/translations/ru.json b/custom_components/saas/translations/ru.json new file mode 100644 index 0000000..fbbed4a --- /dev/null +++ b/custom_components/saas/translations/ru.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Статус Sleep As Android", + "config": { + "step": { + "user": { + "title": "Конфигурация для SAAS - Статус Sleep As Android", + "description": "Настройка основных параметров для интеграции SAAS.", + "data": { + "name": "Имя для датчика", + "topic_template": "Тема MQTT для событий Sleep As Android", + "qos": "Качество обслуживания (QoS) для MQTT", + "awake_duration": "Продолжительность бодрствования", + "sleep_duration": "Продолжительность сна", + "awake_states": "Состояния бодрствования*", + "sleep_states": "Состояния сна*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "Настройки интеграции SAAS", + "description": "Настройка основных параметров для интеграции SAAS.", + "data": { + "name": "Имя для датчика", + "topic_template": "Тема MQTT (от Sleep As Android)", + "qos": "Качество обслуживания (QoS) MQTT", + "awake_duration": "Продолжительность бодрствования", + "sleep_duration": "Продолжительность сна", + "awake_states": "Состояния бодрствования*", + "sleep_states": "Состояния сна*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Неизвестно", + "Sleep Tracking Started": "Начато отслеживание сна", + "Sleep Tracking Stopped": "Отслеживание сна остановлено", + "Sleep Tracking Paused": "Отслеживание сна приостановлено", + "Sleep Tracking Resumed": "Отслеживание сна возобновлено", + "Alarm Snoozed": "Будильник в режиме паузы", + "Snooze Canceled": "Пауза отменена", + "Time for Bed": "Время спать", + "Alarm Alert Started": "Начало сигнала будильника", + "Alarm Dismissed": "Будильник отключен", + "Skip Next Alarm": "Пропустить следующий будильник", + "Show Skip Next Alarm": "Показать пропуск следующего будильника", + "REM": "REM", + "Smart Period": "Умный период", + "Before Smart Period": "До умного периода", + "Lullaby Start": "Начало колыбельной", + "Lullaby Stop": "Конец колыбельной", + "Lullaby Volume Down": "Уменьшить громкость колыбельной", + "Deep Sleep": "Глубокий сон", + "Light Sleep": "Легкий сон", + "Awake": "Бодрствование", + "Not Awake": "Не бодрствует", + "Apnea Alarm": "Сигнал апноэ", + "Antisnoring": "Против храпа", + "Before Alarm": "До будильника", + "Snore Detected": "Обнаружен храп", + "Talk Detected": "Обнаружена речь", + "Cough Detected": "Обнаружен кашель", + "Baby Cry Detected": "Обнаружен плач ребенка", + "Laugh Detected": "Обнаружен смех", + "Alarm Rescheduled": "Будильник перенесен", + "None": "Нет" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/sv.json b/custom_components/saas/translations/sv.json new file mode 100644 index 0000000..5c6ed52 --- /dev/null +++ b/custom_components/saas/translations/sv.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Sleep As Android Status", + "config": { + "step": { + "user": { + "title": "Konfiguration för SAAS - Sleep As Android Status", + "description": "Konfigurera de grundläggande inställningarna för SAAS-integrationen.", + "data": { + "name": "Namn för Sensor", + "topic_template": "MQTT Ämne för Sleep As Android Händelser", + "qos": "Kvalitet på Tjänst (QoS) för MQTT", + "awake_duration": "Vaken Varaktighet", + "sleep_duration": "Sovande Varaktighet", + "awake_states": "Vakna Tillstånd*", + "sleep_states": "Sovande Tillstånd*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS Integrationsinställningar", + "description": "Konfigurera de grundläggande inställningarna för SAAS-integrationen.", + "data": { + "name": "Namn för Sensor", + "topic_template": "MQTT Ämne (från Sleep As Android)", + "qos": "MQTT Kvalitet på Tjänst (QoS)", + "awake_duration": "Vaken Varaktighet", + "sleep_duration": "Sovande Varaktighet", + "awake_states": "Vakna Tillstånd*", + "sleep_states": "Sovande Tillstånd*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "Okänd", + "Sleep Tracking Started": "Sömnmätning Startad", + "Sleep Tracking Stopped": "Sömnmätning Stoppad", + "Sleep Tracking Paused": "Sömnmätning Pausad", + "Sleep Tracking Resumed": "Sömnmätning Återupptagen", + "Alarm Snoozed": "Alarm Snoozed", + "Snooze Canceled": "Snooze Avbruten", + "Time for Bed": "Dags att Gå och Lägga Sig", + "Alarm Alert Started": "Alarmvarning Startad", + "Alarm Dismissed": "Alarm Avvisat", + "Skip Next Alarm": "Hoppa över Nästa Alarm", + "Show Skip Next Alarm": "Visa 'Hoppa över Nästa Alarm'", + "REM": "REM", + "Smart Period": "Smart Period", + "Before Smart Period": "Före Smart Period", + "Lullaby Start": "Vaggvisa Start", + "Lullaby Stop": "Vaggvisa Stopp", + "Lullaby Volume Down": "Vaggvisa Volym Ner", + "Deep Sleep": "Djup Sömn", + "Light Sleep": "Lätt Sömn", + "Awake": "Vaken", + "Not Awake": "Inte Vaken", + "Apnea Alarm": "Apné Alarm", + "Antisnoring": "Antisnarkning", + "Before Alarm": "Före Alarm", + "Snore Detected": "Snarkning Upptäckt", + "Talk Detected": "Prat Upptäckt", + "Cough Detected": "Hosta Upptäckt", + "Baby Cry Detected": "Bebisgråt Upptäckt", + "Laugh Detected": "Skratt Upptäckt", + "Alarm Rescheduled": "Alarm Omplanerat", + "None": "Ingen" + } + } + } +} \ No newline at end of file diff --git a/custom_components/saas/translations/zh.json b/custom_components/saas/translations/zh.json new file mode 100644 index 0000000..3ca0f23 --- /dev/null +++ b/custom_components/saas/translations/zh.json @@ -0,0 +1,75 @@ +{ + "title": "SAAS - Sleep As Android 状态", + "config": { + "step": { + "user": { + "title": "SAAS - Sleep As Android 状态配置", + "description": "配置 SAAS 集成的基本设置。", + "data": { + "name": "传感器名称", + "topic_template": "Sleep As Android 事件的 MQTT 主题", + "qos": "MQTT 的服务质量 (QoS)", + "awake_duration": "清醒持续时间", + "sleep_duration": "睡眠持续时间", + "awake_states": "清醒状态*", + "sleep_states": "睡眠状态*" + } + } + } + }, + "options": { + "step": { + "init": { + "title": "SAAS 集成设置", + "description": "配置 SAAS 集成的基本设置。", + "data": { + "name": "传感器名称", + "topic_template": "Sleep As Android 的 MQTT 主题", + "qos": "MQTT 的服务质量 (QoS)", + "awake_duration": "清醒持续时间", + "sleep_duration": "睡眠持续时间", + "awake_states": "清醒状态*", + "sleep_states": "睡眠状态*" + } + } + } + }, + "entity": { + "sensor": { + "state": { + "Unknown": "未知", + "Sleep Tracking Started": "开始睡眠跟踪", + "Sleep Tracking Stopped": "停止睡眠跟踪", + "Sleep Tracking Paused": "暂停睡眠跟踪", + "Sleep Tracking Resumed": "恢复睡眠跟踪", + "Alarm Snoozed": "闹钟贪睡", + "Snooze Canceled": "取消贪睡", + "Time for Bed": "该睡觉了", + "Alarm Alert Started": "闹钟警报开始", + "Alarm Dismissed": "闹钟解除", + "Skip Next Alarm": "跳过下一个闹钟", + "Show Skip Next Alarm": "显示跳过下一个闹钟", + "REM": "REM", + "Smart Period": "智能周期", + "Before Smart Period": "在智能周期之前", + "Lullaby Start": "开始摇篮曲", + "Lullaby Stop": "停止摇篮曲", + "Lullaby Volume Down": "降低摇篮曲音量", + "Deep Sleep": "深度睡眠", + "Light Sleep": "浅睡", + "Awake": "清醒", + "Not Awake": "未清醒", + "Apnea Alarm": "呼吸暂停警报", + "Antisnoring": "防打鼾", + "Before Alarm": "在闹钟之前", + "Snore Detected": "检测到打鼾", + "Talk Detected": "检测到说话", + "Cough Detected": "检测到咳嗽", + "Baby Cry Detected": "检测到婴儿哭声", + "Laugh Detected": "检测到笑声", + "Alarm Rescheduled": "闹钟重新安排", + "None": "无" + } + } + } + } \ No newline at end of file