Plugin wiser link pour EER31600 incompatible avec le nouveau module IP (EER31800)

Bonjour,

Je viens de faire l’acquisition d’un module IP EER31800 pour remontées via IP des données de compteurs d’énergie wiser EM5.

Je débute sous jeedom, j’ai installé l’image officiel sur Raspberry Pi, commencé la configuration et acheter le plugin wiser pour communiquer avec mon installation.

Comme évoqué sur l’ancien forum et sur ce post Remontées d'informations sur Jeedom depuis un WiserLink 31800
le plugin est compatible avec le module EER31600, mais plus avec la nouvelle version du module IP EER31800.

Par ailleurs, l’installation et la communication avec l’application officielle Schneider wiser energy marche sans aucun problème.

J’ai mené mon enquête (documentée dans le post ci dessus) et découvert que le nouveau module (désormais pourvu du bluetooth pour l’appairage) avait changé d’API. Après avoir dé-compilé l’apk de l’application, j’ai réussi a identifié le nouveau mode d’authentification et les nouvelles routes de l’API.

Précédemment, l’authentification se faisait au moyen d’un login mot de passe admin: admin.
Maintenant, l’application utilise l’adresse Mac du module et une clef (écrite en dur dans les sources de l’application) pour générer un mot de passe. Je ne suis pas développeur java (encore moins php), mais la génération du mot de passe était assez facile et ne devrait pas poser de problème en PHP.

J’ai développé un script python qui démontre la génération de clef et la connexion au module.

Etant nouveau dans la communauté, je ne sais pas trop vers qui m’adresser avec ces informations. Je ne suis pas en mesure de développer en PHP, mais avec le script python, l’exercice devrait être assez simple.

Merci d’avance pour votre aide,

Pascal

my_char = "PzLaM2ZqOx5Ks3NwIcJ1Sd6NeUvH7WfBrY9AbGgVtTnGhVyTmG8EjVu0TkFi4QClRoDpX"
mac_addr = '00:80:F4:C9:B2:A1'
replaceAll = mac_addr.replace(':', '')


def generatePasswd(str1=replaceAll, i=len(replaceAll), str2=my_char):

    str3 = str1

    i2 = i
    str4 = str2
    cArr = ['']*12  # 12 elements

    if str3 != '':

        i3 = 6
        if i2 >= 6:
            substring = str3[-6:]
            i4 = 0
            while (i4 < i2) & (i4 < i3):

                hexToInt = int(f"0x{substring[i4]}",0)
                i5 = 15 - (hexToInt % 15)
                d2 = float(hexToInt)
                i6 = i4
                d3 = float(i5)

                round_ = int(
                    round(d3 ** 3.0) * 8 +
                    round(d3 ** 2.0) * 3 +
                    (i5 * 5)) % (len(str2) + 1)


                i7 = i6 * 2
                idx = int(round(d2 ** 3.0) * 6 +
                          round(d2 ** 2.0) * 9 +
                          (hexToInt * 7) )% (len(str2) + 1)


                cArr[i7] = str4[idx]
                cArr[i7 + 1] = str4[round_]
                i4 = i6 + 1
                i3 = 6
    return ''.join(cArr)

if __name__ == '__main__':

    import requests


    key = generatePasswd()

    r = requests.get('https://192.168.1.13/rsa1/MeterInstantData', verify=False, auth=('m2madmin', key))
    r.json()


paths =   {
     "DELETE_INSTANCE_MIO_INPUT" : "/rsa1/MioInput;channel=",
     "DELETE_INSTANCE_MIO_OUTPUT" : "/rsa1/MioOutput;channel=",
     "DELETE_INSTANCE_MPR" : "/rsa1/MprEndpoint;channel=",
     "DELETE_WIRELESS_INPUT" : "/rsa1/MioWirelessInput;slaveId=%d;channel=%d",
     "DELETE_WIRELESS_METER" : "/rsa1/WirelessMeter;deviceAddress=",
     "DELETE_WIRELESS_OUTPUT" : "/rsa1/MioWirelessOutput;slaveId=%d;channel=%d",
     "DELETE_WIRELESS_PRO" : "/rsa1/WirelessProChannel;deviceAddress=",
     "DELETE_WIRELESS_SENSOR" : "/rsa1/WirelessSensor;deviceAddress=",
     "GET_BRANCH_METERS" : "/rsa1/BranchMeters",
     "GET_CONNECTION_STATISTICS" : "/rsa1/WiserConnectionStatistics",
     "GET_CONTROLLER" : "/rsa1/Controller",
     "GET_EP_CONFIG_UPDATE_STATUS" : "/rsa1/EpConfigUpdateStatus ",
     "GET_GATEWAY_KEY" : "/rsa1/GateWayKey",
     "GET_INSTANCES_MPR" : "/rsa1/MprEndpoint/instances",
     "GET_INSTANCE_MIO_INPUT" : "/rsa1/MioInput/instances",
     "GET_INSTANCE_MIO_OUTPUT" : "/rsa1/MioOutput/instances",
     "GET_MEASUREMENT_DATA" : "/rsa1/MeasurementData;sId=%d;ch=%d",
     "GET_METER_CUMULATED_DATA" : "/rsa1/MeterCumulatedData",
     "GET_METER_INSTANT_DATA" : "/rsa1/MeterInstantData",
     "GET_PRODUCT_DETAILS" : "/rsa1/ProductDetails",
     "GET_PRODUCT_INTERFACE" : "/fct/ProductInterface",
     "GET_SYSTEM_UPGRADE_STATUS" : "/rsa1/SystemUpgradeStatus",
     "GET_USAGE_METERS" : "/rsa1/UsageMeters",
     "GET_USER_PREPAIRING" : "/rsa1/UserPreparing",
     "GET_WIRELESS_DIAGNOSTIC" : "/rsa1/WirelessDiagnostic",
     "GET_WIRELESS_INPUT" : "/rsa1/MioWirelessInput;slaveId=%d;channel=%d",
     "GET_WIRELESS_INPUTS" : "/rsa1/MioWirelessInput/instances",
     "GET_WIRELESS_METER" : "/rsa1/WirelessMeter;deviceAddress=",
     "GET_WIRELESS_METERS" : "/rsa1/WirelessMeter/instances",
     "GET_WIRELESS_METERS_LITE" : "/rsa1/WirelessMeterList/instances",
     "GET_WIRELESS_METER_LITE" : "/rsa1/WirelessMeterInfo;dA=",
     "GET_WIRELESS_OUTPUT" : "/rsa1/MioWirelessOutput;slaveId=%d;channel=%d",
     "GET_WIRELESS_OUTPUTS" : "/rsa1/MioWirelessOutput/instances",
     "GET_WIRELESS_PRO_LIST" : "/rsa1/WirelessProChannel/instances",
     "GET_WIRELESS_PRO_LITE" : "/rsa1/WirelessProInfo;dA=",
     "GET_WIRELESS_SENSOR" : "/rsa1/WirelessSensor;deviceAddress=",
     "GET_WIRELESS_SENSORS" : "/rsa1/WirelessSensor/instances",
     "GET_WIRELESS_SENSOR_LITE" : "/rsa1/WirelessSensorInfo;dA=",
     "GET_WIRELESS_SENSOR_TEMPERATURE" : "/rsa1/TemperatureInfo;sId=",
     "POST_BLINK_DEVICE" : "/rsa1/WirelessManager/methods/blinkDevice",
     "POST_BUSINESS_INFO" : "/api/v1/fesb/provision",
     "POST_EVE_METER" : "/rsa1/LoadStatus/methods/SetStandbyThreshold",
     "POST_FIRMWARE_UPLOAD" : "/FirmwareUpload",
     "POST_INIT_SYSTEM_UPGRADE" : "/rsa1/Controller/methods/initSystemUpgrade",
     "POST_INSTANCE_MIO_CONTROL" : "/rsa1/Controller/methods/operateMio",
     "POST_INSTANCE_MIO_INPUT" : "/rsa1/MioInput/instances",
     "POST_INSTANCE_MIO_OUTPUT" : "/rsa1/MioOutput/instances",
     "POST_INSTANCE_MPR" : "/rsa1/MprEndpoint/instances",
     "POST_STATUS" : "/rsa1/LoadStatus/methods/GetStatus",
     "PUT_BRANCH_METERS" : "/rsa1/BranchMeters",
     "PUT_INSTANCE_MIO_INPUT" : "/rsa1/MioInput;channel=",
     "PUT_INSTANCE_MIO_OUTPUT" : "/rsa1/MioOutput;channel=",
     "PUT_INSTANCE_MPR" : "/rsa1/MprEndpoint;channel=",
     "PUT_USER_PREPAIRING" : "/rsa1/UserPreparing",
     "PUT_WIRELESS_CHANNEL" : "/rsa1/WirelessManager",
     "PUT_WIRELESS_INPUT" : "/rsa1/MioWirelessInput;slaveId=%d;channel=%d",
     "PUT_WIRELESS_METER" : "/rsa1/WirelessMeter;deviceAddress=",
     "PUT_WIRELESS_OUTPUT" : "/rsa1/MioWirelessOutput;slaveId=%d;channel=%d",
     "PUT_WIRELESS_SENSOR" : "/rsa1/WirelessSensor;deviceAddress=",
     "SEM_IDENTIFICATION" : "/rsa1/SemIdentificationOpt",
     "START_COMISSIONING" : "/rsa1/WirelessManager/methods/startCommissioning",
     "STOP_COMISSIONING" : "/rsa1/WirelessManager/methods/stopCommissioning",
     }

On me suggère de signaler le problème vers toi @Loic.
Quelle est la marche à suivre dans ce genre de cas pour la maintenance des plugins ?

Bonjour,
Malheureusement je ne m’occupe pas ce plugin je ne peux pas t’aider (par contre bravo pour l’analyse). Le plus simple est d’écrire à l’adresse de contact Jeedom (contact[at]jeedom.com)

Bonjour Pascal,

Je viens de m’équiper avec ce module.
Je suis intéressé pour suivre et éventuellement participer à la mise à jour de ce plugin, en fonction de mes moyens.
Et bravo pour ton reverse-engineering sur l’APK Schneider :wink:

Jean-Pierre

Bonjour

J’ai également un ER31800 et je suis intéressée pour aider

Fred

Bonjour
Je suis également équipé sur Wiser energy ip et je suis également intéressé.
J’aimerai optimiser ma production solaire mesurer avec Wiser energy et alimenter des charges selon l’exedent de production.

Bonjour. Potentiellement intéressé par le matos SE si compatible … le projet avance ou c’est mort dans l’œuf ? (@pschetelat)

Bonsoir à tous,
Je reviens aux nouvelles concernant ce plugin pour le EER31800.
Devons nous abandonner le fait d’avoir nos consommations sur Jeedom?
@pschetelat as tu eu des nouvelles de la part du support Jeedom?
@Loic as tu un délais ou des informations à nous apporter ?

Merci d’avance

1 « J'aime »

Bonjour
Comme dit je ne m’occupe pas du plugin je ne peux donc pas répondre. Le plus simple et d’ouvrir un ticket au support jeedom sas

Bonjour,
Je remonte ce sujet quelques années après.
Grace au code de pschetelat j’ai réussi à reproduire en python puis en partie en php le comportement attendu. Je me confronte maintenant à un soucis OpenSsl qui ne se produit qu’en php sur mon wiser link cURL error: error:0D0E20DD:asn1 encoding routines:c2i_ibuf:illegal padding.
Sachant que je n’ai pas mis à jour le firmware comme demandé pendant cette année. Je me demandais si

  1. le soucis était résolu avec cet update
  2. si cet update changeait la clé ou l’algo de génération du password

Est ce que quelqu’un qui aurait fait l’update pourrait me dire ?
Merci d’avance.