Integración con Home Assistant
Recordareis que en la «actualización» de nuestra revisión de ls cámara de interiores CAM-P2T ya os detallamos como utilizando el protocolo ONVIF podíamos mover en horizontal y vertical dicha cámara. Afortunadamente la nueva cámara B1P también utiliza la misma forma para moverse en horizontal.
El uso de los sensores y resto de entidades en la interfaz de Home Assistant es de lo más sencillo… aunque hemos de reconocer que configurarla para poder ver las imágenes de las dos cámaras en paralelo y ocupando el máximo de pantalla no es tan sencillo.
Gracias a Copilot y ChatGPT y tras muchas iteraciones lo hemos conseguido y la verdad nos gusta como nos ha quedado. Así aparte de mover las cámaras podemos «inhibir» la detección de movimiento de forma que no grabe la imagen aunque se produzca la alarma.
En nuestro caso más que preocuparnos la llegada de «animales» de dos patas teniendo en cuenta que el piso del vecino está a más de cinco metros de nuestra casa no utilizamos la detección de personas sino la datección de movimiento en general para controlar a los animales de cuatro patas que nos suelen visitar.
Un problema qe hemos sufrido con la CAM-B1P es que incluso con sensibilida mínima detecta sutiles movimientos en árboles próximos que estarían lanzando alarmas sin cesar. Por ello en algunos momentos hemos utilizado la zona de PRIVACIDAD para enmascarar nuestro arbolito. Finalmente sin embargo reducimos el área de vigilancia por la zona alta y por la baja ya que incluso los lirios que teníamos pegados a la ventana disparaban la alarma.


Código Lovelace
Nos permitimos dejaros copia del código generado con Copilot+ChatGPT para poder ver en Horizontal las dos cámaras a resolución máxima en función de la pantalla o en vertical para las pequeñas pantallas de los móviles.
Para que no se nos olvide, dejar constancia de que tras varias pruebas sacamos las flechas para mover las cámaras fuera de la imagen que era lo que proponía SonOff- En nuestro caso, al menos, la velocidad de refresco en ese caso se veía perturbada y por eso decidimos ponerlas fuera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | views: - path: camaras icon: mdi:cctv type: custom:grid-layout layout: grid-template-columns: 1fr 1fr grid-gap: 12px mediaquery: '(max-width: 800px)': grid-template-columns: 1fr cards: - type: custom:mod-card card: type: vertical-stack cards: - type: markdown content: | <center><h2>Cámara 1: PT2</h2></center> - type: custom:button-card entity: input_boolean.activar_automatizacion_camara_pt2 name: | [[[ const auto = states['input_boolean.activar_automatizacion_camara_pt2']?.state; const alarma = states['binary_sensor.alarma_camara_pt2']?.state; if (alarma === 'on') return "🚨 Alarma ACTIVADA"; if (auto !== 'on') return "Vigilancia inactiva"; return "Sistema OK"; ]]] icon: | [[[ const alarma = states['binary_sensor.alarma_camara_pt2']?.state; const auto = states['input_boolean.activar_automatizacion_camara_pt2']?.state; if (alarma === 'on') return "mdi:alarm-light"; if (auto !== 'on') return "mdi:webcam-off"; return "mdi:shield-check"; ]]] tap_action: action: toggle show_state: false show_name: true show_icon: true styles: name: - font-size: 14px - font-weight: bold - color: | [[[ const alarma = states['binary_sensor.alarma_camara_pt2']?.state; const auto = states['input_boolean.activar_automatizacion_camara_pt2']?.state; if (alarma === 'on') return 'red'; if (auto !== 'on') return 'tomato'; return '#00C853'; ]]] icon: - width: 25px - height: 25px - '--mdc-icon-size': 25px - color: | [[[ const alarma = states['binary_sensor.alarma_camara_pt2']?.state; const auto = states['input_boolean.activar_automatizacion_camara_pt2']?.state; if (alarma === 'on') return 'red'; if (auto !== 'on') return 'tomato'; return '#00C853'; ]]] - type: entities entities: - entity: binary_sensor.cam_pt2_motion_alarm - type: picture-glance camera_image: camera.cam_pt2_mainstream camera_view: live show_name: false show_state: false entities: [] - type: horizontal-stack cards: - type: custom:button-card icon: mdi:arrow-left-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_pt2_mainstream pan: LEFT speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 28px - color: '#808080' - type: custom:button-card icon: mdi:arrow-up-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_pt2_mainstream tilt: UP speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 28px - color: '#808080' - type: custom:button-card icon: mdi:arrow-down-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_pt2_mainstream tilt: DOWN speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 28px - color: '#808080' - type: custom:button-card icon: mdi:arrow-right-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_pt2_mainstream pan: RIGHT speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 28px - color: '#808080' - type: entities entities: - entity: sensor.estado_grabacion_camara_pt2 - type: custom:mod-card card: type: vertical-stack cards: - type: markdown content: | <center><h2>Cámara 2: B1P</h2></center> - type: custom:button-card entity: input_boolean.activar_automatizacion_camara_b1p name: | [[[ const auto = states['input_boolean.activar_automatizacion_camara_b1p']?.state; const alarma = states['binary_sensor.alarma_camara_b1p']?.state; if (alarma === 'on') return "🚨 Alarma ACTIVADA"; if (auto !== 'on') return "Vigilancia inactiva"; return "Sistema OK"; ]]] icon: | [[[ const alarma = states['binary_sensor.alarma_camara_b1p']?.state; const auto = states['input_boolean.activar_automatizacion_camara_b1p']?.state; if (alarma === 'on') return "mdi:alarm-light"; if (auto !== 'on') return "mdi:video-off"; return "mdi:shield-check"; ]]] tap_action: action: toggle show_state: false show_name: true show_icon: true styles: name: - font-size: 14px - font-weight: bold - color: | [[[ const alarma = states['binary_sensor.alarma_camara_b1p']?.state; const auto = states['input_boolean.activar_automatizacion_camara_b1p']?.state; if (alarma === 'on') return 'red'; if (auto !== 'on') return 'tomato'; return '#00C853'; ]]] icon: - width: 25px - height: 25px - '--mdc-icon-size': 25px - color: | [[[ const alarma = states['binary_sensor.alarma_camara_b1p']?.state; const auto = states['input_boolean.activar_automatizacion_camara_b1p']?.state; if (alarma === 'on') return 'red'; if (auto !== 'on') return 'tomato'; return '#00C853'; ]]] - type: entities entities: - entity: binary_sensor.cam_b1p_motion_alarm - type: picture-glance camera_image: camera.cam_b1p_mainstream camera_view: live show_name: false show_state: false entities: [] - type: horizontal-stack cards: - type: custom:button-card icon: mdi:arrow-left-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_b1p_mainstream pan: LEFT speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 24px - color: '#808080' - type: custom:button-card icon: mdi:arrow-right-bold tap_action: action: call-service service: onvif.ptz service_data: entity_id: camera.cam_b1p_mainstream pan: RIGHT speed: 1 distance: 0.3 move_mode: ContinuousMove show_name: false styles: icon: - width: 28px - height: 24px - color: '#808080' - type: entities entities: - entity: sensor.estado_grabacion_camara_b1p |

Se nos había olvidado, entre otras muchas cosas, poner una imagen de como se vería la interfaz en la pantalla de un iPhone por ejemplo.
Nos acaban de comunicar nuestros amigos de Sonoff que se pospone el lanzamiento de la nueva cámara hasta el 11 de septiembre.
También nos han comentado que su precio será de 29.9 $ lo que la convierte en una cámara de exteriores realmente interesante.
De acuerdo a lo comentado acaba de ponerse a la venta por 30.88 EUR esta interesante cámara WiFi para exteriores. Además con este tiempo extra hemos tenido ocasión de «trabajar» el sistema de montaje que ahora nos ha quedado mucho más profesional 🙂