[Plugin Tiers] Plugin Huawei4G

Bonjour,

je lance le dev d’un plugin (tag à venir) pour pouvoir récupérer les informations des routeurs 4G Huawei. Il y a un nombre important d’infos récupérables. Dans l’idée de sortir le plugin plus rapidement, quels seraient les informations « basique » que vous voudriez voir en priorité ?

Merci pour votre aide !

Salut Tux1c0,
Je suis assez intéressé par ce sujet.
Dans les informations à récupérer :

  • info : statut de la connexion
  • info : statistiques d’upload / download / durée
  • info : nombre de sms inbox / outbox
  • action : purge de l’inbox
  • action : purge de l’outbox
  • action : envoi de sms (lien avec le plugin sms peut être ?)
  • info : réception de sms

J’ai également commencé à regarder le sujet de mon côté.
Si tu veux, on peut faire cela ensemble, on peut se contacter par mp.
Bonne journée
Caelion

Hello,

Je trouve l’idée très bonne, malheureusement pour moi j’ai un routeur 4g netgear (mr1100), j’aurai bien aimé egalement récupérer ces infos.

Salut Caelion,

je suis preneur d’aide. J’ai déjà bien avancé le plugin qui est stable maintenant.
Il faut rajouter des fonctions principalement, tout le moteur étant terminé.
Il est dispo en beta v3 et v4 dans le market.

Voici un screenshot.
4g

Salut Tux1c0,

T’as bien bossé :).
Installé sur l’une de mes bases de tests, pas de soucis.
J’ai pas réussi à trouver comment tu prenais les données sur le huawei, c’est la dépendance qu’il faut installer qui s’en charge ?
Sur les données, je m’interroge sur la pertinence des Rate (Download et Upload) car ce sont des instantanées qui peuvent varier du simple à des chiffres énormes : pas certain qu’ils soient utile.

Pour t’aider, voici ce que j’avais fait de mon côté (je n’ai récupéré que les informations qui pouvaient m’intéresser à première vue dans les API que j’ai déniché sur internet) :

  • Visuel rapide pour que tu vois les infos qu’il y a :
    image
  • 1 script pour les appels API d’information
#!/bin/sh

extract_from_xml() {
    reponse=`echo "$1" | sed -n "s/.*<$2>\\([^<]\\+\\)<.*$/\\1/p"`
}

convertsecs() {
	j=$(( $1/86400))
    h=$(( ($1%86400)/3600 ))
	m=$(( ($1%3600)/60 ))
	s=$(( $1%60))
    reponse2="${j} jours ${h}h ${m}min ${s}sec"
}

if [ "$1" = "SMS_Statistiques" ]
then
	content=$(wget http://192.168.1.1/api/sms/sms-count -q -O -)
	if [ "$2" = "Inbox" ]
	then
		extract_from_xml "$content" "LocalInbox"
        echo $reponse
		exit 0
	elif [ "$2" = "Outbox" ]
	then
		extract_from_xml "$content" "LocalOutbox"
        echo $reponse
		exit 0
	elif [ "$2" = "Unread" ]
	then
		extract_from_xml "$content" "LocalUnread"
        echo $reponse
		exit 0
	fi
elif [ "$1" = "Data_Statistiques_Mensuelles" ]
then
	content=$(wget http://192.168.1.1/api/monitoring/month_statistics -q -O -)
	if [ "$2" = "Download" ]
	then
		extract_from_xml "$content" "CurrentMonthDownload"
        echo $(( $reponse/1024/1024))
		exit 0
	elif [ "$2" = "Upload" ]
	then
		extract_from_xml "$content" "CurrentMonthUpload"
        echo $(( $reponse/1024/1024 ))
		exit 0
	elif [ "$2" = "Durée" ]
	then
		extract_from_xml "$content" "MonthDuration"
        convertsecs $reponse
        echo $reponse2
		exit 0
	fi
elif [ "$1" = "Data_Statistiques" ]
then
	content=$(wget http://192.168.1.1/api/monitoring/traffic-statistics -q -O -)
	if [ "$2" = "Download" ]
	then
		extract_from_xml "$content" "TotalDownload"
        echo $(( $reponse/1024/1024/1024))
		exit 0
	elif [ "$2" = "Upload" ]
	then
		extract_from_xml "$content" "TotalUpload"
        echo $(( $reponse/1024/1024/1024 ))
		exit 0
	elif [ "$2" = "Durée" ]
	then
		extract_from_xml "$content" "TotalConnectTime"
        convertsecs $reponse
        echo $reponse2
		exit 0
	elif [ "$2" = "DownloadRate" ]
	then
		extract_from_xml "$content" "CurrentDownloadRate"
        echo $reponse
		exit 0
	elif [ "$2" = "UploadRate" ]
	then
		extract_from_xml "$content" "CurrentUploadRate"
        echo $reponse
		exit 0
	fi
fi

Il suffit alors d’appeler les commandes ainsi :

  • 1 script pour les SMS (merci Oga83 - forum Routeur4G) :
#!/bin/sh
# Written by oga83

# Check command line parameters
if [ "$#" -ne 5 ]; then
    printf "Syntax: %s <IP> <Username> <Password> <PhoneNumber> <Message>\n" $0
    exit 0
fi

ROUTER_IP=$1
ROUTER_USERNAME=$2
ROUTER_PASSWORD=$3
SMS_NUMBER=$4
SMS_TEXT=$5
TMP_HEADER_FILE=/tmp/headers.tmp

CURL_OPT=--silent

ProcessRouterResponseHeader()
{
	# Get token from header
	NEWTOKEN=`cat $TMP_HEADER_FILE | grep "__RequestVerificationTokenone: " | awk -F' ' '{print $2}'`
	if [ ! -z "$NEWTOKEN" ]; then TOKEN=$NEWTOKEN; fi
	NEWTOKEN=`cat $TMP_HEADER_FILE | grep "__RequestVerificationToken: " | awk -F' ' '{print $2}'`
	if [ ! -z "$NEWTOKEN" ]; then TOKEN=$NEWTOKEN; fi
	NEWSESSIONID=`cat $TMP_HEADER_FILE | grep "Set-Cookie: SessionID=" | awk -F' ' '{print $2}' | cut -b 1-138`
	if [ ! -z "$NEWSESSIONID" ]; then SESSIONID=$NEWSESSIONID; fi
echo $NEWTOKEN
}

GetRouterData() # Param1: Relative URL
{
	#echo "GET on http://$ROUTER_IP$1"
	RESPONSE=`curl $CURL_OPT --request GET http://$ROUTER_IP$1 \
       		--dump-header $TMP_HEADER_FILE \
        	-H "Cookie: $SESSIONID" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
       		`
	ProcessRouterResponseHeader
}

GetSessionToken() # No parameters
{
	# Get SessionID and RequestVerificationToken
	GetRouterData '/api/webserver/SesTokInfo'
        SESSIONID="SessionID="`echo "$RESPONSE"| grep -oPm1 "(?<=<SesInfo>)[^<]+"`
        TOKEN=`echo "$RESPONSE"| grep -oPm1 "(?<=<TokInfo>)[^<]+"`
}

PostRouterData() # Param1: RelativeUrl, Param2: Data, Param3:bAskNewToken
{
	# Get new token if necessary
	if [ ! -z $3 ]; then
		GetSessionToken
	fi

	#echo "POST on http://$ROUTER_IP$1 :" $2
	RESPONSE=`curl $CURL_OPT --request POST http://$ROUTER_IP$1 \
	       --dump-header $TMP_HEADER_FILE \
	       -H "Cookie: $SESSIONID" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
	       --data "$2"`
	ProcessRouterResponseHeader
}

# Get initial SessionID and RequestVerificationToken
GetSessionToken

# Login
CREDENTIALS=`printf $ROUTER_PASSWORD | sha256sum | head -c64 | base64 -w0`
CREDENTIALS=`printf "%s%s%s" $ROUTER_USERNAME $CREDENTIALS $TOKEN | sha256sum | head -c64 | base64 -w0`
DATA=`printf "<request><Username>%s</Username><Password>%s</Password><password_type>4</password_type></request>" $ROUTER_USERNAME $CREDENTIALS`
PostRouterData "/api/user/login" "$DATA"

# Send SMS
DATA="<?xml version='1.0' encoding='UTF-8'?><request><Index>-1</Index><Phones><Phone>$SMS_NUMBER</Phone></Phones><Sca></Sca><Content>$SMS_TEXT</Content><Length>${#SMS_TEXT}</Length><Reserved>1</Reserved><Date>`date +'%F %T'`</Date></request>"
PostRouterData "/api/sms/send-sms" "$DATA" 1

# Logout
PostRouterData "/api/user/logout" "<request><Logout>1</Logout></request>"

Qui s’exécute ainsi :


Remplacer mdp par le mdp de votre routeur (sans guillemets) et tel par votre numéro de téléphone (sans guillemets).
En principe, l’identifiant est admin pour tous

Cette commande est appelée par le plugin notification manager et fonctionne nickel !

Souhaites-tu des explications sur les scripts ?

Bien à toi
Caelion

Il y a 2 manières de récupérer les données
1/ Via Guzzle pour tout ce qui est sans authentification (mode php)
2/ Via une dépendance d’une librairie python pour le reste. Le but serait de supprimer cette dépendance et tout passer en PHP mais pour le moment ça ne fonctionne pas.

Les scripts sont clairs mais j’ai déjà tout fourni dans la lib python. Il n’y qu’à faire les appels et traiter le retour. Le code est sur github.

Quel est le modèle de ton routeur ? Ca me permettra de l’ajouter aux modèles supportés dans la doc si tout fonctionne bien.

Y’aurait moyen tu penses de ‹ dériver › cela sur des autres marques si on te fournit ce qu’il manque ?

Si je prends l’exemple de mon NETGEAR MR1100, ça doit revenir au fond au même type de phase : une authentification, une page web sur laquelle on récupère les infos.

Je pense que le principe est le même.amis je me trompe peut être.

En tout cas si c’est possible, je peux t’envoyer des captures de paquets TCP que je fais avec packet capture quand je lance l’application mobile qui récupère les infos du modem. A moins qu’il fasse le faire directement via chrome.

Dis moi si c’est jouable de voir cela.

Merci.

Huawei fournit des API pour la récupération de données. Si netgear en fournit, il y a sûrement une possibilité d’adapter un peu le code. Si c’est de la page web en mode HTML, ça ne va pas le faire. Mon code traite de la données XML/JSON.
Il existe peut être des projets sur github qui font ça, ça pourrait être une première étape.

Hello,

Très intéressé par l’envoi / réception de SMS également.
Ca serait vraiment top !

@tux1c0
Je viens d’installer le plugin en version stable mais j’ai une erreur 500 lors de la sauvegarde de l’équipement et ce message dans les logs :
Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144

Une idée de ce que j’ai pu faire comme bêtise ?

Hello

quelle version de debian as-tu, idem pour jeedom ?
Peux-tu mettre le plugin en debug et me donner le log généré stp ?
Comme ça je dirais que le routeur ne renvoie rien, causant cette erreur.

Il s’agit d’une Debian 9.
Je ne sais pas si ça joue mais le routeur n’est pas sur le même sous réseau que Jeedom (192.168.8.x au lieu de 192.168.1.x)

Voilà les logs debug, j’ai viré des morceaux des tokinfo au cas où ça peut être problématique en terme de confidentialité.

[2020-03-12 16:32:03][DEBUG] : tableau from JSON: Array
[2020-03-12 16:32:03][DEBUG] : Body to convert: <?xml version="1.0" encoding="UTF-8"?><response><TokInfo>sYSSz7m37ln1RXdYnI9lP</TokInfo><SesInfo>y1HcFur1wBhmXYthZztAhSXkahMN0qJ2wTeuo4ONzwX0dKGJ09Je0JJKPAXkCpmUVd6k0L0lb6rrwqh0J7OuLkr2nGnCqHg3zDgef</SesInfo></response>
[2020-03-12 16:32:03][DEBUG] : api/webserver/SesTokInfo, <?xml version="1.0" encoding="UTF-8"?> <response><TokInfo>sYSSz7m37lcyPn1RXdYnI9lP</TokInfo><SesInfo>y1HcFur1wBhmXYthZztAhSXkahMN0qzWBlinLQTeuo4ONzwX0dKGJ09Je0JJKPAXkCpmUVd6k0L0lb6rrwqh0J7OuLkr2nGnCqHg3zDgef</SesInfo></response>
[2020-03-12 16:32:03][DEBUG] : token:sYSSz7m37lcywJFohIUKPn1RXdYnI9lP
[2020-03-12 16:32:03][DEBUG] : session:y1HcFur1wBhmXYtlVYNzWBlinLQTeuo4ONzwX0dKGJ09Je0JJKPAXkCpmUVd6k0L0lb6rrwqh0J7OuLkr2nGnCqHg3zDgef
[2020-03-12 16:32:03][DEBUG] : Body to convert: <?xml version="1.0" encoding="UTF-8"?><response><username></username><password_type>4</password_type><firstlogin>1</firstlogin><history_login_flag>0</history_login_flag><extern_password_type>1</extern_password_type><State>-1</State><userlevel></userlevel></response>
[2020-03-12 16:32:03][DEBUG] : api/user/state-login, <?xml version="1.0" encoding="UTF-8"?> <response><username/><password_type>4</password_type><firstlogin>1</firstlogin><history_login_flag>0</history_login_flag><extern_password_type>1</extern_password_type><State>-1</State><userlevel/></response>
[2020-03-12 16:32:03][DEBUG] : Body to convert: <?xml version="1.0" encoding="UTF-8"?> <response> <CurrentConnectTime>3190</CurrentConnectTime> <CurrentUpload>1490665</CurrentUpload> <CurrentDownload>1284016</CurrentDownload> <CurrentDownloadRate>980</CurrentDownloadRate> <CurrentUploadRate>1232</CurrentUploadRate> <TotalUpload>246766534907</TotalUpload> <TotalDownload>229220637384</TotalDownload> <TotalConnectTime>16422961</TotalConnectTime> <showtraffic>1</showtraffic> </response>
[2020-03-12 16:32:03][DEBUG] : api/monitoring/traffic-statistics, <?xml version="1.0" encoding="UTF-8"?> <response> <CurrentConnectTime>3190</CurrentConnectTime> <CurrentUpload>1490665</CurrentUpload> <CurrentDownload>1284016</CurrentDownload> <CurrentDownloadRate>980</CurrentDownloadRate> <CurrentUploadRate>1232</CurrentUploadRate> <TotalUpload>246766534907</TotalUpload> <TotalDownload>229220637384</TotalDownload> <TotalConnectTime>16422961</TotalConnectTime> <showtraffic>1</showtraffic> </response>
[2020-03-12 16:32:03][DEBUG] : key:CurrentConnectTime value:3190
[2020-03-12 16:32:03][DEBUG] : key:CurrentUpload value:1490665
[2020-03-12 16:32:03][DEBUG] : key:CurrentDownload value:1284016
[2020-03-12 16:32:03][DEBUG] : key:CurrentDownloadRate value:980
[2020-03-12 16:32:03][DEBUG] : key:CurrentUploadRate value:1232
[2020-03-12 16:32:03][DEBUG] : key:TotalUpload value:246766534907
[2020-03-12 16:32:03][DEBUG] : key:TotalDownload value:229220637384
[2020-03-12 16:32:03][DEBUG] : key:TotalConnectTime value:16422961
[2020-03-12 16:32:03][DEBUG] : key:showtraffic value:1
[2020-03-12 16:32:03][DEBUG] : Body to convert: <?xml version="1.0" encoding="UTF-8"?> <response> <State>0</State> <FullName>Free</FullName> <ShortName>Free</ShortName> <Numeric>20815</Numeric> <Rat>7</Rat> <Spn></Spn> </response>
[2020-03-12 16:32:03][DEBUG] : api/net/current-plmn, <?xml version="1.0" encoding="UTF-8"?> <response> <State>0</State> <FullName>Free</FullName> <ShortName>Free</ShortName> <Numeric>20815</Numeric> <Rat>7</Rat> <Spn/> </response>
[2020-03-12 16:32:03][DEBUG] : key:State value:0
[2020-03-12 16:32:03][DEBUG] : key:FullName value:Free
[2020-03-12 16:32:03][DEBUG] : key:ShortName value:Free
[2020-03-12 16:32:03][DEBUG] : key:Numeric value:20815
[2020-03-12 16:32:03][DEBUG] : key:Rat value:7
[2020-03-12 16:32:03][DEBUG] : key:Spn value:Array
[2020-03-12 16:32:03][DEBUG] : Body to convert: <?xml version="1.0" encoding="UTF-8"?> <response> <productfamily>LTE</productfamily> <classify>cpe</classify> <multimode>0</multimode> <restore_default_status>0</restore_default_status> <sim_save_pin_enable>0</sim_save_pin_enable> <devicename>B525s-65a</devicename> <SoftwareVersion>11.170.61.00.07</SoftwareVersion> <WebUIVersion>21.100.34.00.03</WebUIVersion> <NPFlag>NoUpdate Wi-Fi</NPFlag> </response>
[2020-03-12 16:32:03][DEBUG] : api/device/basic_information, <?xml version="1.0" encoding="UTF-8"?> <response> <productfamily>LTE</productfamily> <classify>cpe</classify> <multimode>0</multimode> <restore_default_status>0</restore_default_status> <sim_save_pin_enable>0</sim_save_pin_enable> <devicename>B525s-65a</devicename> <SoftwareVersion>11.170.61.00.07</SoftwareVersion> <WebUIVersion>21.100.34.00.03</WebUIVersion> <NPFlag>NoUpdate Wi-Fi</NPFlag> </response>
[2020-03-12 16:32:03][DEBUG] : key:productfamily value:LTE
[2020-03-12 16:32:03][DEBUG] : key:classify value:cpe
[2020-03-12 16:32:03][DEBUG] : key:multimode value:0
[2020-03-12 16:32:03][DEBUG] : key:restore_default_status value:0
[2020-03-12 16:32:03][DEBUG] : key:sim_save_pin_enable value:0
[2020-03-12 16:32:03][DEBUG] : key:devicename value:B525s-65a
[2020-03-12 16:32:03][DEBUG] : key:SoftwareVersion value:11.170.61.00.07
[2020-03-12 16:32:03][DEBUG] : key:WebUIVersion value:21.100.34.00.03
[2020-03-12 16:32:03][DEBUG] : key:NPFlag value:NoUpdate Wi-Fi

non ça ne joue pas le subnet. C’est pareil chez moi :wink:

Les infos sont récupérées et traitées, sauf les parties en python.
Il n’y a pas plus de logs après ?

Dans le log jeedom http.error, il doit y avoir des infos sur l’erreur 500.

Plus de logs après. Voici les logs http.error :

[Thu Mar 12 16:32:04.234719 2020] [:error] [pid 30479] [client 10.9.0.1:54808] PHP Fatal error:  Uncaught TypeError: Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144 and defined in /var/www/html/plugins/huawei4g/core/class/router.class.php:86
Stack trace:
#0 /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php(144): array_key_first(NULL)
#1 /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php(114): huawei4g->setInfo(NULL)
#2 /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php(630): huawei4g->getRouteurInfo()
#3 /var/www/html/core/class/cmd.class.php(994): huawei4gCmd->execute(NULL)
#4 /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php(602): cmd->execCmd()
#5 /var/www/html/core/class/DB.class.php(195): huawei4g->postUpdate()
#6 /var/www/html/core/class/eqLogic.class.php(981): DB::save(Object(huawei4g), false)
#7 /var/www/html/core/ajax/eqLogic.ajax.php(343): eqLogic->save()
#8 {main}
thrown in /var/www/html/plugins/huawei4g/core/class/router.class.php on line 86, referer: https://jeemaster.dns1.jeedom.com/index.php?v=d&m=huawei4g&p=huawei4g&id=1006&saveSuccessFull=1


Hello je voulais confirmer le fonctionnement sur le B528s-23a

image

Bonjour,
c’est une très bonne idée,
je viens de tester et j’ai l’errreur suivante
500 : Internal Server Error
Nom de l’appareil : B528s-23a

merci pour ton aide

Hello @djo28, @DidierJ

pouvez-vous me donner le log d’installation des dépendances svp ?
D’après le log d’exécution, la partie python du plugin ne renvoie rien en info.

merci

Hello,

Et voilà :

********************************************************
*             Installation des dépendances             *
********************************************************
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:2 http://ftp.fr.debian.org/debian stretch InRelease
Get:3 http://ftp.fr.debian.org/debian stretch-updates InRelease [91.0 kB]
Hit:4 https://repo.mosquitto.org/debian stretch InRelease
Hit:5 http://ftp.fr.debian.org/debian stretch Release
Hit:6 http://repo.zabbix.com/zabbix/3.4/debian stretch InRelease
Err:4 https://repo.mosquitto.org/debian stretch InRelease
The following signatures were invalid: EXPKEYSIG 61611AE430993623 Mosquitto Apt Repository <repo@mosquitto.org>
Fetched 185 kB in 0s (209 kB/s)
Reading package lists...
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://repo.mosquitto.org/debian stretch InRelease: The following signatures were invalid: EXPKEYSIG 61611AE430993623 Mosquitto Apt Repository <repo@mosquitto.org>
W: Failed to fetch https://repo.mosquitto.org/debian/dists/stretch/InRelease  The following signatures were invalid: EXPKEYSIG 61611AE430993623 Mosquitto Apt Repository <repo@mosquitto.org>
W: Some index files failed to download. They have been ignored, or old ones used instead.
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package php-guzzlehttp
Reading package lists...
Building dependency tree...
Reading state information...
python3-pip is already the newest version (9.0.1-2+deb9u1).
The following packages were automatically installed and are no longer required:
liba52-0.7.4 libaa1 libdca0 libdirectfb-1.2-9 libdv4 libenca0 libfaad2
libgif7 liblirc-client0 libmpeg2-4 libsdl1.2debian libvorbisidec1 libxvmc1
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 83 not upgraded.
Reading package lists...
Building dependency tree...
Reading state information...
python3-setuptools is already the newest version (33.1.1-1).
The following packages were automatically installed and are no longer required:
liba52-0.7.4 libaa1 libdca0 libdirectfb-1.2-9 libdv4 libenca0 libfaad2
libgif7 liblirc-client0 libmpeg2-4 libsdl1.2debian libvorbisidec1 libxvmc1
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 83 not upgraded.
Collecting typing
Downloading typing-3.7.4.1-py3-none-any.whl (25 kB)
Installing collected packages: typing
Successfully installed typing-3.7.4.1
Collecting huawei-lte-api
Downloading huawei-lte-api-1.4.10.tar.gz (22 kB)
Requirement already satisfied: requests in /usr/local/lib/python3.5/dist-packages (from huawei-lte-api) (2.22.0)
Collecting dicttoxml
Downloading dicttoxml-1.7.4.tar.gz (18 kB)
Collecting xmltodict
Downloading xmltodict-0.12.0-py2.py3-none-any.whl (9.2 kB)
Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.5/dist-packages (from requests->huawei-lte-api) (2.8)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.5/dist-packages (from requests->huawei-lte-api) (2019.11.28)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.5/dist-packages (from requests->huawei-lte-api) (1.25.8)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.5/dist-packages (from requests->huawei-lte-api) (3.0.4)
Building wheels for collected packages: huawei-lte-api, dicttoxml
Building wheel for huawei-lte-api (setup.py): started
Building wheel for huawei-lte-api (setup.py): finished with status 'done'
Created wheel for huawei-lte-api: filename=huawei_lte_api-1.4.10-py3-none-any.whl size=43982 sha256=c5ec6a5a1a50121c44d65d2a0b14a086eff86e57ded0b93830a0db494432f42b
Stored in directory: /root/.cache/pip/wheels/15/97/95/cdc26e332f7fb1aa2b4029ec3f93577176284ad6436ce46feb
Building wheel for dicttoxml (setup.py): started
Building wheel for dicttoxml (setup.py): finished with status 'done'
Created wheel for dicttoxml: filename=dicttoxml-1.7.4-py3-none-any.whl size=19958 sha256=1cddedc3d8954d9710e23c2d8e68efb2e699ddb62d90004aa30f14505103648b
Stored in directory: /root/.cache/pip/wheels/7a/02/97/253e53429d65969b96a0188c369de085ad0cf1369cb81d928f
Successfully built huawei-lte-api dicttoxml
Installing collected packages: dicttoxml, xmltodict, huawei-lte-api
Successfully installed dicttoxml-1.7.4 huawei-lte-api-1.4.10 xmltodict-0.12.0
********************************************************
*             Installation terminée                    *
********************************************************
[2020-03-14 08:06:06][INFO] : Début d'activation du plugin
[2020-03-14 08:06:07][INFO] : Info sur le démon : {"launchable_message":"","launchable":"nok","state":"nok","log":"nok","auto":0}
[2020-03-14 08:09:39][INFO] : Début d'activation du plugin
[2020-03-14 08:09:40][INFO] : Info sur le démon : {"launchable_message":"","launchable":"nok","state":"nok","log":"nok","auto":0}
[2020-03-14 08:15:04][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 08:30:04][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 08:45:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 09:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 09:15:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 09:30:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 09:45:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 10:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 10:15:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 10:30:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 10:45:04][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 11:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 11:15:07][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 11:30:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 11:45:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 12:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 12:15:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 12:30:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 12:45:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 13:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 13:15:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 13:30:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 13:45:05][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 14:00:06][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1 passed to array_key_first() must be of the type array, null given, called in /var/www/html/plugins/huawei4g/core/class/huawei4g.class.php on line 144
[2020-03-14 14:15:04][ERROR] : Erreur sur la fonction cron15 du plugin : Argument 1

Bonjour,
Il se trouve ou ?