Configuration
Prérequis
| Élément | Détail |
|---|---|
| Matériel | Ewon Flexy 201 |
| Firmware | Version 14.0 ou supérieure |
| Réseau | Le port 8883 (MQTTS) doit être accessible en sortie vers streams-mqtt.magicbuilder.io |
| Compte IoT magic Builder | API Key et Device Developer ID (voir ci-dessous) |
Étape 1 : Récupérer les identifiants IoT magic Builder
Depuis la plateforme IoT magic Builder, vous devez récupérer deux informations :
- API Key : clé d'authentification de votre projet
- Device Developer ID : identifiant unique de l'équipement sur la plateforme utilisé lors de la transmission des données
Connectez-vous à votre espace IoT magic Builder, créez un équipement (ou sélectionnez un équipement existant) et récupérez l'API Key et le Device Developer ID depuis l'interface d'administration.
Étape 2 : Configurer les tags sur l'Ewon Flexy
Depuis l'interface web de votre Ewon Flexy, configurez vos tags (capteurs / variables) et assignez-les à un ou plusieurs groupes (A, B, C ou D).
Le script détecte automatiquement tous les tags configurés sur l'Ewon.
Les groupes permettent de regrouper les tags et de définir des fréquences d'envoi différentes pour chaque groupe.
Étape 3 : Déployer le script sur le Flexy
Installation
- Copiez le script eWON BASIC ci-dessous
- Modifiez les 3 lignes de configuration avec vos identifiants Magic Builder :
CONF_MQTTBrokerURL$— URL du broker (ne pas modifier sauf indication contraire)CONF_APIKey$— votre API Key Magic BuilderCONF_DeviceDevID$— le Device Developer ID de votre équipement
- Connectez-vous à l'interface web de votre Ewon Flexy
- Allez dans Setup > BASIC IDE
- Copiez-collez l'intégralité du script dans l'éditeur
- Cliquez sur Run
Script complet
Afficher / masquer le script eWON BASIC
Rem --- eWON start section: Init Section
eWON_init_section:
Rem --- eWON user (start)
//-->NAME : Magic Builder MQTTS - Flexy 201
//-->VERSION : 1.0
//-->DESCRIPTION
//This program pushes Tag values from Flexy 201 to IoT Magic Builder platform via MQTTS.
//Based on i4connected template, adapted for Magic Builder JSON v2 format.
//Supports full push (periodic) and on-change push per tag group (A, B, C, D).
//Includes local file buffer in case of communication loss.
//-->END DESCRIPTION
//
//-->REQUIREMENTS
//- Flexy 201 with firmware >= 14.0
//- Internet connection (Port 8883 must be open for MQTTS)
//- Tags configured and assigned to groups A, B, C or D
//-->END REQUIREMENTS
//-->CONFIGURATION MAGIC BUILDER (à personnaliser par Flexy)
//
//
CONF_MQTTBrokerURL$="streams-mqtt.magicbuilder.io" // <-- À MODIFIER
CONF_APIKey$="xxxxxx" // <-- À MODIFIER
CONF_DeviceDevID$="xxxxxxx" // <-- À MODIFIER
//
//
// Paramètres dérivés (ne pas modifier)
CONF_Username$ = CONF_APIKey$
CONF_Password$=""
CONF_Topic$ = CONF_APIKey$ + "/streams"
CONF_ClientID$ = "Flexy_" + GETSYS PRG, "SERNUM"
//-->TAG GROUPS CONFIGURATION
CONF_GROUPA$ = "1"
CONF_FullPushTime_GroupA$ = "300"
CONF_ChangePushTime_GroupA$ = "5"
CONF_GROUPB$ = "1"
CONF_FullPushTime_GroupB$ = "300"
CONF_ChangePushTime_GroupB$ = "5"
CONF_GROUPC$ = "1"
CONF_FullPushTime_GroupC$ = "300"
CONF_ChangePushTime_GroupC$ = "5"
CONF_GROUPD$ = "1"
CONF_FullPushTime_GroupD$ = "300"
CONF_ChangePushTime_GroupD$ = "5"
//-->END CONFIGURATION
// Convert string configs to integers
CONF_FullPushTime_GroupA% = VAL CONF_FullPushTime_GroupA$
CONF_ChangePushTime_GroupA% = VAL CONF_ChangePushTime_GroupA$
CONF_FullPushTime_GroupB% = VAL CONF_FullPushTime_GroupB$
CONF_ChangePushTime_GroupB% = VAL CONF_ChangePushTime_GroupB$
CONF_FullPushTime_GroupC% = VAL CONF_FullPushTime_GroupC$
CONF_ChangePushTime_GroupC% = VAL CONF_ChangePushTime_GroupC$
CONF_FullPushTime_GroupD% = VAL CONF_FullPushTime_GroupD$
CONF_ChangePushTime_GroupD% = VAL CONF_ChangePushTime_GroupD$
// Buffer configuration
MsgDBPath$ = "/usr/mqttbuffer/"
FS "mkdir", MsgDBPath$
MaxNumberBufferFiles% = 20000
indexbufferfile% = @MQTT_CheckLastFileNameOfBuffer%
IF CONF_ClientID$ = "" THEN CONF_ClientID$ = GETSYS PRG , "SerNum"
CLS
// Temp Variables
Last_ConnStatus% = -1
FullPushLastTimeSec_GroupA% = 0
ChangePushLastTimeSec_GroupA% = 0
FullPushLastTimeSec_GroupB% = 0
ChangePushLastTimeSec_GroupB% = 0
FullPushLastTimeSec_GroupC% = 0
ChangePushLastTimeSec_GroupC% = 0
FullPushLastTimeSec_GroupD% = 0
ChangePushLastTimeSec_GroupD% = 0
TempGroupsToPush_All$ = ""
TempGroupsToPush_OnChange$ = ""
// Quote character for JSON
Q$ = CHR$(34)
//START THE SCRIPT
@LOG("Generate CA Certificate for Magic Builder")
@Generate_CA_Certificate()
@LOG("Initialize MQTT, connect to broker: " + CONF_MQTTBrokerURL$)
MQTT "OPEN", CONF_ClientID$ , CONF_MQTTBrokerURL$
MQTT "SETPARAM", "Username", CONF_Username$
MQTT "SETPARAM", "Password", CONF_Password$
MQTT "SETPARAM", "PORT", "8883"
MQTT "SETPARAM", "KEEPALIVE", "10"
MQTT "SETPARAM", "TLSVersion", "tlsv1.2"
MQTT "SETPARAM", "CAFile", "/usr/MagicBuilderCA.crt"
SETSYS PRG,"RESUMENEXT",1
MQTT "CONNECT"
ErrorReturned% = GETSYS PRG,"LSTERR"
IF ErrorReturned% = 28 THEN @Log("WAN interface not yet ready. MQTT Launched anyway...")
SETSYS PRG,"RESUMENEXT",0
// Record Tag ONCHANGE events into an array
NB%= GETSYS PRG,"NBTAGS"
DIM a(NB%,2)
FOR i% = 0 TO NB%-1
k%=i%+1
SETSYS Tag, "load",-i%
a(k%,1)=-i%
a(k%,2) = 0
GroupA$= GETSYS TAG,"IVGROUPA"
GroupB$= GETSYS TAG,"IVGROUPB"
GroupC$= GETSYS TAG,"IVGROUPC"
GroupD$= GETSYS TAG,"IVGROUPD"
IF GroupA$ = "1" And CONF_GroupA$= "1" THEN Onchange -i%, "a("+ STR$ k%+",2)= 1"
IF GroupB$ = "1" And CONF_GroupB$= "1" THEN Onchange -i%, "a("+ STR$ k%+",2)= 1"
IF GroupC$ = "1" And CONF_GroupC$= "1" THEN Onchange -i%, "a("+ STR$ k%+",2)= 1"
IF GroupD$ = "1" And CONF_GroupD$= "1" THEN Onchange -i%, "a("+ STR$ k%+",2)= 1"
NEXT i%
// Set and Start Timer
MQTTProcess_CycleTime% = 1
ONTIMER 4, "GOTO MqttProcess"
TSET 4, MQTTProcess_CycleTime%
END
//============================================================================
// MQTT PUBLISH FUNCTION
//============================================================================
FUNCTION MQTT_Publish($json$)
$ConnStatus% = MQTT "STATUS"
IF $ConnStatus% = 5 THEN
MQTT "PUBLISH", CONF_Topic$, $json$, 2, 0
PRINT "Message sent to topic " + CONF_Topic$
ELSE
@MQTT_SaveMQTTEvent($json$)
ENDIF
ENDFN
//============================================================================
// CONNECTION CHECK - Send buffered messages when reconnected
//============================================================================
FUNCTION MQTT_CheckConnection()
$ConnStatus% = MQTT "STATUS"
IF Last_ConnStatus% <> $ConnStatus% THEN
IF $ConnStatus% = 5 THEN
@Log("Flexy connected to Magic Builder broker")
@MQTT_SendSavedEvents()
ELSE
@Log("Flexy disconnected from broker")
ENDIF
Last_ConnStatus% = $ConnStatus%
ENDIF
ENDFN
//============================================================================
// BUFFER FUNCTIONS - Save messages when offline
//============================================================================
FUNCTION MQTT_SaveMQTTEvent($Msg$)
IF indexbufferfile% < MaxNumberBufferFiles% THEN
CLOSE 1
OPEN "file:" + MsgDBPath$ + STR$ indexbufferfile% + ".txt" FOR BINARY OUTPUT AS 1
PUT 1, $Msg$
CLOSE 1
indexbufferfile% = indexbufferfile% + 1
@LOG("Flexy not connected - event saved to buffer")
ELSE
@LOG("Flexy not connected - buffer full, event not saved")
ENDIF
ENDFN
FUNCTION MQTT_SendSavedEvents()
@Log("Checking messages buffer...")
$FileCount% = FS "count", MsgDBPath$
$FlagExist% = 0
@Log(STR$ $FileCount% + " files to send.")
IF $FileCount% = 0 THEN RETURN
FOR $i% = 0 To MaxNumberBufferFiles%
$Exist% = -1
$FilePath$ = MsgDBPath$ + STR$ $i% + ".txt"
$Exist% = FS "size", $FilePath$
IF $Exist% <> -1 THEN
IF $FlagExist% = 0 THEN $FlagExist% = 1 : @Log("Starting with file " + $FilePath$)
$ConnStatus% = MQTT "STATUS"
IF $ConnStatus% = 5 THEN
CLOSE 2
OPEN "file:" + $FilePath$ FOR BINARY INPUT AS 2
$Msg$ = GET 2
MQTT "PUBLISH", CONF_Topic$, $Msg$, 2, 0
ERASE $FilePath$
CLOSE 2
$NbrMsg% = $NbrMsg% + 1
ELSE
RETURN
ENDIF
ELSE
IF $FlagExist% = 1 THEN
@LOG("All saved messages (" + STR$ $NbrMsg% + ") published.")
indexbufferfile% = 0
RETURN
ENDIF
ENDIF
NEXT $i%
@LOG("All saved messages (" + STR$ $NbrMsg% + ") published.")
indexbufferfile% = 0
ENDFN
FUNCTION MQTT_CheckLastFileNameOfBuffer%
$MQTT_CheckLastFileNameOfBuffer% = 0
@Log("Checking buffer last filename...")
$FileCount% =FS "count", MsgDBPath$
$FlagExist% = 0
IF $FileCount% = 0 THEN RETURN
FOR $i% = 0 To MaxNumberBufferFiles%
$Exist% = -1
$FilePath$ = MsgDBPath$ + STR$ $i% + ".txt"
$Exist% = FS "size", $FilePath$
IF $Exist% <> -1 THEN
$MQTT_CheckLastFileNameOfBufferTemp$ = $FilePath$
ENDIF
NEXT $i%
$MQTT_CheckLastFileNameOfBuffer% = VAL $MQTT_CheckLastFileNameOfBufferTemp$(16 To LEN($MQTT_CheckLastFileNameOfBufferTemp$)-4)
$MQTT_CheckLastFileNameOfBuffer% =$MQTT_CheckLastFileNameOfBuffer% + 1
ENDFN
FUNCTION GetUnixTimestamp%
TmpTime$ = Time$
TmpStr$ = TmpTime$(1 To 2)
TmpDay% = VAL TmpStr$
TmpStr$ = TmpTime$(4 To 5)
TmpMonth% = VAL TmpStr$
TmpStr$ = TmpTime$(7 To 10)
TmpYear% = VAL TmpStr$
TmpStr$ = TmpTime$(12 To 13)
TmpHour% = VAL TmpStr$
TmpStr$ = TmpTime$(15 To 16)
TmpMin% = VAL TmpStr$
TmpStr$ = TmpTime$(18 To 19)
TmpSec% = VAL TmpStr$
TmpDays% = (TmpYear% - 1970) * 365
TmpDays% = TmpDays% + ((TmpYear% - 1969) / 4)
IF TmpMonth% > 1 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 2 THEN TmpDays% = TmpDays% + 28
IF TmpMonth% > 3 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 4 THEN TmpDays% = TmpDays% + 30
IF TmpMonth% > 5 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 6 THEN TmpDays% = TmpDays% + 30
IF TmpMonth% > 7 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 8 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 9 THEN TmpDays% = TmpDays% + 30
IF TmpMonth% > 10 THEN TmpDays% = TmpDays% + 31
IF TmpMonth% > 11 THEN TmpDays% = TmpDays% + 30
// Gérer le 29 février pour les années bissextiles
IF TmpMonth% > 2 THEN
$IsLeap% = 0
IF (TmpYear% MOD 4) = 0 THEN $IsLeap% = 1
IF (TmpYear% MOD 100) = 0 THEN $IsLeap% = 0
IF (TmpYear% MOD 400) = 0 THEN $IsLeap% = 1
TmpDays% = TmpDays% + $IsLeap%
ENDIF
TmpDays% = TmpDays% + TmpDay% - 1
$GetUnixTimestamp% = (TmpDays% * 86400) + (TmpHour% * 3600) + (TmpMin% * 60) + TmpSec%
ENDFN
//============================================================================
// JSON BUILDING - Magic Builder v2 Format
//============================================================================
// Build a single dataset entry for Magic Builder
FUNCTION BuildDatasetEntry$($group$, $index%, $tagname$, $value$, $timestamp%)
$ref$ = "Group_" + $group$ + "|" + STR$($index%) + "|" + $tagname$
$BuildDatasetEntry$ = "{" + Q$ + "ref" + Q$ + ":" + Q$ + $ref$ + Q$ + ","
$BuildDatasetEntry$ = $BuildDatasetEntry$ + Q$ + "type" + Q$ + ":" + Q$ + "Measure" + Q$ + ","
$BuildDatasetEntry$ = $BuildDatasetEntry$ + Q$ + "at" + Q$ + ":" + STR$($timestamp%) + ","
$BuildDatasetEntry$ = $BuildDatasetEntry$ + Q$ + "value" + Q$ + ":" + $value$ + "}"
ENDFN
// Get tag group letter (A, B, C, or D)
FUNCTION GetTagGroup$($negIndex%)
SETSYS Tag, "LOAD", $negIndex%
$GroupA$ = GETSYS TAG,"IVGROUPA"
$GroupB$ = GETSYS TAG,"IVGROUPB"
$GroupC$ = GETSYS TAG,"IVGROUPC"
$GroupD$ = GETSYS TAG,"IVGROUPD"
IF $GroupA$ = "1" THEN $GetTagGroup$ = "A" : RETURN
IF $GroupB$ = "1" THEN $GetTagGroup$ = "B" : RETURN
IF $GroupC$ = "1" THEN $GetTagGroup$ = "C" : RETURN
IF $GroupD$ = "1" THEN $GetTagGroup$ = "D" : RETURN
$GetTagGroup$ = ""
ENDFN
// Build complete JSON for all tags in specified groups
FUNCTION MQTT_ComputeJsonAllTags$($Group$)
$timestamp% = @GetUnixTimestamp%
$dataset$ = ""
$NBTags% = GETSYS PRG,"NBTAGS"
$first% = 1
FOR $i% = 0 TO $NBTags% - 1
SETSYS TAG, "LOAD", -$i%
$Tagname$ = GETSYS TAG,"NAME"
$GroupA$ = GETSYS TAG,"IVGROUPA"
$GroupB$ = GETSYS TAG,"IVGROUPB"
$GroupC$ = GETSYS TAG,"IVGROUPC"
$GroupD$ = GETSYS TAG,"IVGROUPD"
$TagValue$ = GETSYS TAG, "TAGVALUE"
$publish% = 0
$tagGroup$ = ""
$PosGroupA% = INSTR 1, $Group$, "A"
$PosGroupB% = INSTR 1, $Group$, "B"
$PosGroupC% = INSTR 1, $Group$, "C"
$PosGroupD% = INSTR 1, $Group$, "D"
IF $PosGroupA% <> 0 AND $GroupA$ = "1" AND CONF_GroupA$ = "1" THEN $publish% = 1 : $tagGroup$ = "A"
IF $PosGroupB% <> 0 AND $GroupB$ = "1" AND CONF_GroupB$ = "1" THEN $publish% = 1 : $tagGroup$ = "B"
IF $PosGroupC% <> 0 AND $GroupC$ = "1" AND CONF_GroupC$ = "1" THEN $publish% = 1 : $tagGroup$ = "C"
IF $PosGroupD% <> 0 AND $GroupD$ = "1" AND CONF_GroupD$ = "1" THEN $publish% = 1 : $tagGroup$ = "D"
IF $publish% = 1 THEN
IF $first% = 0 THEN $dataset$ = $dataset$ + ","
$dataset$ = $dataset$ + @BuildDatasetEntry$($tagGroup$, 0, $Tagname$, $TagValue$, $timestamp%)
$first% = 0
ENDIF
NEXT $i%
// Build complete Magic Builder JSON v2
$json$ = "{" + Q$ + "protocol" + Q$ + ":" + Q$ + "v2" + Q$ + ","
$json$ = $json$ + Q$ + "device" + Q$ + ":" + Q$ + CONF_DeviceDevID$ + Q$ + ","
$json$ = $json$ + Q$ + "at" + Q$ + ":" + STR$($timestamp%) + ","
$json$ = $json$ + Q$ + "data" + Q$ + ":{"
$json$ = $json$ + Q$ + "ver" + Q$ + ":" + Q$ + "S1" + Q$ + ","
$json$ = $json$ + Q$ + "dataset" + Q$ + ":[" + $dataset$ + "]}}"
$MQTT_ComputeJsonAllTags$ = $json$
ENDFN
// Build JSON for tags that have changed
FUNCTION MQTT_ComputeJsonChangeTags$($Group$)
$counter% = 0
$timestamp% = @GetUnixTimestamp%
$dataset$ = ""
$NB% = GETSYS PRG,"NBTAGS"
$first% = 1
FOR $r% = 1 TO $NB%
IF a($r%,2) = 1 THEN
$negIndex% = a($r%,1)
SETSYS Tag, "LOAD", $negIndex%
$GroupA$ = GETSYS TAG,"IVGROUPA"
$GroupB$ = GETSYS TAG,"IVGROUPB"
$GroupC$ = GETSYS TAG,"IVGROUPC"
$GroupD$ = GETSYS TAG,"IVGROUPD"
$PosGroupA% = INSTR 1, $Group$, "A"
$PosGroupB% = INSTR 1, $Group$, "B"
$PosGroupC% = INSTR 1, $Group$, "C"
$PosGroupD% = INSTR 1, $Group$, "D"
$publish% = 0
$tagGroup$ = ""
IF $PosGroupA% <> 0 AND $GroupA$ = "1" THEN $publish% = 1 : $tagGroup$ = "A"
IF $PosGroupB% <> 0 AND $GroupB$ = "1" THEN $publish% = 1 : $tagGroup$ = "B"
IF $PosGroupC% <> 0 AND $GroupC$ = "1" THEN $publish% = 1 : $tagGroup$ = "C"
IF $PosGroupD% <> 0 AND $GroupD$ = "1" THEN $publish% = 1 : $tagGroup$ = "D"
IF $publish% = 1 THEN
a($r%,2) = 0
$Tagname$ = GETSYS TAG, "NAME"
$TagValue$ = GETSYS TAG, "TAGVALUE"
IF $first% = 0 THEN $dataset$ = $dataset$ + ","
$dataset$ = $dataset$ + @BuildDatasetEntry$($tagGroup$, 0, $Tagname$, $TagValue$, $timestamp%)
$first% = 0
$counter% = $counter% + 1
ENDIF
ENDIF
NEXT $r%
IF $counter% <> 0 THEN
$json$ = "{" + Q$ + "protocol" + Q$ + ":" + Q$ + "v2" + Q$ + ","
$json$ = $json$ + Q$ + "device" + Q$ + ":" + Q$ + CONF_DeviceDevID$ + Q$ + ","
$json$ = $json$ + Q$ + "at" + Q$ + ":" + STR$($timestamp%) + ","
$json$ = $json$ + Q$ + "data" + Q$ + ":{"
$json$ = $json$ + Q$ + "ver" + Q$ + ":" + Q$ + "S1" + Q$ + ","
$json$ = $json$ + Q$ + "dataset" + Q$ + ":[" + $dataset$ + "]}}"
$MQTT_ComputeJsonChangeTags$ = $json$
ELSE
$MQTT_ComputeJsonChangeTags$ = ""
ENDIF
ENDFN
//============================================================================
// LOG FUNCTION
//============================================================================
FUNCTION Log($Msg$)
LOGEVENT "[Magic Builder MQTT] " + $Msg$, 100
PRINT "[Magic Builder] " + $Msg$
ENDFN
//============================================================================
// CA CERTIFICATE FOR MAGIC BUILDER (ISRG Root X1 - Let's Encrypt)
//============================================================================
FUNCTION Generate_CA_Certificate()
$CACRT$ = "-----BEGIN CERTIFICATE-----" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=" + CHR$(13) + CHR$(10)
$CACRT$ = $CACRT$ +"-----END CERTIFICATE-----"
OPEN "file:/usr/MagicBuilderCA.crt" FOR BINARY OUTPUT AS 1
PUT 1, $CACRT$
CLOSE 1
ENDFN
//============================================================================
// MAIN PROCESS - Timer based publishing
//============================================================================
MqttProcess:
TSET 4,0
@MQTT_CheckConnection()
TimeSecTemp% = GETSYS PRG, "TIMESEC"
// Publish ALL Tags according to group timers
IF TimeSecTemp% - FullPushLastTimeSec_GroupA% >= CONF_FullPushTime_GroupA% THEN
FullPushLastTimeSec_GroupA% = TimeSecTemp%
TempGroupsToPush_All$ = TempGroupsToPush_All$ + "A"
ENDIF
IF TimeSecTemp% - FullPushLastTimeSec_GroupB% >= CONF_FullPushTime_GroupB% THEN
FullPushLastTimeSec_GroupB% = TimeSecTemp%
TempGroupsToPush_All$ = TempGroupsToPush_All$ + "B"
ENDIF
IF TimeSecTemp% - FullPushLastTimeSec_GroupC% >= CONF_FullPushTime_GroupC% THEN
FullPushLastTimeSec_GroupC% = TimeSecTemp%
TempGroupsToPush_All$ = TempGroupsToPush_All$ + "C"
ENDIF
IF TimeSecTemp% - FullPushLastTimeSec_GroupD% >= CONF_FullPushTime_GroupD% THEN
FullPushLastTimeSec_GroupD% = TimeSecTemp%
TempGroupsToPush_All$ = TempGroupsToPush_All$ + "D"
ENDIF
IF TempGroupsToPush_All$ <> "" THEN
@MQTT_Publish(@MQTT_ComputeJsonAllTags$(TempGroupsToPush_All$))
PRINT "[Magic Builder] Full push for Group(s) " + TempGroupsToPush_All$
TempGroupsToPush_All$ = ""
ENDIF
// Publish Tags that have changed according to group timers
IF TimeSecTemp% - ChangePushLastTimeSec_GroupA% >= CONF_ChangePushTime_GroupA% THEN
ChangePushLastTimeSec_GroupA% = TimeSecTemp%
TempGroupsToPush_OnChange$ = TempGroupsToPush_OnChange$ + "A"
ENDIF
IF TimeSecTemp% - ChangePushLastTimeSec_GroupB% >= CONF_ChangePushTime_GroupB% THEN
ChangePushLastTimeSec_GroupB% = TimeSecTemp%
TempGroupsToPush_OnChange$ = TempGroupsToPush_OnChange$ + "B"
ENDIF
IF TimeSecTemp% - ChangePushLastTimeSec_GroupC% >= CONF_ChangePushTime_GroupC% THEN
ChangePushLastTimeSec_GroupC% = TimeSecTemp%
TempGroupsToPush_OnChange$ = TempGroupsToPush_OnChange$ + "C"
ENDIF
IF TimeSecTemp% - ChangePushLastTimeSec_GroupD% >= CONF_ChangePushTime_GroupD% THEN
ChangePushLastTimeSec_GroupD% = TimeSecTemp%
TempGroupsToPush_OnChange$ = TempGroupsToPush_OnChange$ + "D"
ENDIF
IF TempGroupsToPush_OnChange$ <> "" THEN
Json$ = @MQTT_ComputeJsonChangeTags$(TempGroupsToPush_OnChange$)
IF Json$ <> "" THEN
@MQTT_Publish(Json$)
PRINT "[Magic Builder] OnChange push for Group(s) " + TempGroupsToPush_OnChange$
ENDIF
TempGroupsToPush_OnChange$ = ""
ENDIF
TSET 4, MQTTProcess_CycleTime%
END
Rem --- eWON user (end)
End
Rem --- eWON end section: Init Section

Le script démarre automatiquement au redémarrage de l'Ewon.
Configuration optionnelle des groupes
Vous pouvez ajuster les intervalles d'envoi pour chaque groupe. Les valeurs sont en secondes :
| Paramètre | Description | Valeur par défaut |
|---|---|---|
CONF_GROUPA$ | Activer le groupe A ("1" = actif, "0" = inactif) | "1" |
CONF_FullPushTime_GroupA$ | Intervalle d'envoi complet (toutes les valeurs) | "300" (5 min) |
CONF_ChangePushTime_GroupA$ | Intervalle d'envoi sur changement | "5" (5 sec) |
Les mêmes paramètres existent pour les groupes B, C et D.
