package Ġorg . hom ie iot Ċ Ċ import Ġorg . hom ie iot . colors . H SV Ċ import Ġorg . hom ie iot . colors . RGB Ċ import Ġorg . hom ie iot . mqtt . Hierarchical Hom ie Publisher Ċ import Ġorg . hom ie iot . mqtt . Hom ie Publisher Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Hom ie ĠProperty ]( https :// hom ie iot . github . io / specification /# properties ) Ċ Ġ* Ċ Ġ* Ġ@ property Ġid ĠUnique ĠID Ġthat Ġcon forms Ġto Ġ[ Hom ie Ġconvention Ġfor ĠIDs ]( https :// hom ie iot . github . io / specification /# topic - ids ) Ċ Ġ* Ġ@ property Ġname ĠUser Ġsupplied Ġfriendly Ġname Ġfor Ġproperty Ċ Ġ*/ Ċ interface ĠProperty < T > Ġ{ ĊĊĠĠĠ Ġval Ġid : ĠString ĊĠĠĠ Ġval Ġname : ĠString ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubmit s Ġan Ġupdate Ġto Ġcontroller ĊĠĠĠĠ Ġ* Ġ@ param Ġt ĠUpdated Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( t : ĠT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġcontroller Ġsends Ġa Ġproperty Ġupdate ĊĠĠĠĠ Ġ* Ġ@ param Ġupdate ĠUpdate Ġreceived Ġfrom Ġcontroller ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubscribe ( update : Ġ( Property Update < T >) Ġ-> ĠUnit ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġproperty Ġupdate Ġdelivered Ġfrom ĠMQTT Ċ Ġ* Ċ Ġ* Ġ@ param Ġ[ property ] ĠProperty Ġthat Ġwas Ġupdated Ċ Ġ* Ġ@ param Ġupdate ĠUpdate Ġreceived Ġfrom ĠMQTT Ċ Ġ*/ Ċ data Ġclass ĠProperty Update < T > Ġinternal Ġconstructor ( val Ġproperty : ĠProperty < T >, Ġval Ġupdate : ĠT ) Ċ Ċ /** Ċ Ġ* ĠDefines Ġthe Ġdifferent Ġtypes Ġof Ġproperties Ġdepending Ġon Ġthe Ġfeature Ġof Ġthe Ġnode Ġbeing Ġmode led . Ċ Ġ*/ Ċ enum Ġclass ĠProperty Type Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ STATE ] Ġtypes Ġare Ġuseful Ġfor Ġproperties Ġthat Ġrepresent Ġpersistent Ġvalues Ġ( temperature Ġsensor , Ġlight Ġswitch ), Ġetc . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠSTATE , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ EVENT ] Ġtypes Ġare Ġbe Ġuseful Ġfor Ġproperties Ġthat Ġrepresent Ġmoment ary Ġevents Ġ( door Ġb ell Ġpressed ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠEVENT Ċ } Ċ Ċ internal Ġabstract Ġclass ĠBase Property < T >( ĊĠĠĠ Ġfinal Ġoverride Ġval Ġid : ĠString , ĊĠĠĠ Ġfinal Ġoverride Ġval Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠProperty Type , ĊĠĠĠ Ġval Ġunit : ĠString ?, ĊĠĠĠ Ġval Ġdatatype : ĠString , ĊĠĠĠ Ġval Ġformat : ĠString ? Ċ ) Ġ: ĠProperty < T > Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġid Require ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpublisher Ġ= ĠH ierarchical Hom ie Publisher ( parent Publisher , Ġid ) ĊĊĠĠĠ Ġprivate Ġvar Ġobserver : Ġ(( Property Update < T >) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlast Value : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġval Ġset table : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġobserver Ġ!= Ġnull ĊĊĠĠĠ Ġinternal Ġval Ġtopic Segments Ġ= Ġpublisher . topic () ĊĊĠĠĠ Ġinternal Ġval Ġretained Ġ= Ġtype Ġ== ĠProperty Type . STATE ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( t : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠProperty Type . EVENT Ġ|| Ġt Ġ!= Ġlast Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . publish Message ( payload Ġ= Ġvalue ToString ( t )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Value Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġvalue ToString ( value : ĠT ) Ġ= Ġvalue . toString () ĊĊĠĠĠ Ġinternal Ġfun Ġmqtt Received ( update : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver ?. invoke ( property Update FromString ( update )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < T > ĊĊĠĠĠ Ġinternal Ġfun Ġpublish Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġname ?. let Ġ{ Ġpublisher . publish Message ("\ $ name ", Ġpayload Ġ= Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġpublish Set table () ĊĠĠĠĠĠĠĠ Ġpublisher . publish Message ("\ $ ret ained ", Ġpayload Ġ= Ġretained . toString ()) ĊĠĠĠĠĠĠĠ Ġunit ?. let Ġ{ Ġpublisher . publish Message ("\ $ unit ", Ġpayload Ġ= Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġpublisher . publish Message ("\ $ datatype ", Ġpayload Ġ= Ġdatatype ) ĊĠĠĠĠĠĠĠ Ġformat ?. let Ġ{ Ġpublisher . publish Message ("\ $ format ", Ġpayload Ġ= Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish Set table () Ġ{ ĊĠĠĠĠĠĠĠ Ġpublisher . publish Message ("\ $ set table ", Ġpayload Ġ= Ġset table . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( update : Ġ( Property Update < T >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . observer Ġ= Ġupdate ĊĠĠĠĠĠĠĠ Ġpublish Set table () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠString Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġunit : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠBase Property < String >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" string ", ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġformat Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < String > Ġ= ĠProperty Update ( this , Ġupdate ) Ċ } Ċ Ċ internal Ġabstract Ġclass ĠAbstract Number Property < T Ġ: ĠComparable < T >>( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġdatatype : ĠString , ĊĠĠĠ Ġunit : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġrange : ĠClosed Range < T >? Ċ ) Ġ: ĠBase Property < T >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġdatatype , ĊĠĠĠĠĠĠĠ Ġformat Ġ= Ġrange ?. let Ġ{ Ġ"${ it . start }:${ it . end Inclusive }" Ġ}) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( t : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrange ?. contains OrThrow ( t ) ĊĠĠĠĠĠĠĠ Ġsuper . update ( t ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠNumber Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġunit : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġrange : ĠLong Range ? Ċ ) Ġ: ĠAbstract Number Property < Long >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" integer ", ĊĠĠĠĠĠĠĠ Ġrange Ġ= Ġrange ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < Long > Ġ= ĠProperty Update ( this , Ġupdate . to Long ()) Ċ } Ċ Ċ internal Ġclass ĠFloat Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġunit : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġrange : ĠClosed Range < Double >? Ċ ) Ġ: ĠAbstract Number Property < Double >( ĊĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" float ", ĊĠĠĠĠĠĠĠ Ġrange Ġ= Ġrange ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < Double > Ġ= ĠProperty Update ( this , Ġupdate . toDouble ()) Ċ } Ċ Ċ internal Ġclass ĠEnum Property < E Ġ: ĠEnum < E >>( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġunit : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġenum Values : ĠList < String >, ĊĠĠĠ Ġprivate Ġval Ġenum Map : ĠMap < String , ĠE > Ċ ) Ġ: ĠBase Property < E >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġunit , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" enum ", ĊĠĠĠĠĠĠĠ Ġformat Ġ= Ġenum Values . join ToString (",") Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠProperty Update ( this , Ġenum Map . getValue ( update )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠBool Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE Ċ ) Ġ: ĠBase Property < Boolean >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" boolean ", ĊĠĠĠĠĠĠĠ Ġformat Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < Boolean > Ġ= ĠProperty Update ( this , Ġupdate . to Boolean ()) Ċ } Ċ Ċ internal Ġabstract Ġclass ĠAbstract Color Property < T > Ġinternal Ġconstructor ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE , ĊĠĠĠ Ġcolor Type : ĠString Ċ ) Ġ: ĠBase Property < T >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġdatatype Ġ= Ġ" color ", ĊĠĠĠĠĠĠĠ Ġunit Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġformat Ġ= Ġcolor Type ) Ġ{ ĊĊĠĠĠ Ġprotected Ġfun Ġparse Color String ( string : ĠString ): ĠTrip le < Int , ĠInt , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( first , Ġsecond , Ġthird ) Ġ= Ġstring . split (',' ). map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( first , Ġsecond , Ġthird ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠH SV Color Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE Ċ ) Ġ: ĠAbstract Color Property < H SV >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġcolor Type Ġ= Ġ" h sv ") Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < H SV > Ġ= ĠProperty Update ( this , ĠH SV ( parse Color String ( update ))) ĊĊĠĠĠ Ġoverride Ġfun Ġvalue ToString ( value : ĠH SV ): ĠString Ġ= Ġ"${ value . hue }, ${ value . sat uration }, ${ value . value }" Ċ } Ċ Ċ internal Ġclass ĠRGB Color Property ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġname : ĠString ?, ĊĠĠĠ Ġparent Publisher : ĠH om ie Publisher , ĊĠĠĠ Ġtype : ĠProperty Type Ġ= ĠProperty Type . STATE Ċ ) Ġ: ĠAbstract Color Property < RGB >( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠ Ġparent Publisher Ġ= Ġparent Publisher , ĊĠĠĠĠĠĠĠ Ġcolor Type Ġ= Ġ" rgb ") Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvalue ToString ( value : ĠRGB ): ĠString Ġ= Ġ"${ value . red }, ${ value . green }, ${ value . blue }" ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Update FromString ( update : ĠString ): ĠProperty Update < RGB > Ġ= ĠProperty Update ( this , ĠRGB ( parse Color String ( update ))) Ċ } Ċ