From e063b29a17a343e7492edc20f0b283a5dc04dff4 Mon Sep 17 00:00:00 2001 From: Julia Fideles Date: Thu, 19 Aug 2021 13:42:49 -0300 Subject: [PATCH] Creating project Home Assistant --- home-assistant/.gitignore | 24 + home-assistant/pom.xml | 87 ++++ .../java/com/totalcross/HomeAssistant.java | 35 ++ .../RunHomeAssistantApplication.java | 9 + .../com/totalcross/containers/ArcSlider.java | 125 ++++++ .../containers/CircleContainer.java | 18 + .../java/com/totalcross/containers/Demo.java | 417 ++++++++++++++++++ .../com/totalcross/containers/DoorBell.java | 81 ++++ .../com/totalcross/containers/Energy.java | 136 ++++++ .../com/totalcross/containers/EnergyMenu.java | 10 + .../totalcross/containers/Entertainment.java | 142 ++++++ .../com/totalcross/containers/Generator.java | 34 ++ .../com/totalcross/containers/Graphifc.java | 195 ++++++++ .../java/com/totalcross/containers/Home.java | 39 ++ .../com/totalcross/containers/HomeMap.java | 287 ++++++++++++ .../java/com/totalcross/containers/Info.java | 100 +++++ .../com/totalcross/containers/Lights.java | 318 +++++++++++++ .../totalcross/containers/MainActivity.java | 77 ++++ .../java/com/totalcross/containers/Map.java | 7 + .../com/totalcross/containers/Notify.java | 63 +++ .../containers/OnUpdateListener.java | 5 + .../com/totalcross/containers/Security.java | 95 ++++ .../com/totalcross/containers/SideMenu.java | 57 +++ .../com/totalcross/containers/Spotify.java | 35 ++ .../totalcross/containers/Temperature.java | 104 +++++ .../containers/TemperatureStudy.java | 147 ++++++ .../java/com/totalcross/database/DAO.java | 46 ++ .../totalcross/database/DatabaseManager.java | 161 +++++++ .../main/java/com/totalcross/util/Colors.java | 16 + .../main/java/com/totalcross/util/Fonts.java | 6 + .../main/java/com/totalcross/util/Images.java | 147 ++++++ .../src/main/resources/images/Eletricity.png | Bin 0 -> 3917 bytes .../src/main/resources/images/Grid.png | Bin 0 -> 452 bytes .../src/main/resources/images/Harmony.png | Bin 0 -> 4376 bytes .../src/main/resources/images/Home.png | Bin 0 -> 334 bytes .../src/main/resources/images/Non-fossil.png | Bin 0 -> 3755 bytes .../src/main/resources/images/Solar.png | Bin 0 -> 471 bytes .../src/main/resources/images/SolarPower.png | Bin 0 -> 3761 bytes .../main/resources/images/cameraDireita.png | Bin 0 -> 291 bytes .../main/resources/images/cameraEsquerda.png | Bin 0 -> 291 bytes .../src/main/resources/images/homeEnergy.png | Bin 0 -> 2834 bytes .../resources/images/iconCalenderGray.png | Bin 0 -> 1904 bytes .../resources/images/iconCalenderGreen.png | Bin 0 -> 2099 bytes .../main/resources/images/iconFrozenBlue.png | Bin 0 -> 2012 bytes .../main/resources/images/iconFrozenGray.png | Bin 0 -> 1934 bytes .../src/main/resources/images/iconHotGray.png | Bin 0 -> 1742 bytes .../main/resources/images/iconHotOrange.png | Bin 0 -> 1962 bytes .../main/resources/images/iconOffBlack.png | Bin 0 -> 312 bytes .../src/main/resources/images/iconOffGray.png | Bin 0 -> 1657 bytes .../main/resources/images/iconPowerCharge.png | Bin 0 -> 590 bytes .../resources/images/iconSecurityGreen.png | Bin 0 -> 3295 bytes .../main/resources/images/iconSecurityRed.png | Bin 0 -> 3203 bytes .../src/main/resources/images/imgNFossil.png | Bin 0 -> 424 bytes .../src/main/resources/images/lampBlack.png | Bin 0 -> 362 bytes .../src/main/resources/images/lampYellow.png | Bin 0 -> 2944 bytes .../src/main/resources/images/mapa.png | Bin 0 -> 77772 bytes .../src/main/resources/images/spotify.png | Bin 0 -> 38171 bytes 57 files changed, 3023 insertions(+) create mode 100644 home-assistant/.gitignore create mode 100644 home-assistant/pom.xml create mode 100644 home-assistant/src/main/java/com/totalcross/HomeAssistant.java create mode 100644 home-assistant/src/main/java/com/totalcross/RunHomeAssistantApplication.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/ArcSlider.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/CircleContainer.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Demo.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/DoorBell.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Energy.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/EnergyMenu.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Entertainment.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Generator.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Graphifc.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Home.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/HomeMap.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Info.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Lights.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/MainActivity.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Map.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Notify.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/OnUpdateListener.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Security.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/SideMenu.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Spotify.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/Temperature.java create mode 100644 home-assistant/src/main/java/com/totalcross/containers/TemperatureStudy.java create mode 100644 home-assistant/src/main/java/com/totalcross/database/DAO.java create mode 100644 home-assistant/src/main/java/com/totalcross/database/DatabaseManager.java create mode 100644 home-assistant/src/main/java/com/totalcross/util/Colors.java create mode 100644 home-assistant/src/main/java/com/totalcross/util/Fonts.java create mode 100644 home-assistant/src/main/java/com/totalcross/util/Images.java create mode 100644 home-assistant/src/main/resources/images/Eletricity.png create mode 100644 home-assistant/src/main/resources/images/Grid.png create mode 100644 home-assistant/src/main/resources/images/Harmony.png create mode 100644 home-assistant/src/main/resources/images/Home.png create mode 100644 home-assistant/src/main/resources/images/Non-fossil.png create mode 100644 home-assistant/src/main/resources/images/Solar.png create mode 100644 home-assistant/src/main/resources/images/SolarPower.png create mode 100644 home-assistant/src/main/resources/images/cameraDireita.png create mode 100644 home-assistant/src/main/resources/images/cameraEsquerda.png create mode 100644 home-assistant/src/main/resources/images/homeEnergy.png create mode 100644 home-assistant/src/main/resources/images/iconCalenderGray.png create mode 100644 home-assistant/src/main/resources/images/iconCalenderGreen.png create mode 100644 home-assistant/src/main/resources/images/iconFrozenBlue.png create mode 100644 home-assistant/src/main/resources/images/iconFrozenGray.png create mode 100644 home-assistant/src/main/resources/images/iconHotGray.png create mode 100644 home-assistant/src/main/resources/images/iconHotOrange.png create mode 100644 home-assistant/src/main/resources/images/iconOffBlack.png create mode 100644 home-assistant/src/main/resources/images/iconOffGray.png create mode 100644 home-assistant/src/main/resources/images/iconPowerCharge.png create mode 100644 home-assistant/src/main/resources/images/iconSecurityGreen.png create mode 100644 home-assistant/src/main/resources/images/iconSecurityRed.png create mode 100644 home-assistant/src/main/resources/images/imgNFossil.png create mode 100644 home-assistant/src/main/resources/images/lampBlack.png create mode 100644 home-assistant/src/main/resources/images/lampYellow.png create mode 100644 home-assistant/src/main/resources/images/mapa.png create mode 100644 home-assistant/src/main/resources/images/spotify.png diff --git a/home-assistant/.gitignore b/home-assistant/.gitignore new file mode 100644 index 0000000..d952bab --- /dev/null +++ b/home-assistant/.gitignore @@ -0,0 +1,24 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar +*.target + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/home-assistant/pom.xml b/home-assistant/pom.xml new file mode 100644 index 0000000..866f6d7 --- /dev/null +++ b/home-assistant/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + com.totalcross + Home-Assistant + 1.0-SNAPSHOT + Home-Assistant + + + UTF-8 + 5443444B5AAEEB90306B00E4 + + + + + com.totalcross + totalcross-sdk + 7.1.0 + + + + + + totalcross-repo + ip-172-31-40-140-releases + https://maven.totalcross.com/artifactory/repo1 + + + + + + totalcross-repo + ip-172-31-40-140-releases + https://maven.totalcross.com/artifactory/repo1 + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + com.totalcross + totalcross-maven-plugin + 2.0.4 + + ${project.name} + + -android +-win32 + + ${totalcross.activation_key} + + + + + + + post-compile + compile + + retrolambda + + + + post-package + package + + package + + + + + + + \ No newline at end of file diff --git a/home-assistant/src/main/java/com/totalcross/HomeAssistant.java b/home-assistant/src/main/java/com/totalcross/HomeAssistant.java new file mode 100644 index 0000000..22979f2 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/HomeAssistant.java @@ -0,0 +1,35 @@ +package com.totalcross; + +import totalcross.ui.MainWindow; +import totalcross.sys.Settings; + + +import com.totalcross.util.Colors; +import com.totalcross.containers.MainActivity; +import com.totalcross.containers.SideMenu; +import com.totalcross.database.DatabaseManager; + +public class HomeAssistant extends MainWindow { + + MainActivity mainActivity; + SideMenu sideMenu; + + public HomeAssistant() { + setUIStyle(Settings.MATERIAL_UI); + setBackColor(Colors.BACKGROUD_DEFAULT); + try { + DatabaseManager.getInstance(); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Override + public void initUI() { + sideMenu = new SideMenu(); + add(sideMenu,LEFT, TOP,PARENTSIZE,PARENTSIZE); + } + +} diff --git a/home-assistant/src/main/java/com/totalcross/RunHomeAssistantApplication.java b/home-assistant/src/main/java/com/totalcross/RunHomeAssistantApplication.java new file mode 100644 index 0000000..92ea3e3 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/RunHomeAssistantApplication.java @@ -0,0 +1,9 @@ +package com.totalcross; + +import totalcross.TotalCrossApplication; + +public class RunHomeAssistantApplication { + public static void main(String[] args) { + TotalCrossApplication.run(HomeAssistant.class, "/scr", "800x480", "/r", "xxxxxxxxxxxxxxxxxxxxxxxx"); + } +} \ No newline at end of file diff --git a/home-assistant/src/main/java/com/totalcross/containers/ArcSlider.java b/home-assistant/src/main/java/com/totalcross/containers/ArcSlider.java new file mode 100644 index 0000000..3430c45 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/ArcSlider.java @@ -0,0 +1,125 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; + +import totalcross.ui.Container; +import totalcross.ui.Control; +import totalcross.ui.event.DragEvent; +import totalcross.ui.event.PenEvent; +import totalcross.ui.event.PenListener; +import totalcross.ui.gfx.Coord; +import totalcross.ui.gfx.Graphics; + +public class ArcSlider extends Container { + + int startAngle = 225; + int endAngle = 315; + int radius; + + class Handle extends Control { + + int pos = 0; + Coord center; + + Handle(int pos) { + this.pos = pos; + center = getAnglePoint(pos); + this.addPenListener(new PenListener() { + boolean isDragging = false; + + @Override + public void penDown(PenEvent arg0) { + // System.out.println(arg0); + } + + @Override + public void penDrag(DragEvent arg0) { + // if (isInside(arg0.x, arg0.y, 10)) + if (isDragging) { + // System.out.println(arg0); + int angle = findAngle(arg0.x, arg0.y); + if (angle != Handle.this.pos) { + Handle.this.pos = angle; + center = getCoordByAngle(Handle.this.pos); + repaint(); + } + } + } + + @Override + public void penDragEnd(DragEvent arg0) { + // System.out.println(arg0); + isDragging = false; + } + + @Override + public void penDragStart(DragEvent arg0) { + if (isInside(arg0.x, arg0.y, 10)) { + // System.out.println(arg0); + isDragging = true; + } + } + + @Override + public void penUp(PenEvent arg0) { + // System.out.println(arg0); + } + }); + } + + @Override + public void onPaint(Graphics g) { + g.drawCircle(center.x, center.y, 10); + } + + public boolean isInside(int x, int y, int radius) { + int dx = Math.abs(x - center.x); + int dy = Math.abs(y - center.y); + + if (dx > radius) + return false; + if (dy > radius) + return false; + + if (dx + dy <= radius) + return true; + return (dx * dx + dy * dy <= radius * radius); + } + } + + @Override + public void initUI() { + super.initUI(); + this.radius = Math.min(width, height) / 3; + add(new Handle(startAngle), 0, 0, width, height); + add(new Handle(startAngle), 0, 0, width, height); + } + + @Override + public void onPaint(Graphics g) { + super.onPaint(g); + g.backColor = Colors.BACKGROUD_DEFAULT; + g.fillRect(0, 0, width, height); + g.drawArc(width / 2, height / 2, radius, 315, 225); + } + + // Faz o mesmo que getAnglePoint, mas não consegui escolher entre as duas + private Coord getCoordByAngle(int angle) { + Coord result = new Coord(); + result.x = (width / 2) + (int) (Math.cos(Math.toRadians(angle)) * radius); + result.y = (height / 2) - (int) (Math.sin(Math.toRadians(angle)) * radius); + return result; + } + + private Coord getAnglePoint(int angle) { + Coord out = new Coord(); + this.getGraphics().getAnglePoint(width / 2, height / 2, radius, radius, angle, out); + return out; + } + + private int findAngle(int x, int y) { + double theta = Math.toDegrees(Math.atan2((height / 2) - y, x - (width / 2))); + theta = (theta + 360) % 360; + return (int) theta; + } +} \ No newline at end of file diff --git a/home-assistant/src/main/java/com/totalcross/containers/CircleContainer.java b/home-assistant/src/main/java/com/totalcross/containers/CircleContainer.java new file mode 100644 index 0000000..b2c7376 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/CircleContainer.java @@ -0,0 +1,18 @@ +package com.totalcross.containers; + +import totalcross.ui.Control; +import totalcross.ui.gfx.Graphics; + +public class CircleContainer extends Control { + public CircleContainer(int cor){ + this.cor = cor; + } + int cor; + @Override + public void onPaint(Graphics g) { + g.foreColor = cor; + g.drawCircle(width /2, height/2, 30); + + } + +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Demo.java b/home-assistant/src/main/java/com/totalcross/containers/Demo.java new file mode 100644 index 0000000..1bdcf52 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Demo.java @@ -0,0 +1,417 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; +import totalcross.sys.Vm; +import totalcross.ui.Button; +import totalcross.ui.ComboBox; +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.Radio; +import totalcross.ui.ScrollContainer; +import totalcross.ui.Switch; +import totalcross.ui.dialog.ColorChooserBox; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; + +public class Demo extends ScrollContainer{ + + public Container First; + public Container Second; + public Container Third; + public Container Fourth; + + public Label lblTitle; + public Label lblSubTitle; + public Label lblIdioma; + public Label lblNumericFormatting; + public Label lblNumericFormattingSub; + public Label lblHourFormat; + public Label lblHourFormatSub; + public Label lblTheme; + public Label lblControlPanel; + public Label lblControlPanelSub; + public Label lbl01; + public Label lbl01Sub; + public Label lblOcult; + public Label lblOcultSub; + public Label lblOcultSub2; + public Label lblVibrar; + public Label lblVibrarSub; + public Label lblNotify; + public Label lblNotifySub; + public Label lblMode; + public Label lblModeSub; + public Label lblClose; + public Label lblCloseSub; + public Label lblShortcuts; + public Label lblShortcutsSub; + public Label lblTitleModulo; + public Label lblTitleTokens; + public Label lblTokensSub; + public Label lblTitleTokensAccess; + public Label lblTokensAccessSub; + public Label lblTokensAccessStatus; + + public Button Edit; + public Button CreateToken; + public Button Exit; + + public ComboBox cbnIdioma; + public ComboBox cbnNumericFormatting; + public ComboBox cbnHourFormat; + public ComboBox cbnTheme; + public ComboBox cbnControlPane; + + public Switch sldOcult; + public Switch sldVibrar; + public Switch sldNotify; + public Switch sldMode; + public Switch sldClose; + public Switch sldShorcuts; + + public ColorChooserBox colorMain; + + public Radio auto; + public Radio Claro; + public Radio Escuro; + + @Override + public void initUI() { + + try { + setScrollBars(false, true); + setBackForeColors(0xF7F7F7, 0x000000); + + First = new Container(); + Second = new Container(); + Third = new Container(); + Fourth = new Container(); + + lblTitle = new Label("Demo User"); + lblSubTitle = new Label("Você está logado como Demo User. Você é um proprietário."); + lblIdioma = new Label("Idioma"); + lblNumericFormatting = new Label("Formatação numérica"); + lblNumericFormattingSub = new Label("Choose how numbers are formatted."); + lblHourFormat = new Label("Formato de hora"); + lblHourFormatSub = new Label("Escolha como os horários são formatados."); + lblTheme = new Label("Tema"); + lblControlPanel = new Label("Painel de controle"); + lblControlPanelSub = new Label("Escolha um painel padrão para este dispositivo."); + lbl01 = new Label("Altere a ordem e oculte os itens da barra lateral"); + lbl01Sub = new Label("Pode também pressionar e segurar o cabeçalho da " + + "barra lateral \n para ativar o modo de edição."); + lblOcult = new Label("Sempre ocultar a barra lateral"); + lblOcultSub = new Label("Isto irá ocultar a barra lateral por padrão, semelhante à \n experiência móvel."); + lblVibrar = new Label("Vibrar"); + lblVibrarSub = new Label("Ative ou desative a vibração neste dispositivo ao controlar \n dispositivos."); + lblNotify = new Label("Notificações push"); + lblNotifySub = new Label("Envie notificações para este dispositivo"); + lblMode = new Label("Modo Avançado"); + lblModeSub = new Label("Desbloqueia recursos avançados."); + lblClose = new Label("Fechar a conexão automaticamente"); + lblCloseSub = new Label("Devemos fechar a conexão com o servidor depois de ficar oculto por \n 5 minutos?"); + lblShortcuts = new Label("Atalhos de Teclado"); + lblShortcutsSub = new Label("Ativar ou desativar atalhos de teclado para executar várias ações na \n IU."); + lblTitleModulo = new Label("Módulos de Autenticação Multifator"); + lblTitleTokens = new Label("Tokens de atualização"); + lblTokensSub = new Label("Cada token de atualização representa uma sessão de login. Os tokens de atualização serão \n" +"removidos automaticamente quando você clicar em efetuar logout. Os tokens de \n" + + "atualização a seguir estão ativos na sua conta no momento."); + lblTitleTokensAccess = new Label("Tokens de acesso de longa duração"); + lblTokensAccessSub = new Label("Crie tokens de acesso de longa duração para permitir que seus scripts interajam com \n sua instância do Home Assistant. Cada token será válido por 10 anos a partir da criação. Os \n" + + "seguintes tokens de acesso de longa duração estão atualmente ativos"); + lblTokensAccessStatus = new Label("Você ainda não tem tokens de acesso de longa duração."); + + Edit = new Button("EDITAR"); + CreateToken = new Button("CRIAR TOKEN"); + Exit = new Button("SAIR"); + + + sldOcult = new Switch(); + sldVibrar = new Switch(); + sldNotify = new Switch(); + sldMode = new Switch(); + sldClose = new Switch(); + sldShorcuts = new Switch(); + + auto = new Radio("Automático"); + Claro = new Radio("Claro"); + Escuro = new Radio("Escuro"); + + //Configurando Labels + lblTitle.transparentBackground = true; + lblSubTitle.transparentBackground = true; + lblIdioma.transparentBackground = true; + lblNumericFormatting.transparentBackground = true; + lblNumericFormattingSub.transparentBackground = true; + lblHourFormat.transparentBackground = true; + lblHourFormatSub.transparentBackground = true; + lblTheme.transparentBackground = true; + lblControlPanel.transparentBackground = true; + lblControlPanelSub.transparentBackground = true; + lbl01.transparentBackground = true; + lbl01Sub.transparentBackground = true; + lblOcult.transparentBackground = true; + lblOcultSub.transparentBackground = true; + lblVibrar.transparentBackground = true; + lblVibrarSub.transparentBackground = true; + lblNotify.transparentBackground = true; + lblNotifySub.transparentBackground = true; + lblMode.transparentBackground = true; + lblModeSub.transparentBackground = true; + lblClose.transparentBackground = true; + lblCloseSub.transparentBackground = true; + lblShortcuts.transparentBackground = true; + lblShortcutsSub.transparentBackground = true; + lblTitleModulo.transparentBackground = true; + lblTitleTokens.transparentBackground = true; + lblTokensSub.transparentBackground = true; + lblTitleTokensAccess.transparentBackground = true; + lblTokensAccessSub.transparentBackground = true; + lblTokensAccessStatus.transparentBackground = true; + + lblTitle.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 40)); + lblSubTitle.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblIdioma.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblNumericFormatting.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblNumericFormattingSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblHourFormat.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblHourFormatSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblTheme.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblControlPanel.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblControlPanelSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lbl01.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lbl01Sub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblOcult.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblOcultSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblVibrar.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblVibrarSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblNotify.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblNotifySub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblMode.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblModeSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblClose.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblCloseSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblShortcuts.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblShortcutsSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblTitleModulo.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblTitleTokens.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblTokensSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblTitleTokensAccess.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 15)); + lblTokensAccessSub.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblTokensAccessStatus.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + + + //Configurando Radio Button + auto.transparentBackground = true; + Claro.transparentBackground = true; + Escuro.transparentBackground = true; + + //Adicioanndo itens no array + String[] itemsIdioma = { + "Afrikaans" + ,"عربية" + ,"Български" + ,"বাংলা" + ,"Bosanski" + ,"Català" + ,"Čeština" + ,"Cymraeg" + ,"Dansk" + ,"Deutsch" + ,"Ελληνικά" + ,"English" + ,"English (GB)" + ,"Esperanto" + ,"Español" + ,"Español (Latin America)" + ,"Eesti" + ,"Euskara" + ,"فارسی" + ,"Suomi" + ,"Frysk" + ,"Français" + ,"Galego" + ,"Schwiizerdütsch" + ,"עברית" + ,"हिन्दी" + ,"Hrvatski" + ,"Magyar" + ,"Հայերեն" + ,"Indonesia" + ,"Italiano" + ,"Íslenska" + ,"日本語" + ,"Kartuli" + ,"한국어" + ,"Lëtzebuergesch" + ,"Lietuvių" + ,"Latviešu" + ,"Nederlands" + ,"Norsk Bokmål" + ,"Norsk Nynorsk" + ,"Polski" + ,"Português" + ,"Português (BR)" + ,"Română" + ,"Русский" + ,"Slovenčina" + ,"Slovenščina" + ,"Српски" + ,"Srpski" + ,"Svenska" + ,"தமிழ்" + ,"తెలుగు" + ,"ภาษาไทย" + ,"Türkçe" + ,"Українська" + ,"اُردُو" + ,"Tiếng Việt" + ,"简体中文" + ,"繁體中文" + ,"Test"}; + + String[] itemsNumericFormatting = { + "Auto (use language setting)" + ,"1.234.567,89" + ,"Use system locale" + ,"1.234.567,89" + ,"1,234,567.89" + ,"1.234.567,89" + ,"1 234 567,89" + ,"None" + ,"1234567.89" + }; + + String[] itemsHourFormat = { + "Automático (usar configuração de idioma)" + ,"13:30" + ,"Use a localidade do sistema" + ,"13:30" + ,"12 horas (AM/PM)" + ,"1:30 PM" + ,"24 horas" + ,"13:30" + }; + + String[] itemsTheme = { + "Backend-selected" + ,"default" + ,"mock'" + }; + + //Criando combo box + cbnIdioma = new ComboBox(itemsIdioma); + cbnNumericFormatting = new ComboBox(itemsNumericFormatting); + cbnHourFormat = new ComboBox(itemsHourFormat); + cbnTheme = new ComboBox(itemsTheme); + cbnControlPane = new ComboBox(); + + //Configurando combo box + cbnIdioma.caption = itemsIdioma[0]; + cbnNumericFormatting.caption = itemsNumericFormatting[0]; + cbnHourFormat.caption = itemsHourFormat[0]; + cbnTheme.caption = itemsTheme[0]; + cbnControlPane.caption = "defautl"; + cbnControlPane.enableSearch = false; + + //Adicionando os containers ao layout + add(First,LEFT,TOP); + add(Second,LEFT,TOP + 800); + add(Third,LEFT,TOP + 850); + add(Fourth,LEFT,TOP + 900); + + //Adicionando componentes aos containers + First.add(lblTitle,LEFT + 10,TOP); + First.add(lblSubTitle,SAME ,AFTER + 2 ); + First.add(lblIdioma,SAME ,AFTER + 5); + First.add(lblNumericFormatting,SAME ,AFTER + 12); + First.add(lblNumericFormattingSub,SAME ,AFTER + 2); + First.add(lblHourFormat,SAME ,AFTER + 12); + First.add(lblHourFormatSub,SAME ,AFTER + 2); + First.add(lblTheme,SAME ,AFTER + 12); + First.add(auto,SAME + 5 ,AFTER + 12); + First.add(Claro,SAME + 120 ,SAME); + First.add(Escuro,SAME + 80 ,SAME); + First.add(lblControlPanel,LEFT + 10 ,AFTER + 12); + First.add(lblControlPanelSub,SAME ,AFTER + 2); + First.add(lbl01,SAME ,AFTER + 12); + First.add(lbl01Sub,SAME ,AFTER + 2); + First.add(lblOcult,SAME ,AFTER + 12); + First.add(lblOcultSub,SAME ,AFTER + 2); + First.add(lblVibrar,SAME ,AFTER + 12); + First.add(lblVibrarSub,SAME ,AFTER + 2); + First.add(lblNotify,SAME ,AFTER + 12); + First.add(lblNotifySub,SAME ,AFTER + 2); + First.add(lblMode,SAME ,AFTER + 12); + First.add(lblModeSub,SAME ,AFTER + 2); + First.add(lblClose,SAME ,AFTER + 12); + First.add(lblCloseSub,SAME ,AFTER + 2); + First.add(lblShortcuts,SAME ,AFTER + 12); + First.add(lblShortcutsSub,SAME ,AFTER + 2); + + First.add(cbnIdioma, LEFT + 330 , TOP + 63,150,40); + First.add(cbnNumericFormatting, SAME , AFTER + 4,150,40); + First.add(cbnHourFormat, SAME , AFTER + 4,150,40); + First.add(cbnTheme, SAME , AFTER + 4,150,40); + First.add(cbnControlPane, SAME , AFTER + 40,150,40); + + First.add(Edit, SAME + 55, AFTER + 15); + + First.add(sldOcult,SAME + 35,AFTER + 40); + First.add(sldVibrar,SAME ,AFTER + 50); + First.add(sldNotify,SAME ,SAME + 55); + First.add(sldMode,SAME ,AFTER + 35); + First.add(sldClose,SAME ,AFTER + 40); + First.add(sldShorcuts,SAME ,AFTER + 45); + + First.add(Exit,LEFT + 10, AFTER + 20); + + Second.add(lblTitleModulo,LEFT + 10, TOP + 20); + + Third.add(lblTitleTokens, LEFT + 10, TOP + 20); + Third.add(lblTitleTokens, LEFT + 10, TOP + 20); + + Fourth.add(lblTitleTokensAccess, LEFT + 10, AFTER + 20); + Fourth.add(lblTokensAccessSub, LEFT + 10, AFTER + 20); + Fourth.add(lblTokensAccessStatus, LEFT + 10, AFTER + 20); + Fourth.add(CreateToken, LEFT + 10, AFTER + 20); + + // Configurando o container + First.setBackColor(Colors.BACKGROUD_DEFAULT); + First.setBorderRadius(5); + First.setBorderStyle(BORDER_RAISED); + First.setBackColor(Color.WHITE); + + Second.setBackColor(Colors.BACKGROUD_DEFAULT); + Second.setBorderRadius(5); + Second.setBorderStyle(BORDER_RAISED); + Second.setBackColor(Color.WHITE); + + Third.setBackColor(Colors.BACKGROUD_DEFAULT); + Third.setBorderRadius(5); + Third.setBorderStyle(BORDER_RAISED); + Third.setBackColor(Color.WHITE); + + Fourth.setBackColor(Colors.BACKGROUD_DEFAULT); + Fourth.setBorderRadius(5); + Fourth.setBorderStyle(BORDER_RAISED); + Fourth.setBackColor(Color.WHITE); + + // Configurando tamanho do container + First.setRect(LEFT,TOP, 500, 800); + Second.setRect(LEFT,TOP + 800, KEEP, KEEP); + Third.setRect(LEFT,TOP + 850, KEEP, KEEP); + Fourth.setRect(LEFT,TOP + 900, KEEP, KEEP); + + First.resize(); + Second.resize(); + Third.resize(); + Fourth.resize(); + + } catch (Exception e) { + Vm.debug(e.toString()); + //e.printStackTrace(); + } + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/DoorBell.java b/home-assistant/src/main/java/com/totalcross/containers/DoorBell.java new file mode 100644 index 0000000..90b9fd9 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/DoorBell.java @@ -0,0 +1,81 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; + +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; +import totalcross.ui.icon.Icon; +import totalcross.ui.icon.MaterialIcons; + +public class DoorBell extends Container { + + public DoorBell() { + + } + + // declarações + public Label title, fDoor, fDMontion, fDLDing, fDLMotion, fDEstado, fDMEstado, fDLDtempo, fDLMtempo; + public Icon fDoorIcon, fDMIcon, fDLDIcon, fDLMoIcon; + + public void initUI() { + + // setando labels + title = new Label("Doorbell"); + fDoor = new Label("Front Door Ding"); + fDMontion = new Label("Front Door Motion"); + fDLDing = new Label("Front Door Last Ding"); + fDLMotion = new Label("Front Door Last Motion"); + fDEstado = new Label("Desocupado"); + fDMEstado = new Label("Desligado"); + fDLDtempo = new Label("06:44"); + fDLMtempo = new Label("13:21"); + + // setando icones + fDoorIcon = new Icon(MaterialIcons._HOME); + fDMIcon = new Icon(MaterialIcons._DIRECTIONS_WALK); + fDLDIcon = new Icon(MaterialIcons._HISTORY); + fDLMoIcon = new Icon(MaterialIcons._HISTORY); + + // configurando container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + // configurando icones + fDoorIcon.setForeColor(Colors.FROZEN_DEFAULT); + fDMIcon.setForeColor(Colors.FROZEN_DEFAULT); + fDLDIcon.setForeColor(Colors.FROZEN_DEFAULT); + fDLMoIcon.setForeColor(Colors.FROZEN_DEFAULT); + + // configurando labels + title.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, title.getFont().size + 10)); + fDoor.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDMontion.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDEstado.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDMEstado.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDLDing.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDLDtempo.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDLMotion.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + fDLMtempo.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + + add(title, LEFT + 10, TOP); + add(fDoorIcon, LEFT + 10, AFTER + 30); + add(fDoor, AFTER + 10, SAME + 5); + add(fDEstado, RIGHT_OF + 100, SAME); + add(fDMIcon, LEFT + 12, AFTER + 10); + add(fDMontion, AFTER + 10, SAME + 5); + add(fDMEstado, RIGHT_OF + 90, SAME); + add(fDLDIcon, LEFT + 8, AFTER + 10); + add(fDLDing, AFTER + 10, SAME); + add(fDLDtempo, RIGHT_OF + 75, SAME); + add(fDLMoIcon, LEFT + 8, AFTER + 10); + add(fDLMotion, AFTER + 10, SAME); + add(fDLMtempo, RIGHT_OF + 65, SAME); + + this.resize(); + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Energy.java b/home-assistant/src/main/java/com/totalcross/containers/Energy.java new file mode 100644 index 0000000..1e11c72 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Energy.java @@ -0,0 +1,136 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Images; + +import totalcross.io.IOException; +import totalcross.ui.Button; +import totalcross.ui.Container; +import totalcross.ui.ScrollBar; +import totalcross.ui.Slider; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; +import totalcross.ui.image.Image; +import totalcross.ui.image.ImageException; +import totalcross.util.UnitsConverter; + +public class Energy extends Container { + public Energy() { + + } + + public Container energyContainer; + public Button btnDashboard; + //public ImageControl eletrica, home; + //public CircleContainer eletrica, home; + //public Label lblNFossil, lblSolar, lblGrid1, lblGrid2, lblHome; + public Slider sldNFossil, sldSolGrid, sldSolHome, sldGridHome; + public Generator nFossil, solar, eletrica, home; + public Image imgNFossil, imgSolar, imgEletrica, imgHome; + static final int SIZEC = 100; + + public void initUI() { + + energyContainer = new Container(); + + Images.loadNonFossil(); + Images.loadSolarPower(); + Images.loadEletricity(); + Images.loadHomeEnergy(); + + + + + add(energyContainer, LEFT, TOP, 200, 200); + energyContainer.setBorderStyle(BORDER_RAISED); + energyContainer.setBackColor(Colors.BACKGROUD_DEFAULT); + + try { + imgNFossil = new Image("images/imgNFossil.png"); + imgSolar = new Image("images/Solar.png"); + imgEletrica = new Image("images/Grid.png"); + imgHome = new Image("images/Home.png"); + + } catch (IOException | ImageException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + sldNFossil = new Slider(ScrollBar.VERTICAL); + sldNFossil.setFont(Font.getFont(false, Font.NORMAL_SIZE)); + sldNFossil.appId = 1; + sldNFossil.setLiveScrolling(false); + sldNFossil.setBackColor(0x00C301); + sldNFossil.sliderColor = 0x00C301; + sldNFossil.setPressColor(0x00C301); + sldNFossil.setMaximum(15); + sldNFossil.markerSize = 0; + sldNFossil.barHeight = 2; + + sldSolGrid = new Slider(ScrollBar.VERTICAL); + sldSolGrid.setFont(Font.getFont(false, Font.NORMAL_SIZE)); + sldSolGrid.appId = 2; + sldSolGrid.setLiveScrolling(true); + sldSolGrid.setBackColor(0xff781f); + sldSolGrid.sliderColor = 0xff781f; + sldSolGrid.setPressColor(0xff781f); + sldSolGrid.setMaximum(50); + sldSolGrid.markerSize = 2; + sldSolGrid.barHeight = 2; + + sldSolHome = new Slider(ScrollBar.VERTICAL); + sldSolHome.setFont(Font.getFont(false, Font.NORMAL_SIZE)); + sldSolHome.appId = 3; + sldSolHome.setLiveScrolling(true); + sldSolHome.setBackColor(0xff781f); + sldSolHome.sliderColor = 0xff781f; + sldSolHome.setPressColor(0xff781f); + sldSolHome.setMaximum(50); + sldSolHome.markerSize = 2; + sldSolHome.barHeight = 2; + + sldGridHome = new Slider(ScrollBar.HORIZONTAL); + sldGridHome.setFont(Font.getFont(false, Font.NORMAL_SIZE)); + sldGridHome.appId = 4; + sldGridHome.setLiveScrolling(true); + sldGridHome.setBackColor(0x2b5bb0); + sldGridHome.sliderColor = 0x2b5bb0; + sldGridHome.setPressColor(0x2b5bb0); + sldGridHome.setMaximum(55); + sldGridHome.markerSize = 2; + sldGridHome.barHeight = 2; + + + nFossil = new Generator(Color.GREEN, 2.1, imgNFossil); + solar = new Generator(Color.YELLOW, 5.2,imgSolar); + eletrica = new Generator(Color.BLUE,3.6, imgEletrica); + home = new Generator(Color.RED, 9, imgHome); + + + nFossil.setConsumer(eletrica, 2.1); + eletrica.setConsumer(home, 3.6); + solar.setConsumer(home, 4.9); + solar.setConsumer(eletrica, 1.4); + + + solar.transparentBackground = true; + eletrica.transparentBackground = true; + home.transparentBackground = true; + + + + btnDashboard = new Button("GO TO ENERGY DASHBOARD", Button.BORDER_NONE); + + btnDashboard.setForeColor(Colors.FROZEN_DEFAULT); + + energyContainer.add(nFossil, LEFT, TOP, 80, 80); + energyContainer.add(solar, RIGHT, TOP, 80, 80); + energyContainer.add(eletrica, LEFT, TOP + 110, 80, 80); + energyContainer.add(home, RIGHT + 80, TOP + 110, 80, 80); + energyContainer.add(btnDashboard, CENTER, BOTTOM + 100, PARENTSIZE, PREFERRED); + + energyContainer.resize(); + + } + +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/EnergyMenu.java b/home-assistant/src/main/java/com/totalcross/containers/EnergyMenu.java new file mode 100644 index 0000000..a620836 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/EnergyMenu.java @@ -0,0 +1,10 @@ +package com.totalcross.containers; + +import totalcross.ui.ScrollContainer; + +public class EnergyMenu extends ScrollContainer{ + + +} + + diff --git a/home-assistant/src/main/java/com/totalcross/containers/Entertainment.java b/home-assistant/src/main/java/com/totalcross/containers/Entertainment.java new file mode 100644 index 0000000..7b307ac --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Entertainment.java @@ -0,0 +1,142 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Images; + +import totalcross.ui.Button; +import totalcross.ui.ComboBox; +import totalcross.ui.Container; +import totalcross.ui.ImageControl; +import totalcross.ui.Label; +import totalcross.ui.ScrollBar; +import totalcross.ui.Slider; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; +import totalcross.ui.icon.Icon; +import totalcross.ui.icon.MaterialIcons; + +public class Entertainment extends Container { + static final int SIZEC = 100; + // public Container entretenimento; + + public Entertainment() { + + } + + public Label title, atividade, comutadorHDMI, entradaHDMI, volume, tempTV, desligarTV, txtDevice, txtAtiv, + txtTempTV; + public String[] services = { "PowerOFF", "Watch Fire TV", "YouTube", "SATV", "Watch Apple TV" }; + public String[] comutHDMI = { "AppleTV", "FireTV", "Shield" }; + public String[] entHDMI = { "imputHDMI1", "imputHDMI2", "imputHDMI3", "imputHDMI4" }; + public Slider vol; + public Button desl; + public ComboBox actiBox, comutBox, enterBox; + public Icon ativIcon, comutIcon, entIcon, volIcon, temptvIcon, desligarIcon; + public ImageControl imgHarmony; + + public void initUI() { + + title = new Label("Entretenimento"); + atividade = new Label("Atividade"); + comutadorHDMI = new Label("Comutador HDMI"); + entradaHDMI = new Label("Entrada HDMI"); + volume = new Label("Volume"); + tempTV = new Label("Tempo total de TV"); + desligarTV = new Label("Desligar televisão"); + txtDevice = new Label("Harmony"); + txtAtiv = new Label("YouTube "); + txtTempTV = new Label("0,42 h "); + + title.setFont(Font.getFont("Times New Roman", true, title.getFont().size + 10)); + txtDevice.setFont(Font.getFont("Times New Roman", false, atividade.getFont().size + 2)); + txtAtiv.setFont(Font.getFont("Times New Roman", false, txtAtiv.getFont().size + 2)); + volume.setFont(Font.getFont("Times New Roman", false, txtAtiv.getFont().size - 1)); + tempTV.setFont(Font.getFont("Times New Roman", false, txtAtiv.getFont().size - 1)); + txtTempTV.setFont(Font.getFont("Times New Roman", false, txtAtiv.getFont().size - 1)); + desligarTV.setFont(Font.getFont("Times New Roman", false, txtAtiv.getFont().size - 1)); + + atividade.setForeColor(0x808080); + comutadorHDMI.setForeColor(0x808080); + entradaHDMI.setForeColor(0x808080); + + actiBox = new ComboBox(services); + comutBox = new ComboBox(comutHDMI); + enterBox = new ComboBox(entHDMI); + + actiBox.borderColor = 0x000000; + actiBox.setBorderStyle(BORDER_LOWERED); + comutBox.borderColor = 0x000000; + comutBox.setBorderStyle(BORDER_LOWERED); + + vol = new Slider(ScrollBar.HORIZONTAL); + vol.setFont(Font.getFont(false, Font.NORMAL_SIZE)); + vol.appId = 1; + vol.setLiveScrolling(true); + vol.setBackColor(Colors.BACKGROUD_DEFAULT); + vol.sliderColor = 0xADD8E6; + vol.ticksColor = 0xFFFAFA; + vol.circleColor = 0xADD8E6; + vol.setPressColor(0xADD8E6); + vol.invertDirection = true; + vol.barHeight = 5; + vol.setMaximum(100); + vol.setMinimum(1); + vol.setValue(20); + vol.markerSize = 5; + + ativIcon = new Icon(MaterialIcons._SETTINGS_REMOTE); + comutIcon = new Icon(MaterialIcons._SETTINGS_REMOTE); + entIcon = new Icon(MaterialIcons._SETTINGS_REMOTE); + volIcon = new Icon(MaterialIcons._VOLUME_UP); + temptvIcon = new Icon(MaterialIcons._TRENDING_UP); + desligarIcon = new Icon(MaterialIcons._POWER); + + ativIcon.setForeColor(0x007FFF); + comutIcon.setForeColor(0x007FFF); + entIcon.setForeColor(0x007FFF); + volIcon.setForeColor(0x007FFF); + temptvIcon.setForeColor(0x007FFF); + desligarIcon.setForeColor(0x007FFF); + + desl = new Button("Executar"); + desl.setForeColor(0x007FFF); + desl.transparentBackground = true; + desl.setBorder(BORDER_NONE); + desl.setFont(Font.getFont("Times New Roman", true, txtAtiv.getFont().size + 1)); + + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + Images.loadHarmony(); + + imgHarmony = new ImageControl(Images.imgHarmony); + + imgHarmony.transparentBackground = true; + + add(title, LEFT + 10, TOP); + add(imgHarmony, LEFT + 10, TOP + 50); + add(txtDevice, LEFT + 80, TOP + 65); + add(txtAtiv, RIGHT + 250, TOP + 65); + add(ativIcon, LEFT + 25, AFTER + 80); + add(atividade, AFTER + 5, SAME - 15); + add(actiBox, SAME, SAME + 15, 200, 30); + add(comutIcon, LEFT + 25, AFTER + 20); + add(comutadorHDMI, AFTER + 5, SAME - 15); + add(comutBox, SAME, SAME + 15, 200, 30); + add(entIcon, LEFT + 25, AFTER + 20); + add(entradaHDMI, AFTER + 5, SAME - 15); + add(enterBox, SAME, SAME + 15, 200, 30); + add(volIcon, LEFT + 25, AFTER + 20); + add(volume, AFTER + 5, SAME); + add(vol, RIGHT + 250, SAME, 70, PREFERRED); + add(temptvIcon, LEFT + 25, AFTER + 20); + add(tempTV, AFTER + 5, SAME); + add(txtTempTV, RIGHT + 250, SAME); + add(desligarIcon, LEFT + 25, AFTER + 20); + add(desligarTV, AFTER + 5, SAME + 1); + add(desl, RIGHT + 250, SAME - 5); + + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Generator.java b/home-assistant/src/main/java/com/totalcross/containers/Generator.java new file mode 100644 index 0000000..a3795e1 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Generator.java @@ -0,0 +1,34 @@ +package com.totalcross.containers; + +import totalcross.ui.gfx.Color; +import totalcross.ui.gfx.Graphics; +import totalcross.ui.image.Image; + +public class Generator extends CircleContainer { + + public Generator(int cor, double kwh, Image img) { + super(cor); + this.kwh = kwh; + this.img = img; + //TODO Auto-generated constructor stub + } + double kwh, value; + Image img; + CircleContainer consumer; + + @Override + public void onPaint(Graphics g) { + super.onPaint(g); + g.foreColor = Color.BLACK; + g.drawImage(img, width/3, height/4, false); + g.drawText(Double.toString(kwh) + " KwH", width/4, height/2, 0); + if(consumer!= null){ + g.drawLine(width/2, height/2, (consumer.getX() + consumer.getWidth())/2, (consumer.getY() + consumer.getHeight())/2); + } + } + + public void setConsumer(CircleContainer consumer, double value){ + this.consumer = consumer; + this.value = value; + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Graphifc.java b/home-assistant/src/main/java/com/totalcross/containers/Graphifc.java new file mode 100644 index 0000000..686d436 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Graphifc.java @@ -0,0 +1,195 @@ +package com.totalcross.containers; +import java.util.ArrayList; +import java.util.List; + +import totalcross.sys.Convert; +import totalcross.ui.Control; +import totalcross.ui.gfx.Color; +import totalcross.ui.gfx.Graphics; +import totalcross.ui.gfx.Rect; +public class Graphifc , Y extends Number> extends Control { + + Series[] series; + int yMin = 0; + int yMax; + int yStep = 1000 * 1000; + int yMaxValue; + + final int borderGap = 10; + final int xTextHeight = 52; + final int yGap = 20; + int yTextLen; + int yCount;; + + Rect r; + int widthX; + + private List listToDraw = new ArrayList<>(); + + @SafeVarargs + public Graphifc(Series... series) { + reset(); + listToDraw.add(0); + changeSeries(series); + } + + public void reset() { + listToDraw.clear(); + } + + @Override + protected void onBoundsChanged(boolean screenChanged) { + r = new Rect(borderGap, borderGap, width - (borderGap * 2), height - (borderGap * 2)); + widthX = r.width - 1 - yTextLen - yGap; + } + + @Override + public void onPaint(Graphics g) { + final int BORDER_COLOR = Color.interpolateA(0x869699, this.backColor, 65); + + g.foreColor = BORDER_COLOR; + g.backColor = this.backColor; + g.fillRoundRect(r.x, r.y, r.width, r.height, 10); + + final int yPart = (r.height - xTextHeight - 1) / (yCount + 1); + + for (int i = 0; i < yCount; i++) { + final String s = Integer.toString(i * yStep); + final int yPos = r.height - xTextHeight - 1 - (i + 1) * yPart; + g.foreColor = BORDER_COLOR; + g.drawLine(r.x, yPos, r.width - yTextLen - yGap, yPos); + + g.foreColor = 0xc5cbce; + g.drawLine(r.width - 1 - yTextLen, yPos, r.width - 1 - yTextLen - yGap, yPos); + g.drawText(Convert.toCurrencyString(s, 0), r.width - 1 - yTextLen, yPos - this.fmH / 2); + } + g.foreColor = 0xc5cbce; + g.drawLine(r.width - 1 - yTextLen - yGap, r.y + 1, r.width - 1 - yTextLen - yGap, r.height - xTextHeight - 1); + + // x axis + g.drawLine(r.x + 1, r.height - xTextHeight - 1, r.width - 1 - yTextLen - yGap, r.height - xTextHeight - 1); + + for (int i = 0; i < series.length; i++) { + final Series series2 = series[i]; + g.foreColor = 0xc5cbce; + final List> data = series2.data; + final int nPoints = listToDraw.size(); + if (nPoints > 0) { + final int part = widthX / nPoints; + final int[] xPoints = new int[nPoints]; + final int[] yPoints = new int[nPoints]; + + final int h = r.height - xTextHeight - 1 - r.y - 1; + for (int j = 0; j < nPoints; j++) { + final Data series = data.get(listToDraw.get(j)); + + // x + final int xPos = r.x + 1 + j * part; + + final String s = series.x.toString(); + if (s != null) { + g.foreColor = 0xc5cbce; + g.drawLine(xPos, r.height - xTextHeight - 1, xPos, r.height - (xTextHeight * 3 / 4) - 1); + g.drawText(s, xPos - (this.fm.stringWidth(s) / 2), r.height - (xTextHeight * 3 / 4) - 1); + g.foreColor = BORDER_COLOR; + g.drawLine(xPos, r.y + 1, xPos, r.height - xTextHeight - 1); + } + + final double percentage = 1.0 * series.y.intValue() / (yMax - yMin + yStep); + final int yPos = r.height - xTextHeight - 1 - yPart - (int) Math.round((h * percentage)); + + xPoints[j] = xPos; + yPoints[j] = yPos; + } + g.foreColor = series2.color; + g.drawDots(r.x + 1, yPoints[yPoints.length - 1], widthX, yPoints[yPoints.length - 1]); + g.drawPolyline(xPoints, yPoints, nPoints); + + // paint more pixels around to make the line thicker + for (int j = 0; j < nPoints; j++) { + xPoints[j] += 1; + } + g.drawPolyline(xPoints, yPoints, nPoints); + for (int j = 0; j < nPoints; j++) { + xPoints[j] -= 2; + } + g.drawPolyline(xPoints, yPoints, nPoints); + for (int j = 0; j < nPoints; j++) { + xPoints[j] += 1; + yPoints[j] += 1; + } + g.drawPolyline(xPoints, yPoints, nPoints); + for (int j = 0; j < nPoints; j++) { + yPoints[j] -= 2; + } + g.drawPolyline(xPoints, yPoints, nPoints); + + g.foreColor = Color.WHITE; + final String texto = series2.title; + g.drawText(texto, r.x + 10, r.y + 6 + (i * this.fmH)); + g.foreColor = series2.color; + g.drawText(Convert.toCurrencyString(data.get(listToDraw.get(listToDraw.size() - 1)).y.toString(), 0), + r.x + 15 + this.fm.stringWidth(texto), r.y + 6 + (i * this.fmH)); + } + } + } + + public void changeIndex(int index) { + listToDraw.add(index); + + // Getting scale on y Axis + yMaxValue = Integer.MIN_VALUE; + for (Series series2 : series) { + for (Integer i : listToDraw) { + yMaxValue = Math.max(yMaxValue, series2.data.get(i).y.intValue()); + } + } + yMax = ((yMaxValue / yStep) + 2) * yStep; + + // y axis + yTextLen = Math.max(this.fm.stringWidth(Integer.toString(yMax)), this.fm.stringWidth(Integer.toString(yMin))); + yCount = (yMax - yMin) / yStep; + + repaintNow(); + } + + @SafeVarargs + public final void changeSeries(Series... series) { + this.series = series; + + // Getting scale on y Axis + yMaxValue = Integer.MIN_VALUE; + for (Series series2 : series) { + for (Integer i : listToDraw) { + yMaxValue = Math.max(yMaxValue, series2.data.get(i).y.intValue()); + } + } + yMax = ((yMaxValue / yStep) + 2) * yStep; + + // y axis + yTextLen = Math.max(this.fm.stringWidth(Integer.toString(yMax)), this.fm.stringWidth(Integer.toString(yMin))); + yCount = (yMax - yMin) / yStep; + + repaintNow(); + } + + public static class Series, Y extends Number> { + List> data; + public String title; + public int color; + + public Series(List> data) { + this.data = data; + } + } + + public static class Data, Y extends Number> { + X x; + Y y; + + public Data(X x, Y y) { + this.x = x; + this.y = y; + } + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Home.java b/home-assistant/src/main/java/com/totalcross/containers/Home.java new file mode 100644 index 0000000..2c5bcb6 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Home.java @@ -0,0 +1,39 @@ +package com.totalcross.containers; + +import com.totalcross.util.Fonts; +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.font.Font; +import totalcross.util.UnitsConverter; + +public class Home extends Container { + + public Home() { + + } + + public Container homeContainer; + public Label homeLabel, textLabel; + + static final int SIZEC = 100; + + public void initUI() { + + + homeLabel = new Label("TC Home"); + textLabel = new Label("Bem vindo! Você chegou no demo do\n" + "Home Assistant onde mostramos as\n" + + "melhores UIs criados por nossa\n" + "comunidade."); + + homeLabel.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 20)); + textLabel.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + setBorderStyle(BORDER_RAISED); + setBackColor(0xFFFFFF); + add(homeLabel, LEFT + 10, TOP); + add(textLabel, LEFT + 10, AFTER + 20); + + //homeContainer.setRect(LEFT + 10, TOP + UnitsConverter.toPixels(DP + SIZEC), PREFERRED, PREFERRED); + this.resize(); + + } + +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/HomeMap.java b/home-assistant/src/main/java/com/totalcross/containers/HomeMap.java new file mode 100644 index 0000000..22c71ef --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/HomeMap.java @@ -0,0 +1,287 @@ +package com.totalcross.containers; +import totalcross.ui.gfx.Color; +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; +import com.totalcross.util.Images; + +import totalcross.sys.Vm; +import totalcross.ui.Button; +import totalcross.ui.Container; +import totalcross.ui.ImageControl; +import totalcross.ui.font.Font; + +public class HomeMap extends Container { + public Container homeMap; + public Button btnLRoom; + public Button btnKitchen; + public Button btnGarage; + public Button btnLigthExternal; + public Button btnDBell; + + private OnUpdateListener upd; + + public Button btnCamera1; + public Button btnCamera2; + public Button btnCamera3; + public Button btnCamera4; + + public boolean isSwitchKitchen() { + return switchKitchen; + } + + public void setSwitchKitchen(boolean switchKitchen) { + this.switchKitchen = switchKitchen; + } + + public boolean isSwitchLRoom() { + return switchLRoom; + } + + public void setSwitchLRoom(boolean switchLRoom) { + this.switchLRoom = switchLRoom; + } + + public boolean isSwitchGarage() { + return switchGarage; + } + + public void setSwitchGarage(boolean switchGarage) { + this.switchGarage = switchGarage; + } + + public boolean isSwitchPorch() { + return switchPorch; + } + + public void setSwitchPorch(boolean switchPorch) { + this.switchPorch = switchPorch; + } + + public boolean isSwitchExternal() { + return switchExternal; + } + + public void setSwitchExternal(boolean switchExternal) { + this.switchExternal = switchExternal; + } + + private boolean switchKitchen = false; + private boolean switchLRoom = false; + private boolean switchGarage= false; + private boolean switchPorch= false; + private boolean switchExternal = false; + + public Button btnTempLadder; + public Button btnTempRoom; + + public ImageControl imgMap; + + static final int SIZEC = 100; + + public String tempLadder = "21°C"; + public String tempRoom = "21°C"; + + private Lights lights; + + + @Override + public void initUI() { + + try { + + Images.loadMap(); + + imgMap = new ImageControl(Images.imgMap); + + btnLRoom = new Button(Images.imgLigthBack); + btnKitchen= new Button(Images.imgLigthBack); + btnGarage = new Button(Images.imgLigthBack); + btnDBell = new Button(Images.imgLigthBack); + btnLigthExternal = new Button(Images.imgLigthBack); + + btnCamera1 = new Button(Images.imgCameraDireita); + btnCamera2 = new Button(Images.imgCameraEsquerda); + btnCamera3 = new Button(Images.imgCameraEsquerda); + btnCamera4 = new Button(Images.imgCameraDireita); + + btnTempLadder = new Button(tempLadder); + btnTempRoom = new Button(tempRoom); + + btnLRoom.transparentBackground = true; + btnKitchen.transparentBackground = true; + btnGarage.transparentBackground = true; + btnDBell.transparentBackground = true; + btnLigthExternal.transparentBackground = true; + + btnCamera1.transparentBackground = true; + btnCamera2.transparentBackground = true; + btnCamera3.transparentBackground = true; + btnCamera4.transparentBackground = true; + + btnLRoom.setBorder(BORDER_NONE); + btnKitchen.setBorder(BORDER_NONE); + btnGarage.setBorder(BORDER_NONE); + btnDBell.setBorder(BORDER_NONE); + btnLigthExternal.setBorder(BORDER_NONE); + + btnCamera1.setBorder(BORDER_NONE); + btnCamera2.setBorder(BORDER_NONE); + btnCamera3.setBorder(BORDER_NONE); + btnCamera4.setBorder(BORDER_NONE); + + btnTempLadder.setBackForeColors(Color.BLACK, Color.WHITE); + btnTempRoom.setBackForeColors(Color.BLACK, Color.WHITE); + + btnTempLadder.setForeColor(Color.WHITE); + btnTempRoom.setForeColor(Color.WHITE); + + btnTempLadder.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 20)); + btnTempRoom.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 20)); + + btnTempLadder.setBorder(BORDER_ROUNDED); + btnTempRoom.setBorder(BORDER_ROUNDED); + + add(imgMap,CENTER,CENTER); + + add(btnLRoom,CENTER - 5,TOP + 130); + add(btnGarage,CENTER + 110,CENTER + 70); + add(btnKitchen,CENTER - 170,CENTER - 50); + add(btnDBell,CENTER - 130,CENTER + 210); + add(btnLigthExternal,CENTER + 140,CENTER + 170); + + add(btnCamera1,CENTER - 190,CENTER - 165); + add(btnCamera2,CENTER + 184,CENTER - 165); + add(btnCamera3,CENTER + 184,CENTER + 165); + add(btnCamera4,CENTER - 190,CENTER + 205); + + add(btnTempLadder,CENTER - 5,CENTER - 35,43,43); + add(btnTempRoom,CENTER - 8,CENTER + 150,43,43); + + // Configurando o container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + this.resize(); + + } catch (Exception e) { + Vm.debug(e.toString()); + //e.printStackTrace(); + } + ActionButtonHome(); + + + } + + public void setLights(Lights lights){ + this.lights = lights; + lights.setOnUpdate(()->{ + if(this.lights.isSwtK() == true){ + btnKitchen.setImage(Images.imgLigthYellow); + btnKitchen.transparentBackground = true; + }else{ + btnKitchen.setImage(Images.imgLigthBack); + btnKitchen.transparentBackground = true; + } + if(this.lights.isSwtG() == true){ + btnGarage.setImage(Images.imgLigthYellow); + btnGarage.transparentBackground = true; + }else{ + btnGarage.setImage(Images.imgLigthBack); + btnGarage.transparentBackground = true; + } + if(this.lights.isSwtLR() == true){ + btnLRoom.setImage(Images.imgLigthYellow); + btnLRoom.transparentBackground = true; + }else{ + btnLRoom.setImage(Images.imgLigthBack); + btnLRoom.transparentBackground = true; + } + if(this.lights.isSwtP() == true){ + btnDBell.setImage(Images.imgLigthYellow); + btnDBell.transparentBackground = true; + }else{ + btnDBell.setImage(Images.imgLigthBack); + btnDBell.transparentBackground = true; + } + + + }); + + } + + public void setOnUpdate(OnUpdateListener upd){ + this.upd = upd; + } + //controle de luzes + public void ActionButtonHome(){ + btnLRoom.addPressListener((event) -> { + if(switchLRoom == false){ + btnLRoom.setImage(Images.imgLigthYellow); + btnLRoom.transparentBackground = true; + switchLRoom = true; + upd.onUpdate(); + }else{ + btnLRoom.setImage(Images.imgLigthBack); + btnLRoom.transparentBackground = true; + switchLRoom = false; + upd.onUpdate(); + } + }); + + btnKitchen.addPressListener((event) -> { + if(switchKitchen == false){ + btnKitchen.setImage(Images.imgLigthYellow); + btnKitchen.transparentBackground = true; + switchKitchen = true; + upd.onUpdate(); + }else{ + btnKitchen.setImage(Images.imgLigthBack); + btnKitchen.transparentBackground = true; + switchKitchen = false; + upd.onUpdate(); + } + + + }); + btnGarage.addPressListener((event) -> { + if(switchGarage == false){ + btnGarage.setImage(Images.imgLigthYellow); + btnGarage.transparentBackground = true; + switchGarage = true; + upd.onUpdate(); + }else{ + btnGarage.setImage(Images.imgLigthBack); + btnGarage.transparentBackground = true; + switchGarage = false; + upd.onUpdate(); + } + }); + btnLigthExternal.addPressListener((event) -> { + if(switchExternal == false){ + btnLigthExternal.setImage(Images.imgLigthYellow); + btnLigthExternal.transparentBackground = true; + switchExternal = true; + + }else{ + btnLigthExternal.setImage(Images.imgLigthBack); + btnLigthExternal.transparentBackground = true; + switchExternal = false; + } + }); + btnDBell.addPressListener((event) -> { + if(switchPorch == false){ + btnDBell.setImage(Images.imgLigthYellow); + btnDBell.transparentBackground = true; + switchPorch = true; + upd.onUpdate(); + }else{ + btnDBell.setImage(Images.imgLigthBack); + btnDBell.transparentBackground = true; + switchPorch = false; + upd.onUpdate(); + } + }); + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Info.java b/home-assistant/src/main/java/com/totalcross/containers/Info.java new file mode 100644 index 0000000..e75dacf --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Info.java @@ -0,0 +1,100 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; + +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.font.Font; +import totalcross.ui.icon.Icon; +import totalcross.ui.icon.MaterialIcons; + +public class Info extends Container { + public Info() { + + } + + public Container info; + + public Label lblInfo; + public Label lblGngHome; + public Label lblGngWork; + public Label lblPlexSpy; + public Label lblDolarconv; + public Label tempGHome; + public Label tempGWork; + public Label watchspy; + public Label dlconv; + + public Icon gWorkIcon; + public Icon gHomeIcon; + public Icon spyIcon; + public Icon dolarConvIcon; + + static final int SIZEC = 100; + + public void initUI() { + // configurar container + info = new Container(); + info.setBackColor(Colors.BACKGROUD_DEFAULT); + info.setBorderStyle(BORDER_RAISED); + info.setBorderRadius(5); + + add(info, CENTER, TOP, 200, 200); + + // configurar label + lblInfo = new Label("Informação"); + lblGngHome = new Label("indo para Casa"); + lblGngWork = new Label("indo para o Trabalho"); + lblPlexSpy = new Label("PlexSpy"); + lblDolarconv = new Label("USDREAL"); + tempGHome = new Label("40 min "); + tempGWork = new Label("37 min "); + watchspy = new Label("0 Watching "); + dlconv = new Label("5,22 R$ "); + + lblInfo.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, lblInfo.getFont().size + 10)); + lblGngHome.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + lblGngWork.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + lblPlexSpy.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + lblDolarconv.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + tempGHome.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + tempGWork.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + watchspy.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + dlconv.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 14)); + + // configurar icone + gWorkIcon = new Icon(MaterialIcons._DIRECTIONS_CAR); + gHomeIcon = new Icon(MaterialIcons._DIRECTIONS_CAR); + spyIcon = new Icon(MaterialIcons._VISIBILITY); + dolarConvIcon = new Icon(MaterialIcons._ATTACH_MONEY); + + gHomeIcon.setForeColor(0x6495ED); + gWorkIcon.setForeColor(0x6495ED); + spyIcon.setForeColor(0x6495ED); + dolarConvIcon.setForeColor(0x6495ED); + + info.add(lblInfo, LEFT + 10, TOP); + + info.add(gWorkIcon, LEFT + 10, CENTER - 30); + info.add(lblGngWork, LEFT + 50, CENTER - 30); + info.add(tempGWork, RIGHT + 30, CENTER - 30); + + info.add(gHomeIcon, LEFT + 10, CENTER); + info.add(lblGngHome, LEFT + 50, CENTER); + info.add(tempGHome, RIGHT + 30, CENTER); + + info.add(spyIcon, LEFT + 8, CENTER + 30); + info.add(lblPlexSpy, LEFT + 50, CENTER + 30); + info.add(watchspy, RIGHT + 30, CENTER + 30); + + info.add(dolarConvIcon, LEFT + 12, BOTTOM - 30); + info.add(lblDolarconv, LEFT + 50, BOTTOM - 30); + info.add(dlconv, RIGHT + 30, BOTTOM - 30); + + info.setRect(CENTER, TOP, PREFERRED, PREFERRED); + info.resize(); + + } + +} \ No newline at end of file diff --git a/home-assistant/src/main/java/com/totalcross/containers/Lights.java b/home-assistant/src/main/java/com/totalcross/containers/Lights.java new file mode 100644 index 0000000..f5b25b5 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Lights.java @@ -0,0 +1,318 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; + + +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.Switch; +import totalcross.ui.font.Font; +import totalcross.ui.icon.Icon; +import totalcross.ui.icon.MaterialIcons; + + +public class Lights extends Container { + + public Lights() { + + } + private OnUpdateListener upd; + + public static boolean kValue; + public static boolean gValue; + public static boolean lrValue; + public static boolean pValue; + public static boolean lValue; + + public boolean isSwtK() { + return swtK; + } + + public void setSwtK(boolean swtK) { + this.swtK = swtK; + } + + public boolean isSwtLR() { + return swtLR; + } + + public void setSwtLR(boolean swtLR) { + this.swtLR = swtLR; + } + + public boolean isSwtG() { + return swtG; + } + + public void setSwtG(boolean swtG) { + this.swtG = swtG; + } + + public boolean isSwtP() { + return swtP; + } + + public void setSwtP(boolean swtP) { + this.swtP = swtP; + } + + private boolean swtK; + private boolean swtLR; + private boolean swtG; + private boolean swtP; + + + public Container lightCtrl; + public Label lblLights; + public Label lblKitchenl; + public Label lblLRooml; + public Label lblPorchl; + public Label lblGaragel; + + public Switch sLights; + public Switch sKitchen; + public Switch slRoom; + public Switch sPorch; + public Switch sGarage; + + public Icon kitchenLIcon; + public Icon lRoomLIcon; + public Icon porchLIcon; + public Icon garageLIcon; + + static final int SIZEC = 100; + + private HomeMap homeMap; + + public void initUI() { + + + + //lightCtrl = new Container(); + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderStyle(BORDER_RAISED); + + //add(lightCtrl, CENTER, CENTER, 300, 300); + + // Material Icons + kitchenLIcon = new Icon(MaterialIcons._LIGHTBULB_OUTLINE); + lRoomLIcon = new Icon(MaterialIcons._LIGHTBULB_OUTLINE); + porchLIcon = new Icon(MaterialIcons._FLASH_ON); + garageLIcon = new Icon(MaterialIcons._LIGHTBULB_OUTLINE); + + // Criando Switch button + sLights = new Switch(); + sKitchen = new Switch(); + slRoom = new Switch(); + sPorch = new Switch(); + sGarage = new Switch(); + + // configurando labels + lblLights = new Label("Lights"); + lblKitchenl = new Label("Kitchen"); + lblLRooml = new Label("Living Room"); + lblPorchl = new Label("Porch"); + lblGaragel = new Label("Garage"); + + lblLights.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, lblLights.getFont().size + 10)); + lblKitchenl.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblLRooml.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblPorchl.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + lblGaragel.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 15)); + + // configurando icones + + kitchenLIcon.setForeColor(0x6495ED); + lRoomLIcon.setForeColor(0x6495ED); + porchLIcon.setForeColor(0x6495ED); + garageLIcon.setForeColor(0x6495ED); + + // configurando switch button + sLights.colorBackOn = 0x00BFFF; + sLights.colorBackOff = Colors.COLOR_DARK_GRAY; + sLights.colorBallOn = 0x1E90FF; + sLights.colorBallOff = 0x696969; + + sKitchen.colorBackOn = 0x00BFFF; + sKitchen.colorBackOff = Colors.COLOR_DARK_GRAY; + sKitchen.colorBallOn = 0x1E90FF; + sKitchen.colorBallOff = 0x696969; + + slRoom.colorBackOn = 0x00BFFF; + slRoom.colorBackOff = Colors.COLOR_DARK_GRAY; + slRoom.colorBallOn = 0x1E90FF; + slRoom.colorBallOff = 0x696969; + + sPorch.colorBackOn = 0x00BFFF; + sPorch.colorBackOff = Colors.COLOR_DARK_GRAY; + sPorch.colorBallOn = 0x1E90FF; + sPorch.colorBallOff = 0x696969; + + sGarage.colorBackOn = 0x00BFFF; + sGarage.colorBackOff = Colors.COLOR_DARK_GRAY; + sGarage.colorBallOn = 0x1E90FF; + sGarage.colorBallOff = 0x696969; + + // adicionado ao container + add(lblLights, LEFT + 10, TOP); + add(sLights, AFTER + 113, SAME); + + add(kitchenLIcon, LEFT + 10, AFTER + 30); + add(lblKitchenl, AFTER, SAME, DP + 150, PREFERRED); + add(sKitchen, AFTER, SAME); + + add(lRoomLIcon, LEFT + 10, AFTER + 10); + add(lblLRooml,AFTER, SAME, DP + 150, PREFERRED); + add(slRoom, AFTER, SAME); + + add(porchLIcon, LEFT + 10, AFTER +10); + add(lblPorchl, AFTER, SAME, DP + 150, PREFERRED); + add(sPorch, AFTER, SAME); + + add(garageLIcon, LEFT + 10, AFTER + 10); + add(lblGaragel, AFTER, SAME, DP + 150, PREFERRED); + add(sGarage, AFTER, SAME); + + + homeMap = new HomeMap(); + + turnOnOff(); + + + } + //controle de luzes + public void turnOnOff(){ + sLights.addPressListener((event) -> { + if (sLights.isOn()) { + sKitchen.setOn(true); + slRoom.setOn(true); + sGarage.setOn(true); + sPorch.setOn(true); + + swtK = true; + swtLR = true; + swtG = true; + swtP = true; + + kitchenLIcon.setForeColor(0xFFFF00); + lRoomLIcon.setForeColor(0xFFFF00); + porchLIcon.setForeColor(0xFFFF00); + garageLIcon.setForeColor(0xFFFF00); + upd.onUpdate(); + } else if (sLights.isOn() == false) { + sKitchen.setOn(false); + kitchenLIcon.setForeColor(0x6495ED); + slRoom.setOn(false); + lRoomLIcon.setForeColor(0x6495ED); + sGarage.setOn(false); + garageLIcon.setForeColor(0x6495ED); + sPorch.setOn(false); + porchLIcon.setForeColor(0x6495ED); + + swtK = false; + swtLR = false; + swtG = false; + swtP = false; + upd.onUpdate(); + + } + }); + sKitchen.addPressListener((event) -> { + if (sKitchen.isOn()) { + kitchenLIcon.setForeColor(0xFFFF00); + swtK = true; + upd.onUpdate(); + } else{ + kitchenLIcon.setForeColor(0x6495ED); + swtK = false; + upd.onUpdate(); + } + }); + slRoom.addPressListener((event) -> { + if (slRoom.isOn()) { + lRoomLIcon.setForeColor(0xFFFF00); + + swtLR = true; + upd.onUpdate(); + } else { + lRoomLIcon.setForeColor(0x6495ED); + + swtLR = false; + upd.onUpdate(); + } + }); + sGarage.addPressListener((event) -> { + if (sGarage.isOn()) { + garageLIcon.setForeColor(0xFFFF00); + swtG = true; + + upd.onUpdate(); + } else{ + garageLIcon.setForeColor(0x6495ED); + + swtG = false; + upd.onUpdate(); + } + }); + sPorch.addPressListener((event) -> { + if (sPorch.isOn()) { + porchLIcon.setForeColor(0xFFFF00); + + swtP = true; + upd.onUpdate(); + } else { + porchLIcon.setForeColor(0x6495ED); + + swtP = false; + upd.onUpdate(); + } + }); + } + //set home map + public void setHomeMap(HomeMap homeMap){ + this.homeMap = homeMap; + homeMap.setOnUpdate(()->{ + kValue = this.homeMap.isSwitchKitchen(); + sKitchen.setOn(kValue); + if (kValue == true) { + kitchenLIcon.setForeColor(0xFFFF00); + swtK = true; + } else{ + kitchenLIcon.setForeColor(0x6495ED); + swtK = false; + } + lrValue = this.homeMap.isSwitchLRoom(); + slRoom.setOn(lrValue); + if (lrValue == true) { + lRoomLIcon.setForeColor(0xFFFF00); + swtLR = true; + } else { + lRoomLIcon.setForeColor(0x6495ED); + swtLR = false; + } + gValue = this.homeMap.isSwitchGarage(); + sGarage.setOn(gValue); + if (gValue == true) { + garageLIcon.setForeColor(0xFFFF00); + swtG = true; + } else{ + garageLIcon.setForeColor(0x6495ED); + swtG = false; + } + pValue = this.homeMap.isSwitchPorch(); + sPorch.setOn(pValue); + if (pValue == true) { + porchLIcon.setForeColor(0xFFFF00); + swtP = true; + } else { + porchLIcon.setForeColor(0x6495ED); + swtP = false; + } + }); + } + //update Listener + public void setOnUpdate(OnUpdateListener upd){ + this.upd = upd; + } +} \ No newline at end of file diff --git a/home-assistant/src/main/java/com/totalcross/containers/MainActivity.java b/home-assistant/src/main/java/com/totalcross/containers/MainActivity.java new file mode 100644 index 0000000..aa35093 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/MainActivity.java @@ -0,0 +1,77 @@ +package com.totalcross.containers; + +import totalcross.ui.ScrollContainer; + +public class MainActivity extends ScrollContainer{ + + Home home; + Temperature temperature; + Security security; + TemperatureStudy temperatureStudy; + HomeMap homeMap; + Spotify spotify; + Demo demo; + ScrollContainer container; + Lights lights; + Info info; + Notify notification; + Energy energy; + Entertainment entertainment; + DoorBell doorBell; + + @Override + public void initUI() { + + setScrollBars(false, true); + setBackForeColors(0xF7F7F7, 0x000000); + + home = new Home(); + add(home, LEFT, TOP,PREFERRED,PREFERRED); + home.resize(); + + homeMap = new HomeMap(); + add(homeMap,SAME,AFTER, 410, 489,home); + homeMap.resize(); + + security = new Security(); + add(security,AFTER,SAME,PREFERRED,PREFERRED,home); + security.resize(); + + spotify = new Spotify(); + add(spotify,AFTER - 22,SAME - 40, 300,200,security); + spotify.resize(); + + temperature = new Temperature(); + add(temperature, SAME, AFTER,PREFERRED,PREFERRED,homeMap); + temperature.resize(); + + info = new Info(); + add(info,AFTER, SAME,PREFERRED,PREFERRED,temperature); + info.resize(); + + temperatureStudy = new TemperatureStudy(); + add(temperatureStudy,SAME, AFTER,PREFERRED,PREFERRED,info); + temperatureStudy.resize(); + + entertainment = new Entertainment(); + add(entertainment,AFTER, SAME,PREFERRED,PREFERRED,homeMap); + entertainment.resize(); + + energy = new Energy(); + add(energy, AFTER,SAME,PREFERRED,PREFERRED,info); + energy.resize(); + + doorBell = new DoorBell(); + add(doorBell, SAME,AFTER,PREFERRED,PREFERRED,temperature); + doorBell.resize(); + + lights = new Lights(); + add(lights, SAME + 10, AFTER,PREFERRED,PREFERRED,temperatureStudy); + lights.resize(); + + homeMap.setLights(lights); + lights.setHomeMap(homeMap); + } +} + + diff --git a/home-assistant/src/main/java/com/totalcross/containers/Map.java b/home-assistant/src/main/java/com/totalcross/containers/Map.java new file mode 100644 index 0000000..bc00b6f --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Map.java @@ -0,0 +1,7 @@ +package com.totalcross.containers; + +import totalcross.ui.Container; + +public class Map extends Container{ + +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Notify.java b/home-assistant/src/main/java/com/totalcross/containers/Notify.java new file mode 100644 index 0000000..a456f90 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Notify.java @@ -0,0 +1,63 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import totalcross.ui.Button; +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.ScrollContainer; +import totalcross.ui.gfx.Color; + +public class Notify extends ScrollContainer { + + public Container ContainerMensagem; + + public Label lblTitle; + public Label lblMensagem; + public Label lblTime; + + public Button exit; + + @Override + public void initUI() { + + setScrollBars(false, true); + setBackForeColors(0xF7F7F7, 0x000000); + + ContainerMensagem = new Container(); + + lblTitle = new Label("Motion Detected!"); + lblMensagem = new Label("There was motion detected in the backyard."); + lblTime = new Label("5 horas atrás"); + + exit = new Button("DISPENSAR"); + + lblTitle.transparentBackground = true; + lblMensagem.transparentBackground = true; + lblTime.transparentBackground = true; + + /* lblTitle.setFont(Font.getFont(Fonts.FONT_DEFAULT, true, 20)); + lblMensagem.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 10)); + lblTime.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, 10)); */ + + /* lblTitle.setBackColor(Color.BLACK); + lblMensagem.setBackColor(Color.BLACK); + lblTime.setBackColor(Color.BLACK); */ + + add(ContainerMensagem,CENTER,CENTER); + + ContainerMensagem.add(lblTitle, LEFT + 10 , TOP + 10); + ContainerMensagem.add(lblMensagem, LEFT + 10 , AFTER + 10); + ContainerMensagem.add(lblTime, LEFT + 80 , AFTER + 10); + ContainerMensagem.add(exit, LEFT + 10 , AFTER + 10); + + // Configurando o container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + // setRect(CENTER,CENTER, KEEP, KEEP); + this.resize(); + + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/OnUpdateListener.java b/home-assistant/src/main/java/com/totalcross/containers/OnUpdateListener.java new file mode 100644 index 0000000..8db00f6 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/OnUpdateListener.java @@ -0,0 +1,5 @@ +package com.totalcross.containers; + +public interface OnUpdateListener { + public void onUpdate(); +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Security.java b/home-assistant/src/main/java/com/totalcross/containers/Security.java new file mode 100644 index 0000000..66ca9d6 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Security.java @@ -0,0 +1,95 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; +import com.totalcross.util.Images; +import totalcross.ui.Button; +import totalcross.ui.Container; +import totalcross.ui.ImageControl; +import totalcross.ui.Label; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; + + + +public class Security extends Container{ + + public Label lblTitle; + + public Button btnSecurityHome; + public Button btnSecurityStatus; + public Button btnSecuritStop; + + public ImageControl imgSecurity; + + static final int SIZEC = 100; + + @Override + public void initUI() { + Images.loadSecurity(); + + //Criando label security + lblTitle = new Label("Security"); + + //Criando imagem + imgSecurity = new ImageControl(Images.imgSecurityGreen); + + //Criando buttons + btnSecurityStatus = new Button("Armar Ausente"); + btnSecurityHome = new Button("Armar em Casa"); + btnSecuritStop = new Button("DESARMAR"); + + //Configurando Botões + btnSecurityHome.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, btnSecurityHome.getFont().size + 1)); + btnSecurityStatus.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, btnSecurityStatus.getFont().size + 1)); + btnSecuritStop.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, btnSecuritStop.getFont().size + 1)); + + //Configurando label + lblTitle.transparentBackground = true; + lblTitle.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblTitle.getFont().size + 10)); + + // Configurando o container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + + add(lblTitle, LEFT + 20, TOP + 10 ); + add(imgSecurity, LEFT + 200, SAME); + add(btnSecurityHome, LEFT + 10, SAME + 62); + add(btnSecurityStatus, SAME + 140, SAME); + add(btnSecuritStop, LEFT + 90, TOP + 70); + + btnSecuritStop.setVisible(false); + this.resize(); + + ActionButton(); + } + + public void ActionButton(){ + + btnSecurityHome.addPressListener((event) -> { + imgSecurity.setImage( btnSecurityHome.isPressed() ? Images.imgSecurityGreen:Images.imgSecurityRed); + btnSecurityHome.setVisible(false); + btnSecurityStatus.setVisible(false); + btnSecuritStop.setVisible(true); + }); + + btnSecurityStatus.addPressListener((event) -> { + imgSecurity.setImage( btnSecurityHome.isPressed() ? Images.imgSecurityGreen:Images.imgSecurityRed); + btnSecurityHome.setVisible(false); + btnSecurityStatus.setVisible(false); + btnSecuritStop.setVisible(true); + }); + + btnSecuritStop.addPressListener((event) -> { + imgSecurity.setImage(!btnSecurityHome.isPressed()? Images.imgSecurityGreen:Images.imgSecurityRed); + btnSecurityHome.setVisible(true); + btnSecurityStatus.setVisible(true); + btnSecuritStop.setVisible(false); + }); + } +} + + diff --git a/home-assistant/src/main/java/com/totalcross/containers/SideMenu.java b/home-assistant/src/main/java/com/totalcross/containers/SideMenu.java new file mode 100644 index 0000000..282b050 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/SideMenu.java @@ -0,0 +1,57 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; + +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.SideMenuContainer; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; +import totalcross.ui.icon.Icon; +import totalcross.ui.icon.MaterialIcons; + +public class SideMenu extends Container { + + public void initUI(){ + + SideMenuContainer.Item home = new SideMenuContainer.Item("Home", MaterialIcons._HOME, Color.DARK, () -> {return new MainActivity ();}); + SideMenuContainer.Item energy = new SideMenuContainer.Item("Energy", MaterialIcons._POWER, Color.DARK, ()-> {return new EnergyMenu();}); + SideMenuContainer.Item map = new SideMenuContainer.Item("Map", MaterialIcons._MAP, Color.DARK, ()-> {return new Energy();}); + SideMenuContainer.Item demo = new SideMenuContainer.Item("Demo", MaterialIcons._ACCESSIBILITY, Color.DARK, ()-> {return new Demo();}); + SideMenuContainer.Item notify = new SideMenuContainer.Item("Notificação", MaterialIcons._NOTIFICATIONS, Color.DARK, ()-> {return new Notify();}); + + SideMenuContainer sideMenu = new SideMenuContainer( + null, + home, + energy, + map, + notify, + demo); + + sideMenu.topMenu.header = new Container(){ + public void initUI(){ + setBackColor(Colors.FROZEN_DEFAULT); + + Label title = new Label("Home Assistant", CENTER, Color.WHITE, false); + title.setFont(Font.getFont(Font.DEFAULT, true, this.getFont().size+6)); + title.setForeColor(Color.WHITE); + add(title, LEFT+25, BOTTOM-45, PARENTSIZE+40, DP+56); + } + }; + + sideMenu.setBarFont(Font.getFont(Font.getDefaultFontSize()+2)); + sideMenu.setBackColor(0x4A90E2); + sideMenu.setForeColor(Color.WHITE); + sideMenu.setItemForeColor(Color.BLACK); + sideMenu.topMenu.drawSeparators = false; + sideMenu.topMenu.itemHeightFactor = 3; + + Icon icon = new Icon(MaterialIcons._MENU); + icon.setBackColor(Color.BLACK); + add(icon, CENTER + 20, TOP + 20); + add(sideMenu, LEFT, TOP, PARENTSIZE, PARENTSIZE); + } + +} + + diff --git a/home-assistant/src/main/java/com/totalcross/containers/Spotify.java b/home-assistant/src/main/java/com/totalcross/containers/Spotify.java new file mode 100644 index 0000000..0ac55d0 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Spotify.java @@ -0,0 +1,35 @@ +package com.totalcross.containers; + +import com.totalcross.util.*; +import totalcross.ui.Container; +import totalcross.util.UnitsConverter; +import totalcross.ui.ImageControl; + +public class Spotify extends Container{ + + public Container spotify; + + public ImageControl imgSpotify; + + static final int SIZEC = 100; + + @Override + public void initUI() { + + Images.loadSpotify(); + + spotify = new Container(); + add(spotify, CENTER, TOP + UnitsConverter.toPixels(DP + 30)); + + imgSpotify = new ImageControl(Images.imgSpotify); + + // imgSpotify.scaleToFit = true; + // imgSpotify.strechImage = true; + + add(imgSpotify, CENTER,CENTER); + + spotify.transparentBackground = true; + + this.resize(); + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/Temperature.java b/home-assistant/src/main/java/com/totalcross/containers/Temperature.java new file mode 100644 index 0000000..d8769fa --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/Temperature.java @@ -0,0 +1,104 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; +import com.totalcross.util.Images; +import totalcross.ui.Button; +import totalcross.ui.Container; +import totalcross.ui.Label; +import totalcross.ui.Slider; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; + +public class Temperature extends Container { + + public Label lblLevel; + public Label lblTempNow; + public Label lblTemp; + public Label lblStatusTemp; + + public Button btnHot; + public Button btnFrozen; + public Button btnOff; + public Button btnDate; + + public Slider sliderTempMin; + public Slider sliderTempMax; + + public String statusTemp = "Automatico"; + public String statusTempOFF = "Ausente"; + public String tempMax = "30"; + public String tempMin = "15"; + + static final int SIZEC = 100; + public int startAngle = 225; + public int endAngle = 315; + public int radius; + + ArcSlider arcSlider; + + @Override + public void initUI() { + + // Chamando imagens + Images.loadCalender(); + Images.loadFrozen(); + Images.loadHot(); + Images.loadOff(); + + // Criando labels + lblLevel = new Label("Andar de cima"); + lblTempNow = new Label("22°"); + lblTemp = new Label(tempMin + " - " + tempMax); + lblStatusTemp = new Label(statusTemp + " - " + statusTempOFF); + + // Configurando labels + lblTempNow.transparentBackground = true; + lblTemp.transparentBackground = true; + lblStatusTemp.transparentBackground = true; + lblTempNow.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblTempNow.getFont().size + 60)); + lblStatusTemp.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblStatusTemp.getFont().size + 2)); + lblTemp.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblTemp.getFont().size + 2)); + lblLevel.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblLevel.getFont().size + 2)); + + // Criando botões + btnDate = new Button(Images.imgCalenderGray); + btnFrozen = new Button(Images.imgCalenderGray); + btnHot = new Button(Images.imgHotGray); + btnOff = new Button(Images.imgOffGray); + + // Criando slider button + arcSlider = new ArcSlider(); + + + // Configurando o container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + // Configurando os botoes + btnDate.transparentBackground = true; + btnFrozen.transparentBackground = true; + btnHot.transparentBackground = true; + btnOff.transparentBackground = true; + + // Adicionando componentes ao container + add(arcSlider, LEFT - 10, CENTER + 80, 250, 200); + + add(lblTempNow, LEFT + 75, SAME + 50); + add(lblTemp, SAME + 15, SAME + 80); + add(lblStatusTemp, SAME - 40, SAME + 20); + + add(btnDate, LEFT + 20, SAME + 30); + add(btnHot, SAME + 50, SAME); + add(btnFrozen, SAME + 50, SAME); + add(btnOff, SAME + 50, SAME); + + add(lblLevel, LEFT + 60, SAME + 50); + + // Configurando tamanho do container + //setRect(CENTER, CENTER, PREFERRED, PREFERRED); + resize(); + } +} diff --git a/home-assistant/src/main/java/com/totalcross/containers/TemperatureStudy.java b/home-assistant/src/main/java/com/totalcross/containers/TemperatureStudy.java new file mode 100644 index 0000000..34537d9 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/containers/TemperatureStudy.java @@ -0,0 +1,147 @@ +package com.totalcross.containers; + +import com.totalcross.util.Colors; +import com.totalcross.util.Fonts; +import com.totalcross.util.Images; +import totalcross.ui.Container; +import totalcross.ui.ImageControl; +import totalcross.ui.Label; +import totalcross.ui.font.Font; +import totalcross.ui.gfx.Color; +import totalcross.util.UnitsConverter; + + +public class TemperatureStudy extends Container{ + + private static Label lblTitle; + private Label lblTemp; + + private String temp = "20"; + public static String DEFAULT_TEMP = "°C"; + + static final int SIZEC = 100; + + private ImageControl imgEnergy; + + // Graphifc.Series TempGraphifc; + + @Override + public void initUI() { + + Images.loadTemperatureStudy(); + + //Criando imagem + imgEnergy = new ImageControl(Images.imgEnergy); + + //Configurando imagem + imgEnergy.transparentBackground = true; + + //Criando label + lblTitle = new Label("Estudo de temperatura"); + lblTemp = new Label(temp + DEFAULT_TEMP); + + //Configurando label + lblTitle.transparentBackground = true; + lblTemp.transparentBackground = true; + lblTitle.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblTitle.getFont().size + 6)); + lblTemp.setFont(Font.getFont(Fonts.FONT_DEFAULT, false, lblTemp.getFont().size + 5)); + + + add(lblTitle, LEFT + 20, TOP + 10); + add(lblTemp, SAME, SAME + 20); + add(imgEnergy, LEFT + 200, TOP + 10); + //temperatureStudy.add(graphicsTemp, LEFT + 20, TOP + 10); + + // Configurando o container + setBackColor(Colors.BACKGROUD_DEFAULT); + setBorderRadius(5); + setBorderStyle(BORDER_RAISED); + setBackColor(Color.WHITE); + + //Configurando container + //setRect(LEFT + 10, TOP + UnitsConverter.toPixels(DP + SIZEC), KEEP, KEEP); + resize(); + +} +/* + class MyDate implements Comparable { + int date; + int day; + int month; + String s = null; + public static final int DAY = 0; + public static final int MONTH = 1; + public static final int WEEK = 2; + public static int mode = DAY; + public Date firstDay; + + public MyDate(int yyyyMMdd) { + this.date = yyyyMMdd; + this.day = this.date % 100; + this.month = yyyyMMdd / 100 % 100; + if (this.day == 1) { + s = Date.monthNames[this.month].substring(0, 3); + } else if (this.day == 10 || this.day == 19) { + s = Integer.toString(this.day); + } + } + + public void changeMode(int mode) { + MyDate.mode = mode; + switch (mode) { + case DAY: + if (this.day == 1) { + s = Date.monthNames[this.month].substring(0, 3); + } else if (this.day == 10 || this.day == 19) { + s = Integer.toString(this.day); + } else { + s = null; + } + break; + case MONTH: + if (this.toDate().equals(firstDay) || this.day == 1) { + s = Date.monthNames[this.month].substring(0, 3); + } else { + s = null; + } + break; + case WEEK: + if (exactlyXWeeksSinceDate(MyDate.firstDay)) { + s = weeksSinceDate(MyDate.firstDay); + } else { + s = null; + } + break; + } + } + + public String weeksSinceDate(Date date) { + return date != null ? Integer.toString(date.subtract(this.toDate()) / 7) : null; + } + + public boolean exactlyXWeeksSinceDate(Date date) { + return date != null ? date.subtract(this.toDate()) % 7 == 0 : false; + } + + public int compareTo(MyDate o) { + return this.date - o.date; + } + + public Date toDate() { + int year = this.date / 10000; + Date myDate = null; + try { + myDate = new Date(year + "-" + this.month + "-" + this.day, Settings.DATE_YMD); + } catch (InvalidDateException e) { + e.printStackTrace(); + } + return myDate; + } + + @Override + public String toString() { + return s; + } + */ +} +//} diff --git a/home-assistant/src/main/java/com/totalcross/database/DAO.java b/home-assistant/src/main/java/com/totalcross/database/DAO.java new file mode 100644 index 0000000..c110a7d --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/database/DAO.java @@ -0,0 +1,46 @@ +package com.totalcross.database; + +import java.sql.SQLException; +import totalcross.sql.Connection; +import totalcross.sql.PreparedStatement; +import totalcross.sql.ResultSet; +import totalcross.sql.Statement; + +public class DAO { + + /* String Kitchen = "kitchen"; + public void initUI() { + + + String sqlKitchen = "insert into Ligths(idLigth,ligth)" + + "value('?','?');"; + String sqlLivingRoom; + String sqlPorch; + String sqlGarage; + Connection dbcon = DatabaseManager.getConnection(); + PreparedStatement ps = dbcon.prepareStatement(sqlKitchen); + + ps.setString(1, Kitchen); + ps.executeUpdate(); + ps.close(); + + } + public boolean insertCPF(String cpf) throws SQLException { + + boolean success = false; + Connection dbcon = DatabaseManager.getConnection(); + String sql = "insert into person values(?)"; + PreparedStatement ps = dbcon.prepareStatement(sql); + ps.setString(1, cpf); + + int i = ps.executeUpdate(); + ps.close(); + + if (i > 0) { + success = true; + } else { + success = false; + } + return success; + } */ +} diff --git a/home-assistant/src/main/java/com/totalcross/database/DatabaseManager.java b/home-assistant/src/main/java/com/totalcross/database/DatabaseManager.java new file mode 100644 index 0000000..955d2d4 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/database/DatabaseManager.java @@ -0,0 +1,161 @@ +package com.totalcross.database; + +import java.sql.SQLException; +import totalcross.db.sqlite.SQLiteUtil; +import totalcross.sql.Statement; +import totalcross.sys.Settings; + +public class DatabaseManager { + + private static DatabaseManager instance = null; + private SQLiteUtil util; + + private DatabaseManager() { + + try { + util = new SQLiteUtil(Settings.appPath,"HomeAssitant.db"); + createTableLigths(); + createTableHistoricLigths(); + createTableHitoricTemp(); + createTableHitoricInfo(); + } catch (SQLException e) { + + e.printStackTrace(); + + } + } + + public static DatabaseManager getInstance() { + + if(instance == null) { + instance = new DatabaseManager(); + } + + return instance; + } + public void createTableLigths() { + + try { + + Statement st = util.con().createStatement(); + st.execute("create table IF NOT EXISTSLigths( " + + "idLigth int primary key auto_increment," + + "ligth varchar(10) not null unique" + + ");"); + + st.close(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + public void createTableHistoricLigths() { + + try { + + Statement st = util.con().createStatement(); + st.execute("create table HistoricLights(" + + "idHistoricLigth int primary key auto_increment," + + "nameLigth varchar (10) not null," + + "foreign key (nameLigth) references Ligths(ligth)," + + "statusLigth varchar(3) not null," + + "dataLigth datetime not null" + + ");"); + + st.close(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + public void createTableHitoricTemp() { + + try { + + Statement st = util.con().createStatement(); + st.execute("create table HistoricTemp(" + + "idTemp int primary key not null unique," + + "Temp int not null unique," + + "dataTemp datetime not null" + + ");"); + + st.close(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void createTableHitoricInfo() { + + try { + + Statement st = util.con().createStatement(); + st.execute("create table Info(" + + "idInfo int primary key auto_increment," + + "info varchar (20) not null unique" + + ");"); + + st.close(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + + +/* public Boolean insertUsers(User user) { + + Boolean success = true; + + try { + + String sql = "INSERT INTO USERS VALUES (?,?,?,?)"; + PreparedStatement st = util.con().prepareStatement(sql); + + st.setString(1, user.getName()); + st.setString(2, user.getPhone()); + st.setString(3, user.getMail()); + st.setString(4, user.getPassword()); + + st.executeUpdate(); + st.close(); + + } catch (SQLException e) { + e.printStackTrace(); + success = false; + } + + return success; + } */ + +/* public ArrayList getUsers() { + + ArrayList users = new ArrayList<>(); + + try { + + Statement st = util.con().createStatement(); + ResultSet rs = st.executeQuery("SELECT * FROM USERS"); + + while (rs.next()){ + + User user = new User(); + user.setName(rs.getString("NAME")); + user.setPhone(rs.getString("PHONE")); + user.setMail(rs.getString("EMAIL")); + user.setPassword(rs.getString("PASSWORD")); + + users.add(user); + + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return users; + } */ +} + diff --git a/home-assistant/src/main/java/com/totalcross/util/Colors.java b/home-assistant/src/main/java/com/totalcross/util/Colors.java new file mode 100644 index 0000000..2e93aae --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/util/Colors.java @@ -0,0 +1,16 @@ +package com.totalcross.util; + +public class Colors { + public static final int BACKGROUD_DEFAULT= 0xFFFFFF; + public static final int CALENDER_DEFAULT= 0xa9a9a9; + public static final int TEMPERATURE_DEFAULT= 0x05ae11; + public static final int FROZEN_DEFAULT= 0x14b4dc; + public static final int HOT_DEFAULT= 0xffae00; + + public static final int COLOR_DARK_GRAY = 0x303030; + public static final int COLOR_MEDIUM_GRAY = 0x878787; + public static final int COLOR_LIGHT_GRAY = 0x565656; + + public static final int COLOR_DARK_YELLOW = 0xF7FC26; + public static final int COLOR_LIGHT_YELLOW = 0xD7FF8C; +} diff --git a/home-assistant/src/main/java/com/totalcross/util/Fonts.java b/home-assistant/src/main/java/com/totalcross/util/Fonts.java new file mode 100644 index 0000000..5e92b86 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/util/Fonts.java @@ -0,0 +1,6 @@ +package com.totalcross.util; + +public class Fonts { + + public static final String FONT_DEFAULT = "Times New Roman"; +} diff --git a/home-assistant/src/main/java/com/totalcross/util/Images.java b/home-assistant/src/main/java/com/totalcross/util/Images.java new file mode 100644 index 0000000..c3959a7 --- /dev/null +++ b/home-assistant/src/main/java/com/totalcross/util/Images.java @@ -0,0 +1,147 @@ +package com.totalcross.util; + +import totalcross.ui.image.Image; + +import totalcross.ui.dialog.MessageBox; + +public class Images { + + public static Image imgFrozenGray; + public static Image imgFrozenBlue; + public static Image imgCalenderGray; + public static Image imgCalenderGreen; + public static Image imgHotGray; + public static Image imgHotOrange; + public static Image imgOffGray; + public static Image imgOffBlack; + public static Image imgSpotify; + public static Image imgSecurityGreen; + public static Image imgSecurityRed; + public static Image imgEnergy; + public static Image imgSolarPower; + public static Image imgEletricity; + public static Image imgNonFossil; + public static Image imgHomeEnergy; + public static Image imgHarmony; + public static Image imgMap; + public static Image imgLigthBack; + public static Image imgLigthYellow; + public static Image imgCameraDireita; + public static Image imgCameraEsquerda; + + public static void loadFrozen() { + try { + imgFrozenBlue = new Image("images/iconFrozenGray.png"); + // imgFrozenGray = new Image("images/iconFronzenBlule.png"); + + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadCalender() { + try { + imgCalenderGray = new Image("images/iconCalenderGray.png"); + // imgCalenderGreen = new Image("images/iconCalenderGreen.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadHot() { + try { + imgHotGray = new Image("images/iconHotGray.png"); + // imgHotOrange = new Image("images/iconHotOrange.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadOff() { + try { + // imgOffBlack = new Image("images/iconOffBlack.png"); + imgOffGray = new Image("images/iconOffGray.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadSpotify() { + try { + imgSpotify = new Image("images/spotify.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadSecurity() { + try { + imgSecurityGreen = new Image("images/iconSecurityGreen.png"); + imgSecurityRed = new Image("images/iconSecurityRed.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadTemperatureStudy() { + try { + imgEnergy = new Image("images/iconPowerCharge.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadMap(){ + try { + imgMap = new Image("images/mapa.png"); + imgLigthBack = new Image("images/lampBlack.png"); + imgLigthYellow = new Image("images/lampYellow.png"); + imgCameraDireita = new Image("images/cameraDireita.png"); + imgCameraEsquerda = new Image("images/cameraEsquerda.png"); + + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadSolarPower() { + try { + imgSolarPower = new Image("images/SolarPower.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadEletricity() { + try { + imgEletricity = new Image("images/Eletricity.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadNonFossil() { + try { + imgNonFossil = new Image("images/Non-fossil.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadHomeEnergy() { + try { + imgHomeEnergy = new Image("images/homeEnergy.png"); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } + + public static void loadHarmony() { + try { + imgHarmony = new Image("images/Harmony.png"); + imgHarmony.scaledBy(1, 1); + } catch (Exception e) { + MessageBox.showException(e, true); + } + } +} diff --git a/home-assistant/src/main/resources/images/Eletricity.png b/home-assistant/src/main/resources/images/Eletricity.png new file mode 100644 index 0000000000000000000000000000000000000000..6a35f7311394a45747083eb3493d881591540131 GIT binary patch literal 3917 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 N002ovPDHLkV1oa`&4~a2 literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/SolarPower.png b/home-assistant/src/main/resources/images/SolarPower.png new file mode 100644 index 0000000000000000000000000000000000000000..8390cc181a6b4fb06b8b56978a4ab4e80874e3e8 GIT binary patch literal 3761 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 literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/cameraEsquerda.png b/home-assistant/src/main/resources/images/cameraEsquerda.png new file mode 100644 index 0000000000000000000000000000000000000000..805a0c0d85825db36b6b75f2df84ad5f7e974d7a GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_o|n5N2eUHAey{xYpCfF~q_@S)#H*&}%WXm_itP5}!f8K?U29 z^NKz`3A{)28-Cb#R&Wb!W;S#d7g*1jWGBGRp~qxs#(U%ekD9_k)*}ZUYNR?!8za~| zPO{!oU`}-4?eJ$X+$6EGK`_?%#8weTub5_09$V)9j+vVnH#Kf=xWUx%zp?U3<9`Ka z$8}NMN0vF%NOr7eGTiwmdKI;VstBqjj8pH}Vw literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/homeEnergy.png b/home-assistant/src/main/resources/images/homeEnergy.png new file mode 100644 index 0000000000000000000000000000000000000000..8de86ae4f944cb8bbc95c621d73bb520d8684364 GIT binary patch literal 2834 zcmV+t3+?oYP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D3a3d#K~#8N?VWeb zEL9nYKY9^C6cHo{C`bT76huL)sGy>V39-ZiiHc%F2^ym&h@glNv5R_be^{b&jTjRJ z1Ox)g1%VjKrHJ(2;nFVnJiF&4hhfXi&X(ET^Glx0emnD>x^vpR=beSDtgNi8tgNi8 ztgNgtYlU!}8a=hJ@H`GLh0S1nSO->zRp4=W6z+xF;aXTqChz7r6>4;aQ1}~hcp2;r zuL+-D2vyU43tS23!#`mO0o=$jtCy&N6=8ii82$#g!Q=4MkhveuhL3@FTw~OTJA^`6 zk;9wdJ@96D4)oJ9uqnD99)l-fWw7~L8`ce<`{@BV8%~6?C=kP%m?l~wRK&A5>;hkc z9bio;%0A&%xEhwgzu_9V4J*Hx7ijM-5h=l4?(dY zu7@AMuHfitWFq_(U>7(MZiix8fBgqhPym=~zX)8-RD?9Z*c0 z-@O;?=Vn7>W<&Tk6f^5D^IKpCJg8m^_rOP6f7KA_SO-1_4?>zwo3>NHerb9|1{}t2 z0}e5lL(JgA;IOt%J8i#m6gUASs1|m}wM9T%!fzq16uAsu6)u}Tk@%hA=8&0)cg4rU zC4Q0!l9!W^Pck4W%p@K&&INHgOvY&)nk-1g4+BM?ki zE`kl9wg_wsI0w>vJPHSfOPVhddjQxh#SGX6{|=rXE*Vsgcr0v!>Wk}G+e2*;n0?Fl zA*~c=`=1DxG*={YA9x@nTI@R<%GMpm?gp0uL6yc?{QfW$5#X_q_JvQtzTtH9MB;XX z|AxfMBk)zI+or!A?f`d4jFL*aXH3J`2%&H?}b3ow*5F-5>@z)6ti`@1mF z1zQug7oM$r?GtxUm5sCeY`Hy9B7rZ2#uB19k%HACs z94O*nIF4V7#sqVx@O1GIh>w4t3rABZl{@%>Dujr<6VkOD*Oq?W{y3ka>q=k{MM zy$!Z)e=M)c6+&hBKTfjZ;@u?IK zjw)qvQKdrMwG^dAhm)?XE~44Gi^Fy8zgj9~CR?RK(p&BZaLFXAx3rRpD)r30RE2~Q zLfU^^%NMbI%<8W64v9-mJyrG&aiJ`I9-T&%)m=A*qgt=b(6?-btOcpj!dyQ07(n(T zQSR*OYb;o{LgKdLsIje{PPvLp|8W(%tIAf03yA5pxkE3f;>5Y{B4gPKQGMILtY?UB z<7u+l>Z!67qJ3;Ss>*9veXdlgkO$izTiPTXvwBO%1yOg>3ETAdRH+IfAUh}5uc9_BGs($%+Umyj z;n-7U?+|rGI4a#$l<^}n@6xO^>Z)+;sVWt6VK^$AtU4QUW?r-)4t!qJ{;Q>-SBN%H zQ4Z%STjkA}TyBq>T<8|k^|^7hBxs!|~id(Ulu zZ0QZ$mf0q&yWBM#<@2MZ?T@`xx&R~L-O#qgZQCp(BLEQsDDs?rEH(8 z+#yOk**HOTL+A8(GZ?Sj#+_Q3EDp!v%DD%e57FKz9SUb5%48MLu}&d;HC z&~;t;O@+v(&S%n%IpRER{C7tx67cgRLGnYGY@$Xi^0zV^AMzXd4GhCARXvf2b>Whb zDDjTbA@NK;<~3h%IHW^=ciTo+Ba;`2*%};s#{|kuEBix*sSxSi2o^#5 zz7s$DQkYI}1Zu8GurK#2zWTw@hz0RHv^rP|a{t3*c=`0!B5p-Nr%((dGw9mlMJW%%%@mLXu z!5NT_pdz{tx1wfx8OVZg9mp4i=>@x32;$`OWcUCK&C=d*U=wgb)O9E45uM`qtw0l* zUrcneMus(y@%2YKi|pp}*Ih??L^vHTfJ;HMRt@*GnO#mM2&yeUxQ|aPOq)P`H2O$j zC(v(|8~ELDRQ%Pucf1fQi_GlNdhyuCOFS8I8qrXDm0IIQo9lbAv>C~ju#fhEG zr4znApfS&H8gYko5{2Y1-M1|44!-xp_u2Z3A0*A%)#`mhKkd4>Jp=wjK&dr>;CIW&aP)7XOCIA2c literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconCalenderGray.png b/home-assistant/src/main/resources/images/iconCalenderGray.png new file mode 100644 index 0000000000000000000000000000000000000000..472ec78455829333e459ff0911931f6b1ce83ee1 GIT binary patch literal 1904 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 literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconFrozenBlue.png b/home-assistant/src/main/resources/images/iconFrozenBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..e3eb95790a6b581853053caee5432b12e9d51eed GIT binary patch literal 2012 zcmbVNYitx%6doXmJZecHDn-IDl%~a-B5wybFSlPWqMUe56^lJpNr}Je5 z8U3l~uhD9}3s_zX8#zG=0AnmHLo|XE&5g+%Uk@}i0P4hu1G{;m2SY`{fmK_)q*r!= zpy+N=z@nxKKi^c(GXgeu4q6mrAwd{u92yIUA}SkmUdYbIHmMpHiwdQ*g2w$e2(NEI~x0QDf9(l$1JxVi<-XX@aJ4h``l&MB`$3M4g#tZ~>K9L|GH12&yx30jWWA zU@+2T3Sl`z8&Oj-LBWU^Cli#B)Kf|T<)EZVYEb$Ic;@wAj08SIE;lHlM8pD5fDj0S zh^9g;m2m*2^?Eb#C&m&EXV9uv)(F!`3Gzg=>W|BSs06Cipzxrq5qg}dXCt#t1#p_A z_$4WnE|f2w9_n=Jg<;TwYB3^6QMK?f8{pzJ;J|2-rf|}ZlV(3{~(NVW`8VCcBlg*sU}U7%BksHP_++o6U?fq>VP)1H6UeK@p+15u`wq zt0XNkO!6fEiNnphMLnK)DvCv5RVE%Zah_R@*Zb6g@%jM;0+!kqpSeCs+Gr3!(tkO% zNti0tYEe!BC3UctPtzDgT7zUN#NV?_DD~I?O2gq))0dfX3Li298ARX|R^YfTSbT3j zf{Zxpah3QBb~Nntm`0UM{_=+Ni>g<)m+l%I7#tYrYJWJmzUB77czfZB-oE}Za;0&% z+W|3hE2;Y%d$eh+}nW;ZaE(EQZhWdvyKGxnA2FAp(f?e9E z>W(9AQ){N4{p0w_Q^Yzj1+i<>+de;XueEFc2vaP-zdhf%%E!0$$I%NN$Kt!17aTs& zujW-1ZSS6%ErIG;d)wdWXf@2skwcenY}qhv?~K-!TkrUKf1Fg@adN9Pp2_8^o35>C zdVN#g(bKkbdDj;2pU_=Aukrrq&*Rb$bMPY8`Z~Ktk z?0xP-6INe&aU&Pp)@xR{JC@E@ZB5L$>=o|!4sXsm7q&k5b?nyX`d2M&WZNd60zIwj z1s^HixxB4qzW;nqe$^vS`%&?F{_acO^0u$o55HSiF?6XV>i9aV^UU3y%N=W~4vxM` c7FyoV?illC0p)zBS^xfe$|_ukN>{G`6Zy%#QUCw| literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconFrozenGray.png b/home-assistant/src/main/resources/images/iconFrozenGray.png new file mode 100644 index 0000000000000000000000000000000000000000..72d7e619c93310f695dc4fe8747be29492626bb2 GIT binary patch literal 1934 zcmcIleQ4Zd98TM*U3K+TkgiV1vLW5pTs|)Mk$|y3mVs#FrR?%7}#ro#HEV7mUV<5?! z_kG^y_xwKIUk|+d-L^rnA9wdXR z7sMogj|TSiw6qC5T>>j&4fSYUnu7!hVDM-<5tnr??Z&da92}d|1cqiIMwc7&mgVr=L!i9Xzd0X(y zjl~Q@IA%@Bv-WB-M}<88sRCu+nX~ zF{m`>LP9Ol%6dLbFknQQR|(2Wnl2T9!Qkr9M52h+jiw~DlGl4%V!bV+0wM%-rCSp~ zQxeF=mVz-+DDG9ewRqN3Q6NAZBp^(O!lVMAXO3+gN#>wISPCL< z@M{Arq7=!j1sV);0a-VASpWf_8-t>(k|c62O0ZL`Q^dngJC8FChR4GZ+J-x5isETI zYl{F^Ru|mwQ-p3ag695Q<%)^`If_BzY%T|7cR6Sruv8ciQ%nT%IvJcLoiyVLLsJ4M zusyCx@bK{Qm8_;J5i;6E5{ND_jMEGo!FeYGaF%8P9$~^f>wqE!z+$K* z1Rn*2Dn~K&Uo~DOu4q9;gfX|RoDX=tt(p>%;&4F^?QBE?O~PXI`GKm%^qy(1yAX& zWOJ$K>GQ*nhWEWYP&?ta{q!|!OFcZV&m_k>&rW}MeU2SXS7zQ^{BvP0Id)>*OS8w& zBd0ccHeH$gG4#aCwUZNNe{YRlf5rde4;kx`?|(}#y?1VA{_xvUHF~*$pIID|N*mP+ zPd&D4;(>tW;E;5)_m5l8-f&e~tXJP(x>j~|@a_v}Iaw1pj%+-%zcW>J=(VArFGf0& zqfdUqRQEbNr(Oyj#S*!+JDM_{9v_rXB# E0E4)VMF0Q* literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconHotGray.png b/home-assistant/src/main/resources/images/iconHotGray.png new file mode 100644 index 0000000000000000000000000000000000000000..714bc2425e112e9952ab06cca8b056666e5c1705 GIT binary patch literal 1742 zcmbVN4Q$k881AM79S+6@3nFSQhMc-yf9`g>Haq6HJJ<=`F53mB2wB&Dch~LiTH9`S zTSRe287`W+8O#WpMac*=8z?H8#SoN$Fm+i5F|z42NEWi-!p5?Yx!~9P(->5wN!zdA z_q@;h|8}ppd{cJT>MR67vOQ(4O8Cw(?t3!fv;EDW4ZiMG%AVE`WJ#WJXCV6ztU{1Q zYb0N_Ud?S`1vzZyMY$H3V_^lN5u~^zrtm^N(9v2DkRlFjYTyKhN}>bXR>+Z@;simd ztXTzB&E-C!xn5vItYke}9AhCt80b723x^^a8*^ZBUKXy6Z308%5WU`kl^P1sYR-!~ zWfh=>W*aV0)<8oloRI?GZ0yUkbqkt#Z=_)Z=#AD8^>PX)|Tidc5Y?GD(ApZAx}e6?iVW z3Q1_Z%vfG9I>CVnMhO5Ig2c9T$01C}M}q*8{!3jXV4CdLqr3`A12EjTQ+fonpD@}s z;R^A0FXLx_Y4H>s&JAOk9$4@rJ@P;V&N&qhvHQYGmT>Msk-TK$h%yrFtcfhl->$MAY7pCSWW^T+M zIX^!fvOSUC_EEv1kt^f7!=q(`m(_KhH?j-z+nzNCR-L}Ap7kF?j*nh_z(Bbmr2vm7ncA^8Rq^bm!See{;QX_nzKfESCBF_|U}6^~cY(+1D(cU)VV| zHaVNSd!+L4LDM<^vE@hmCwrvRzs8C;wj*y`BJ+yd7ngebwtjfB`{LD4b3X6iZd#Gs zJ#yvL7mWiu)TavG-h6bnc_E{Fhs*ReKG^&HHYYpptW{( za&w!zVj{dimj{d!`1iFDrSkfBEI1;W6Wn<8ha}`Zv_H`~kzp BVt)Vt literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconHotOrange.png b/home-assistant/src/main/resources/images/iconHotOrange.png new file mode 100644 index 0000000000000000000000000000000000000000..500ad6fd887ee4a1e1e9f0b1a15b4dad527a85cb GIT binary patch literal 1962 zcmbVN4Q$k8814{|A%A9!%mt-(WNu--{_L*1HgsgW+t?Xyj^n}(14ys^?pAi!mbTm7 zh6xkFIoNO*MJ4kO#Go=Hpa_C45rdhEpdkTdIgIE?)C3TsAc}syKhPi|m$d!*_4%In zeV_N|x*F7pCiP$7+0TDFB#BvatwoO{J(ffQL_icMrU9{3 z)&P{&>&?P%=u0%3MH^;KD-0to$PLkkzfA*#4;X5TE`pj?XtBtOM&n#M5KL9~t7;^Z zsD?~9?%5A2p}LS$H~U_=H?vytwlY9X9n zMdV5=Ov_C`SFmC^!{U^~8Nz|X9>SfX$ijdDWoKxC78q$JVKojsgr-(0BI4#2Q_9rI zmIrNVyYs-ZtOsbaf;mC7I+Mplt0aMhrMKnV&Pa+j)&wBwP3klSGt`h76Le4&hS|H7 zRvqbrn4(FJ)%nnfak{!W7fpb@f1Gabc(5DEJ^P0z9Tw~l@;ck|rfmN63({*M0qjpO1EARDTEdmh`|*}7!=>Wh6NwYQ7& zh6~v)&zO^U?<_vlI9xcrd-*d1c}U}|InTy(2k$xALr(U&>gg#`ch{E)^MlZQI+BMh zPJC4szCa&cb3W)k9bbbi%Ngc=YSrfFcD%7>L&=Zi1TlBjjQy*GvIB$N(>)XZ)nL-Rr|&FRl95dMuzG?EnKXM{~9uq6W1QRn{wo9%Ecp| zYL?H^zUAc`y0tr>aaewI`61P?1;4XTD6i{GPVyId@Rg-{o|v3~K8Fi0tJ0dAm$x5| zP2xMux%>ueg!N-<_hrX;q|K8U&gvbIIC%J0h}aDWpO$5|kHWS@Ci5GLNcHQnK9van z@GhlMsce9?;hep00i_ I>zopr0Qp*d@c;k- literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconOffGray.png b/home-assistant/src/main/resources/images/iconOffGray.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2f1d89109ce3c8beab9e99dfe25e7d6f98bf5d GIT binary patch literal 1657 zcmbVNe{9rL9PbIkF(8{d1GpKQ4s;~z^~ZI$YuyQ3@8mAn?c8o|i$U$R@9yfZeWmSj zcS{s9h|wWrVuEBLMEPS;V`ide;0$6y4AI3cGX5}8V~m)oAjH4?K@?x_m&TwXOhdc`~pV{EQ^;P0!g#fq|g_7pezf01&Ord zm;y!Rayf6#=Y>{^VtAgXXqIAG5+O*tU^sG~H0+iNLkQT4rJ0Tf4cujv6EN!p38ZPs z1l_FC8g|)D$YE4oHYvtSyCxNZs#3+7Su0Z%t|}DB038^Pjj&7=i@YRBRrqyjb-jwV zo$xNCQQ5ZZqV0IW1XLfeVb)SWco&k`Qc=uILkHSv_z!kekE_<0f@lHRfmR&COeIjU z3JWfZZeV!4bx<=@n6o##g35P5NOnMwU}=^i=>SP{ai&9H+Xc=?(msKvOHc`=f+{=m zje()6B@6!vRTUu#EnP;A(sVfmDAPz4rAd+yHEc&V6c7ys38bo5(^RBOAfa+9O>(@F zB>4_bC1qKrNrh$;v`TXf9q?7|hoF*mgIKw*{?GfpmWGN*&fGjtHAsR8GtiQtioA^U z`*S}kiZKf&wG2A2`?huC(Xi-ec)y=yy^Ndd#heo&nvDWmC|6HE*jZj>G`yH*f~>fe z5F`{g1%OJFx3!ygVTm@E28i@u@}dN@VbaOT7U)VLci%|rQAmHvE!&bQ)ZeWvp8ci7 zD{#~|+-0?4p^s|I0|x4I7HViS&z$%O!#vBPp{{uA!hu6`ukE8(KfUzZmlw`A<#*K1 z#+I)o#xD;vI-6?8I*$C3`hNZX#UGEpK6&BVxwk+3Vcs`-{xcKYC6EB|nVs`qg!{D7|FJ*V69-Go8<#n0m*nvw}<4@bgRSw&WuNHs) zI`C9~{h2*YWB8{Yr+33Cy=m>%GY!~%@7=j!Joeely_=tSx#9BJt@C@|(wm;Ua&?jW zB(lgIZzYawT)DeFwxaHQ%jtV+y9Wja=T5Zk2gC94_1AKbP?tRQx1OA;>EGAk{v4v= Lp3rpn<70mSyp19s literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconPowerCharge.png b/home-assistant/src/main/resources/images/iconPowerCharge.png new file mode 100644 index 0000000000000000000000000000000000000000..5eecd31ca38228492ed604ccecc99aa1fc341b1f GIT binary patch literal 590 zcmV-U0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0pm$TK~zXfwU#}P z0Z|l&Utb9#A)yo+iPk^RQbC?-_=-5Acr|`7XubaKQ0+Dz_8jYw_Dy(WF zy@E!gfnKkN(P)JEe9o#iQU-&;0PS`gHk%C=i$$zL7O9!lY8AWP4knX{6?rrbTCEoP z{XVQ#D=YeVX)u{g&}=s0bUI-$7+BTEO9OiOVzGEgjoEC5+wJC&Hcz){x7$UjRD#3d zcqr=Sa=~V^5qE-qP63q5WyIrgq5b5kK{Oi0>2wkiYjHlGMIg0W4L+Zb)lXDYRIk@X zlrk?T?)9O7exooL4u|M;Ia4L? z42430XDLxFvKp(^>R|=cT|FKTlF1}1>PQ>>X1m=Yl}f?u^|GSQpA6{36AFcpNF-Q! zj&1`=4IQdidH;#D0qqz%u@pTOHW&=@lh;TaP=li_91e$(&1PBEM%TXzS^+gaJs%!j c2KoWs0XufiH;A~voB#j-07*qoM6N<$f(gd>o&W#< literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconSecurityGreen.png b/home-assistant/src/main/resources/images/iconSecurityGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a6def900e36e6d078a4982f0d1162bfbf4af5863 GIT binary patch literal 3295 zcmcImc~lek79K?QDhL!%c@l#N3faku0WoZWL?NV#2(GV` zWThrah1hP`(00vpiKQx4kdvbmZ1B6@(9+NWnC4#9n|xwqwcjlac z^}Qyg`sMTbL-8IqslOW=kjqfW6)9PfK&4ujC*SX~-rO61i!m5ZaUgF=4Eq zFJ_sRg#ySB4T#ao66I=^mW_Rb%R=XdZ2}ha#zd3A#=gy86h9opQK%3M6;H!KByTE) z&cu^w6mKTe3qvN77z84NK%(GCG?q7!MJ8jWepu9-3Kp{j0YOu~&=ngi(P)$`0wFau z6`xAMD^&3Wv^JOoBAGxY<4_BnI!&$twK%!j^&LV0qJ~sbrADfdV+@F(NRg~zV^OAW zLy#$_Vdd&6nNYz9T2M(K;faQj-Wl@w|7HLmZR!O-+wWwI*qO{6eHKoSudYNkesk)~ZKB?^r~Em8bU9Mi|s(I{CQ6#{A$ zDxpG=_%2c5?@%xtjv+BjjK>Nml#M*-9Z9C4Z_BfiDVLv$iNY)LL!Mpp|VI! z9Ff8z65pEg(Ncgx4fuY>3Ro&mdmmFipT(7{HJ}_qxB+Y|N(wKP!l+k}$$&u+Ct^Y{ z4y1ciaSSR<#L+}dk%-7(Fliv|4KMV5fC5T3C}_C zf`digFir$9K^!EaP$*1qCIe!M-=VEiNzs=FO#CydffbA*k{I4ZGLtUG(I_Okffa~j zf@C^Q1k>nDghZml5ULgovBV0M3`9#sDg)yYf>Iuj#r&5IN0F#d@f9$tImJ-WC^{NN zh*XVcFKy}-iA0j7W{FbFo4R9xkfGe!SjdoP1jbHnOaDT>_v85%HdTV4p#PBkw`OXE zSd$8>5dU~o>G!EG!r$>%gDL;a{{3?Q|7AZVE+hfv@d(;M30Ols1VgWRn;OFZX6?<{ zpZd}}bF|qRrqf*(T}=0BM2Ztt-lw7IET%ZD zA(Yc2JRFSe4c(P{BRv1s6=9@c@6r>wxj{#JuT&kWoWrN~-jaAP<}Y$ckl`vTo@eV_ zBQ~yE$0L>t`Lc5R5T;|vU8JvhBBSHG*c8+8{uet|oy|;Bq-;5q@qNe3-Ho2hi?wxf zkB^<|G0N0EK}z7y3) z>`MBpAJA?d{IW%#DgLF;XAc~6te5vmPhY-wp`YC*PfpcQt?yRVD zb!Uw7D)zTimTvbcC@LmIpATD87=F_#|J4y)ckPFVw(+!J%_Nqiz5~%i3?ji@ArSxece=pgUGah4gKia zzfw?qarMEWXPa&o{ydo7ZZ>w+<@C3oRr~3#-qMV@FE1ELubC^`;RrvM)Pn69y)ka< zLP;^!*P_sKI}6)Ie(VQ39iK|~zWVL?!n*X6f_sYB-EGj%>2$zbK$gh)t4pM_6RaITYvTYXypFRT_5Ql&;35BCb5klmls=}Oy-^p4jJVh z^i8=mlqdHJZJX`nX9qqmIalPz8_lq6jj2Cswd7gps#IJOGfXH%ux)&ao)$J=krNP(PV&N!|L?zR1IZ?$kQo zyra{XWbxJUn6n;V-m;5+7Z>=MKj@66i3p47jzO3&W-y3K)=J)Wkjo=UI6d%J! OF*k5!z}G7_Z2u1(9SF4m literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/iconSecurityRed.png b/home-assistant/src/main/resources/images/iconSecurityRed.png new file mode 100644 index 0000000000000000000000000000000000000000..001cba1bd2644b42f64ec4a5f0eb9e3f1cff270e GIT binary patch literal 3203 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 IM6N<$f<~*C_y7O^ literal 0 HcmV?d00001 diff --git a/home-assistant/src/main/resources/images/lampYellow.png b/home-assistant/src/main/resources/images/lampYellow.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ba0e75fe7ced1a955dc9ac8edfd0a3a2f06adf GIT binary patch literal 2944 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

^#Z)-U6VGUWaeVF=!70PXThsY)!1^eo%D2|m&8 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

V@`byf`Ez=wE;V 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 XqSEVcg2<4)00000NkvXXu0mjfA-Vh{ literal 0 HcmV?d00001