# @name Anothertime # @desc Always see time and other widgets # @author toinux@gmail.com # @version 1.3 # @config sc color "Seconds color" default=#FF00FF # @config ta select "Time animation" options=scroll,fade default=fade # @config tad slider "Time animation duration" min=100 max=2000 default=500 unit=ms # @config dsty select "Date style" default=icon options=icon,calendar # @config wsty select "Week style" default=dotted2 options=large,progress,dotted,dotted2 # @config wc color "Week days color" default=#00FFFF # @config wdc color "Current day color" default=#FF00FF # @config ssun bool "Week starts Sunday" default=false # @config wa select "Widgets animation" options=scroll,fade default=fade # @config wad slider "Widgets animation duration" min=100 max=2000 default=500 unit=ms # @config btopic text "Battery topic" default="" # @config wlist text "Widgets" default="date,temperature,humidity,battery" help="ex: date,temperature@5,humidity,date@4,battery" maxlen=200 import math class a var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O def parse_widgets() var P=[] var Q=store.get("wlist") if Q!=nil for R:re.matchall("[^,]+",Q) var S=re.match("(date|temperature|humidity|battery)(@([0-9]+))?$",R) if S!=nil P.push({"name":S[1], "duration":S[3]==nil?self.h:clamp(num(S[3],self.h),1,60)}) end end end if size(P)==0 P.push({"name":"date","duration":self.h}) end return P end def init() self.update() self.b=["0","0","0","0"] self.c=["0","0","0","0"] self.f=nil self.h=3 self.g=self.parse_widgets() self.i=0 self.k=self.g[0]["name"] self.l=nil self.j=self.g[0]["duration"] self.m=nil self.v=store.get("wa") self.w=store.get("wad") self.s=store.get("sc") self.t=store.get("ta") self.u=store.get("tad") self.N=500 self.O=nil self.o=store.get("wsty") self.p=store.get("wc") self.q=store.get("wdc") self.r=store.get("ssun") self.F=store.get("dsty") self.A="?" self.C=-1 var P=store.get("btopic") if P!=nil&&size(P)>0 mqtt.subscribe(P,/Q,R->self.setbat(R)) self.B=true else self.B=false end end def update() var P=sensor.temperature() self.y=P==nil?"?":str(round(settings.get("useCelsius")?P:(P*1.8+32))) var Q=sensor.humidity() self.z=Q==nil?"?":str(round(Q)) if!self.B self.setbat(sensor.battery()) end self.D=day() self.E=str(self.D) self.x=self.getcolor("timeColor") self.G=self.getcolor("dateColor") self.H=self.getcolor("temperatureColor") self.I=self.getcolor("humidityColor") self.J=self.getcolor("batteryColor") self.K=self.getcolor("calendarHeaderColor") self.L=self.getcolor("calendarBodyColor") self.M=self.getcolor("calendarTextColor") end def getcolor(P) var Q=settings.get(P) return Q==nil?settings.get("textColor"):Q end def setbat(P) self.C=P==nil?-1:num(P) self.A=self.C<0?"?":str(self.C) end def loop() if self.j<=0 if size(self.g)>1 self.l=self.k self.i=(self.i+1)%size(self.g) self.k=self.g[self.i]["name"] self.j=self.g[self.i]["duration"] self.m=epoch_ms() else self.j=self.g[0]["duration"] end end self.j-=1 self.update() end def calculate_cur_prev() var P=hour() var Q=minute() self.b=[str(P/10),str(P%10),str(Q/10),str(Q%10)] self.d=self.b[0]+self.b[1] self.e=self.b[2]+self.b[3] var R=Q-1 var S=P if R<0 R=59 S=(P-1<0)?23:P-1 end self.c=[str(S/10),str(S%10),str(R/10),str(R%10)] self.f=Q end def fade_color(P,Q) if P==nil return self.fade_color(0xFFFFFF,Q)end if Q>=1.0 return P end var R=(P>>16)&0xFF var S=(P>>8)&0xFF var T=P&0xFF return rgb(int(R*Q),int(S*Q),int(T*Q)) end def draw_widget(P,Q,R) var S=19 var T=self.fade_color(0xFFFFFF,Q) var U=self.x var V="" if P=="date" if self.F=="calendar" U=self.M S=21 rect_fill(S,R,11,2,self.fade_color(self.K,Q)) rect_fill(S,R+2,11,5,self.fade_color(self.L,Q)) S-=self.D<10?2:4 else var W=self.fade_color(0x8B898C,Q) var X=self.fade_color(0x0036FF,Q) rect_fill(S,R+1,5,2,X) rect_fill(S,R+3,5,3,T) line(S+1,R,S+1,R+1,W) line(S+3,R,S+3,R+1,W) pixel(S+1,R+4,W) pixel(S+3,R+4,W) U=self.G end V=self.E elif P=="temperature" var Y=self.fade_color(0xFF4C50,Q) pixel(S+2,R,T) line(S+1,R+1,S+1,R+2,T) line(S+3,R+1,S+3,R+2,T) pixel(S+2,R+2,Y) rect_fill(S,R+3,5,2,T) rect_fill(S+1,R+3,3,2,Y) rect_fill(S+1,R+5,3,1,T) V=self.y U=self.H elif P=="battery" var Z=self.fade_color(0x00FF00,Q) rect(S,R,5,6,T) pixel(S,R,0x000000) pixel(S+4,R,0x000000) for a0:1..4 if self.C>(100-25*a0) line(S+1,R+a0,S+3,R+a0,Z) end end pixel(S+1,R+1,T) pixel(S+3,R+1,T) V=self.A U=self.J elif P=="humidity" var b0=self.fade_color(0xD5F6FF,Q) var c0=self.fade_color(0xBDF3FF,Q) var d0=self.fade_color(0x62E2FF,Q) var e0=self.fade_color(0x40DAFE,Q) var f0=self.fade_color(0x00AEFF,Q) var g0=self.fade_color(0x0089CD,Q) pixel(S+2,R,b0) pixel(S+2,R+1,c0) rect_fill(S+1,R+2,3,3,d0) rect_fill(S+1,R+2,2,2,c0) pixel(S+1,R+2,b0) line(S,R+3,S,R+4,T) pixel(S+4,R+3,f0) pixel(S+1,R+2,T) pixel(S+3,R+4,e0) pixel(S+4,R+4,g0) line(S+1,R+5,S+2,R+5,f0)pixel(S+3,R+5,g0) V=self.z U=self.I end var h0=self.fade_color(U,Q) if size(V)>2 scroll_text(S+6,R+6,6,V,h0,{"mode":"bounce","speed":40}) else text(S+6,R+6,V,h0) end end def draw() if minute()!=self.f self.calculate_cur_prev() end clear() var P=epoch_ms() var Q=P%60000 var R=0 var S=6 if second()%2>0 var T=(P%1000)/1000.0 var U=(math.cos(2*math.pi*T+math.pi)+1)*0.5 text(R+8,S,":",self.fade_color(self.x,U)) end if Q=60000-self.N&&self.O==nil self.O=P end if Q<100 self.O=nil end var Z=0 var U=0.0 if self.O!=nil var a0=P-self.O var b0=clamp(a0*1.0/self.N,0.0,1.0) var c0=Y*(1.0-b0) Z=int(c0) U=c0-Z else var d0=(Q*Y)/59000.0 Z=int(d0) U=d0-Z end for V:0..Z-1 pixel(V,7,self.s) end if Z=self.w self.m=nil self.draw_widget(self.k,1.0,0) else var U=a0*1.0/self.w if self.v=="scroll" var W=int(U*8) self.draw_widget(self.k,1,W-8) self.draw_widget(self.l,1,W) else self.draw_widget((U<0.5)?self.l:self.k,(math.cos(2*math.pi*U)+1)*0.5,0) end end else self.draw_widget(self.k,1.0,0) end var e0=self.r?weekday():(weekday()+6)%7 R=18 if self.o=="large" line(R,7,31,7,self.p) line(R+e0*2,7,R+e0*2+1,7,self.q) elif self.o=="progress" line(R,7,31,7,self.p) line(R,7,R+e0*2+1,7,self.q) elif self.o=="dotted" line(R,7,31,7,0x000000) var V=0 while V<7 pixel(R+V*2,7,V==e0?self.q:self.p) V+=1 end elif self.o=="dotted2" line(R,7,31,7,0x000000) var V=0 var f0=R while V<7 if V==e0 line(f0,7,f0+1,7,self.q) f0+=3 else pixel(f0,7,self.p) f0+=2 end V+=1 end end end end return a()