Por ejemplo, en el caso del dispositivo TTNMAD_PLANT_FREE
- Moisture
- Luminosity
- Temp
- Hum
- Pressure
- Bat
Modificar el switch de acuerdo a los números asignados en el paso anterior, y añadir al array inline_keyboard los elementos correspondientes a las telemetrías, tanto en la acción home como en la acción telemetry.
switch ($informacion->action) {
case "home":
array_push($keyboard["inline_keyboard"], [["text" => "Moisture", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"1\",\"q\":\"1\",\"r\":\"" . time() . "\"}"], ["text" => "Luminosity", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"2\",\"q\":\"1\",\"r\":\"" . time() . "\"}"], ["text" => "Temp", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"3\",\"q\":\"1\",\"r\":\"" . time() . "\"}"]]);
array_push($keyboard["inline_keyboard"], [["text" => "Hum", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"4\",\"q\":\"1\",\"r\":\"" . time() . "\"}"], ["text" => "Pressure", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"5\",\"q\":\"1\",\"r\":\"" . time() . "\"}"], ["text" => "Bat", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"6\",\"q\":\"1\",\"r\":\"" . time() . "\"}"]]);
array_push($keyboard["inline_keyboard"], [["text" => "Config", "callback_data" => "{\"action\":\"toConfig\"}"], ["text" => "Alarms", "callback_data" => "{\"action\":\"toAlarm\"}"]]);
break;
case "telemetry":
//Si no hay telemetrías previas hay que indicarlo en el botón Prev
switch ($informacion->p) {
case 1:
$nombreTelemetria = "Moisture";
break;
case 2:
$nombreTelemetria = "LDR";
break;
case 3:
$nombreTelemetria = "Temperatura";
break;
case 4:
$nombreTelemetria = "Humedad";
break;
case 5:
$nombreTelemetria = "Presion";
break;
case 6:
$nombreTelemetria = "Bateria";
break;
}
$telemetriaPrevia = json_decode(obtenerTelemetriaDispositivo($informacion->id, $nombreTelemetria, (intval($informacion->r) * 1000) - (intval($informacion->q) * 3600000), null));
if (isset($telemetriaPrevia->$nombreTelemetria)) {
//Hay telemetrías previas
$prevText = "Prev";
$prevCallbackData = "{\"action\":\"prev\",\"s\":\"prev\"}";
} else {
//No hay telemetrías previas
$prevText = "🚫Prev";
$prevCallbackData = "{\"action\":\"telemetry\",\"p\":\"" . $informacion->p . "\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}";
}
array_push($keyboard["inline_keyboard"][0], ["text" => "💾", "callback_data" => "{\"action\":\"download\"}"]);
array_push($keyboard["inline_keyboard"][0], ["text" => "📝", "callback_data" => "{\"action\":\"text\"}"]);
array_push($keyboard["inline_keyboard"], [["text" => "Prev", "callback_data" => "{\"action\":\"prev\",\"s\":\"prev\"}"], ["text" => "1h", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"" . $informacion->p . "\",\"q\":\"1\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "1d", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"" . $informacion->p . "\",\"q\":\"24\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "7d", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"" . $informacion->p . "\",\"q\":\"168\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "30d", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"" . $informacion->p . "\",\"q\":\"720\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "Next", "callback_data" => "{\"action\":\"next\",\"s\":\"next\"}"]]);
array_push($keyboard["inline_keyboard"], [["text" => "Moisture", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"1\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "Luminosity", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"2\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "Temp", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"3\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"]]);
array_push($keyboard["inline_keyboard"], [["text" => "Hum", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"4\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "Pressure", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"5\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"], ["text" => "Bat", "callback_data" => "{\"action\":\"telemetry\",\"p\":\"6\",\"q\":\"" . $informacion->q . "\",\"r\":\"" . $informacion->r . "\"}"]]);
array_push($keyboard["inline_keyboard"], [["text" => "Config", "callback_data" => "{\"action\":\"toConfig\"}"], ["text" => "Alarms", "callback_data" => "{\"action\":\"toAlarm\"}"]]);
break;
}
Aquí básicamente hay que sustituir el nombre de la telemetría en cada case.
case "2"://Bat
$nombreTelemetria = "Bateria"; //Nombre de la telemetría en myIoT
$rotuloTelemetria = "Bat";
Si alguna telemetría requiere redondear los rótulos del eje Y se puede usar una función de este estilo:
function YAxisFormat($Value) {
return(round($Value, 3));
}
Que se utiliza desde el método setAxisDisplay:
$myPicture->myData->setAxisDisplay(0, AXIS_FORMAT_CUSTOM, "YAxisFormat"); //Redondeo a 3 decimales
Hay que añadir el bloque funciones al principio:
<funciones>[{"nombre":"myiotlegrampassadm","codigo":"var result= '';var characters= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';var charactersLength = characters.length;for ( var i = 0; i != 20; i++ ) {result += characters.charAt(Math.floor(Math.random()* charactersLength));}$scope.vm.configuracion.__myiotlegram_passadm=result;$scope.form.configuracionmyiotlegram.$setDirty()"},{"nombre":"myiotlegrampassobs","codigo":"var result= '';var characters= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';var charactersLength = characters.length;for ( var i = 0; i != 20; i++ ) {result += characters.charAt(Math.floor(Math.random()* charactersLength));}$scope.vm.configuracion.__myiotlegram_passobs=result;$scope.form.configuracionmyiotlegram.$setDirty()"}]</funciones>
Y un panel (por encima del panel Configuración general):
<panel titulo="myIoTlegram" resumen="Si regenera un código, los dispositivos que estén usando el actual quedarán desvinculados de myIoTlegram" nombreFormulario="myiotlegram" ng-if="!vm.attributes.hasOwnProperty('esDelegado') || (vm.attributes.esDelegado===false)">
<md-input-container style="display: none;">
<input type="text" name="passadm" ng-value="vm.configuracion.__myiotlegram_passadm"/>
</md-input-container>
<div class="md-whiteframe-1dp" layout="column" style="padding-left: 5px; margin-bottom: 3px;">
<div class="md-body-1" style="padding-bottom: 10px; color: rgba(0,0,0,0.57);">Código de administrador</div>
<div class="row" layout="column">
<div ng-if="vm.configuracion.__myiotlegram_passadm!=undefined">{{vm.entityId.id}}:{{vm.configuracion.__myiotlegram_passadm}}-A
<md-button type="button" class="md-raised md-primary md-button md-ink-ripple" ng-href="https://chart.googleapis.com/chart?chs=350x350&cht=qr&chl={{vm.entityId.id}}:{{vm.configuracion.__myiotlegram_passadm}}-A" target="_blank">Ver código QR</md-button>
</div>
<div ng-if="vm.configuracion.__myiotlegram_passadm==undefined">NO GENERADO</div>
<div width="20%">
<md-input-container style="margin: 0px;">
<input type="button" value="Regenerar código" ng-click="myiotlegrampassadm()" class="md-raised md-primary md-button md-ink-ripple"/>
</md-input-container>
</div>
</div>
</div>
<md-input-container style="display: none;">
<input type="text" name="passobs" ng-value="vm.configuracion.__myiotlegram_passobs"/>
</md-input-container>
<div class="md-whiteframe-1dp" layout="column" style="padding-left: 5px; margin-bottom: 3px;">
<div class="md-body-1" style="padding-bottom: 10px; color: rgba(0,0,0,0.57);">Código de observador</div>
<div class="row" layout="column">
<div ng-if="vm.configuracion.__myiotlegram_passobs!=undefined">{{vm.entityId.id}}:{{vm.configuracion.__myiotlegram_passobs}}-O
<md-button type="button" class="md-raised md-primary md-button md-ink-ripple" ng-href="https://chart.googleapis.com/chart?chs=350x350&cht=qr&chl={{vm.entityId.id}}:{{vm.configuracion.__myiotlegram_passobs}}-O" target="_blank">Ver código QR</md-button>
</div>
<div ng-if="vm.configuracion.__myiotlegram_passobs==undefined">NO GENERADO</div>
<div width="20%">
<md-input-container style="margin: 0px;">
<input type="button" value="Regenerar código" ng-click="myiotlegrampassobs()" class="md-raised md-primary md-button md-ink-ripple"/>
</md-input-container>
</div>
</div>
</div>
</panel>
En este punto ya podríamos depurar las telemetrías del nuevo tipo de dispositivo directamente en myIoTlegram.
En este archivo se genera el menú y las acciones de configuración. Son muy dependientes del tipo de dispositivo; pero se gestionan mediante los case de un switch($informacion_estado_actual_chat->p). El case list muestra el estado actual de la configuración y ofrece el menú para modificarla, en el que el rol administrador tiene acceso a todas las opciones, mientras que el rol observador sólo puede cambiar el nombre del dispositivo (el nombre es local para cada instancia de myIoTlegram; no afecta al nombre real del dispositivo en myIoT, ni al de otros usuarios que lo tengan vinculado en su myIoTlegram), o desvincular el dispositivo. Otros case genéricos son toNombre y toDesvincular. En general, los dispositivos de la serie TTNMAD tienen opciones para configurar:
- Periodo de heartbeat
- ACK de los uplinks
- Resetear el dispositivo
Este archivo es muy similar al anterior, y es el responsable de mostrar las alarmas y su menú de configuración. El rol observador no puede configurar las alarmas (asume la configuración establecida por el rol administrador).
Este archivo permite descargar las telemetrías en formato CSV del gráfico que estemos visualizando. Sólo requiere indicar el nombre de la telemetría en función del número que le hayamos asignado a cada una en el paso 1.
switch ($informacion_estado_actual_chat->p) {
case "1"://Correo
$telemetrias = json_decode(obtenerTelemetriaDispositivo($informacion_estado_actual_chat->id, "Correo", intval($informacion_estado_actual_chat->r) * 1000, intval($informacion_estado_actual_chat->q) * 3600000));
$telemetrias = array_reverse($telemetrias->Correo);
$nombreArchivo = $nombre_dispositivo . "_correo_" . $informacion_estado_actual_chat->r . ".csv";
break;
case "2"://Bateria
$telemetrias = json_decode(obtenerTelemetriaDispositivo($informacion_estado_actual_chat->id, "Bateria", intval($informacion_estado_actual_chat->r) * 1000, intval($informacion_estado_actual_chat->q) * 3600000));
$telemetrias = array_reverse($telemetrias->Bateria);
$nombreArchivo = $nombre_dispositivo . "_bat_" . $informacion_estado_actual_chat->r . ".csv";
break;
}
Este archivo permite obtener en un mensaje de Telegram las variaciones de la telemetría que estemos visualizando (con un límite de unos 65000 caracteres impuesto por Telegram). Básicamente, como en el caso del archivo DOWNLOAD, sólo requiere asociar a cada número el nombre correspondiente de telemetría de acuerdo al paso 1.
switch ($informacion_estado_actual_chat->p) {
case "1"://Correo
$telemetrias = json_decode(obtenerTelemetriaDispositivo($informacion_estado_actual_chat->id, "Correo", intval($informacion_estado_actual_chat->r) * 1000, intval($informacion_estado_actual_chat->q) * 3600000));
$telemetrias = array_reverse($telemetrias->Correo);
$txt = $nombre_dispositivo . ": Variaciones de Correo" . chr(10);
break;
case "2"://Bateria
$telemetrias = json_decode(obtenerTelemetriaDispositivo($informacion_estado_actual_chat->id, "Bateria", intval($informacion_estado_actual_chat->r) * 1000, intval($informacion_estado_actual_chat->q) * 3600000));
$telemetrias = array_reverse($telemetrias->Bateria);
$txt = $nombre_dispositivo . ": Variaciones de Bat" . chr(10);
break;
}
En el archivo notificar.php hay que indicar el icono correspondiente al tipo de dispositivo.
switch ($tipoDispositivo){
case "TTNMAD_DOOR":
$icono="🚪 ";
break;
case "TTNMAD_PLANT_FREE":
$icono="🪴 ";
break;
case "TTNMAD_MAILBOX":
$icono="📬 ";
break;
}
La localización afecta a myIoT en:
- tooltip (se usa en última telemetría) -> En lugar de usar este atributo, uso uno nuevo llamado ultimaTelemetria_myIoTlegram
- asuntoEmail (se usa en última alarma) -> En lugar de usar este atributo, uso uno nuevo llamado ultimaAlarma_myIoTlegram
- mensajeTelegram (se usa en la comunicación de las alarmas) -> En lugar de usar este atributo, uso uno nuevo llamado myIoTlegram
A nivel del propio myIoTlegram:
- keyboards (botones)
- Gráficas (leyenda y rótulos de ejes)
- Intrucciones