Hygrothermographe V2

Forum dédié à l'intégration de la Gateway ZigBee Xiaomi dans DomoticZ.
Pour les questions concernant les objets ZigBee Xiaomi, merci d'utiliser le forum ZigBee au-dessus.
Répondre
cl3f
Messages : 1
Inscription : 06 févr. 2020, 20:42

Hygrothermographe V2

Message par cl3f »

Bonsoir,
Le capteur bluetooth de température et d'humidité de Xiaomi existe désormais dans une autre version plus précise que celle évoquée ici : viewtopic.php?f=26&t=5857
la v2 :
Capture d’écran 2020-02-06 à 21.56.32.png
Capture d’écran 2020-02-06 à 21.56.32.png (76.78 Kio) Consulté 15218 fois
Il apparaît ainsi lors d'un

Code : Tout sélectionner

$ sudo hcitool lescan

Code : Tout sélectionner

AA:BB:CC:DD:EE:FF LYWSD03MMC
La solution pour la v1 ne marche pas pour cette V2 mais un script existe pour récupérer ses informations sous linux (et donc raspbian) : https://github.com/trandbert37/DomoticzMiTemperature2
Il existe également un script dans un fork pour envoyer les informations récoltées par le premier script vers domoticz : https://github.com/JsBergbau/MiTemperature2

Cela fonctionne très bien mais je n'arrive pas à automatiser le lancement de l'update. J'ai tenté un cron mais ça ne fonctionne pas. Je suis débutant dans les crontab, merci de m'indiquer mes erreurs :

Le script lancé manuellement (qui fonctionne) :

Code : Tout sélectionner

$ ./LYWSD03MMC.py -d AA:BB:CC:DD:EE:FF -2p -p2 75 -o2 -4 -p1 33 -o1 -6 -b 5 --callback sendToDomoticz.py
Le cron que j'ai tenté de mettre en place :

Code : Tout sélectionner

*/30 * * * * ./home/pi/scripts/python/MiTemperature2/LYWSD03MMC.py -d AA:BB:CC:DD:EE:FF -2p -p2 75 -o2 -4 -p1 33 -o1 -6 -b 5 --callback /home/pi/domoticz/scripts/python/MiTemperature2/sendToDomoticz.py >dev/null 2>&1
Qu'est-ce qui ne va pas ?
Merci d'avance pour vos réponses.
agourgeon
Messages : 3
Inscription : 19 avr. 2020, 17:57

Re: Hygrothermographe V2

Message par agourgeon »

Bonjour,

J'ai tenté d'associer mes capteurs BT Mijia V2 avec Domoticz, mais je n'y parviens pas.
cl3f, vu que tu as réussi à le faire, peut-être pourras-tu m'éclairer ?
Pour la partie collecte des données de l'appareil, pas de problème, quand je lance le script LYWSD03MMC.py ça me renvoie bien les infos de température et d'humidité.
Par contre, je n'arrive pas à lancer correctement le callback pour pousser les données vers Domoticz.
Je lance la commande :

Code : Tout sélectionner

/usr/bin/python3 /home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/LYWSD03MMC.py -d AA:BB:CC:DD:EE:FF -2p -p2 75 -o2 -4 -p1 33 -o1 -6 -b 5 --callback sendToDomoticz.py
Et j'obtiens ce message :

Code : Tout sélectionner

/home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/sendToDomoticz.py sensorname,temperature,humidity,voltage,humidityCalibrated,timestamp MySensor 20.71 69 3.076 64 1587308350
sh: 1: /home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/sendToDomoticz.py: Permission denied
Data couln't be send to Callback, retrying...
Je n'ai pas touché au script LYWSD03MMC.py, et j'ai renseigne dans le script sendToDomoticz.py l'adresse de mon serveur domoticz ainsi que l'IDX du capteur que j'ai créé dans Domoticz. (j'ai procédé de la même manière que pour les Mijia V1 pour la création des capteurs). J'ai modifié la dernière ligne car je suis en https, j'ai simplement ajouté le "S".
Le script sendToDomoticz est bien situé dans le même répertoire que le script LYWSD03MMC.py.

Voilà, si quelqu'un a une idée. cl3f, si tu peux me dire ce qui cloche dans ma méthode....

Merci

Armand
agourgeon
Messages : 3
Inscription : 19 avr. 2020, 17:57

Re: Hygrothermographe V2

Message par agourgeon »

Et pour te répondre, cl3f, je ne sais pas si on a la même structure de dossiers, mais pour moi ce serait plutôt :

Code : Tout sélectionner

*/30 * * * * ./home/pi/domoticz/scripts/python/MiTemperature2/LYWSD03MMC.py -d AA:BB:CC:DD:EE:FF -2p -p2 75 -o2 -4 -p1 33 -o1 -6 -b 5 --callback /home/pi/domoticz/scripts/python/MiTemperature2/sendToDomoticz.py >dev/null 2>&1
En ajoutant "domoticz" dans le chemin au début.
agourgeon
Messages : 3
Inscription : 19 avr. 2020, 17:57

Re: Hygrothermographe V2

Message par agourgeon »

agourgeon a écrit : 19 avr. 2020, 18:11 Bonjour,

J'ai tenté d'associer mes capteurs BT Mijia V2 avec Domoticz, mais je n'y parviens pas.
cl3f, vu que tu as réussi à le faire, peut-être pourras-tu m'éclairer ?
Pour la partie collecte des données de l'appareil, pas de problème, quand je lance le script LYWSD03MMC.py ça me renvoie bien les infos de température et d'humidité.
Par contre, je n'arrive pas à lancer correctement le callback pour pousser les données vers Domoticz.
Je lance la commande :

Code : Tout sélectionner

/usr/bin/python3 /home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/LYWSD03MMC.py -d AA:BB:CC:DD:EE:FF -2p -p2 75 -o2 -4 -p1 33 -o1 -6 -b 5 --callback sendToDomoticz.py
Et j'obtiens ce message :

Code : Tout sélectionner

/home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/sendToDomoticz.py sensorname,temperature,humidity,voltage,humidityCalibrated,timestamp MySensor 20.71 69 3.076 64 1587308350
sh: 1: /home/pi/domoticz/scripts/python/mijiav2-sensor-domoticz/sendToDomoticz.py: Permission denied
Data couln't be send to Callback, retrying...
Je n'ai pas touché au script LYWSD03MMC.py, et j'ai renseigne dans le script sendToDomoticz.py l'adresse de mon serveur domoticz ainsi que l'IDX du capteur que j'ai créé dans Domoticz. (j'ai procédé de la même manière que pour les Mijia V1 pour la création des capteurs). J'ai modifié la dernière ligne car je suis en https, j'ai simplement ajouté le "S".
Le script sendToDomoticz est bien situé dans le même répertoire que le script LYWSD03MMC.py.

Voilà, si quelqu'un a une idée. cl3f, si tu peux me dire ce qui cloche dans ma méthode....

Merci

Armand
Résolu : tout bête problème de permissions. CHMOD 755 sur le script et tout est OK !

AG
DaX
Messages : 59
Inscription : 07 mars 2020, 16:02
Localisation : Dans ch'nord

Re: Hygrothermographe V2

Message par DaX »

Sympa tout ça. Je suis vraiment nouveau dans le monde de la domo et de Linux. Vous auriez un tuto ou bien quelqu'un pourrait essayer d'en faire un ? Si j'ai les infos, je peux m'y mettre d'ailleurs.
Merci
BernArd
Messages : 99
Inscription : 09 févr. 2020, 13:53
Localisation : Tarn et Garonne
Contact :

Re: Hygrothermographe V2

Message par BernArd »

Bonsoir à Toutes et Tous ;)

Compliqué à mettre en oeuvre ce matériel Xiaomi ?
il y a en ce moment une offre qui peut être intéressante, sur ali... les 4 à 14.65€ est-ce que ça vaut le coup ou pas du tout, vue la galère dans laquelle je m'emmancherai... :o ;)

Merci de vos retours d'expériences ;)

edit1
indication prix sondes
Cordialement :)
BernArd
TG76
Messages : 49
Inscription : 10 nov. 2017, 12:04

Re: Hygrothermographe V2

Message par TG76 »

Bonsoir,

je viens d'avoir mon RPI 4 et mes hygrothermographe V2, j'attends les V1.

Comme vous à la recherche de pouvoir les inclure dans domoticz, je ne connais pas trop le fonctionnement de linux, donc je me jette à l'eau.

Visiblement quelqu'un a reussi à les mettre en place, mais sans plus d'infos que cela. j'ai fait des essais en vain.

je vous laisse le lien

https://www.fanjoe.be/?p=3911

si quelqu'un plus doué que moi arrive à en sortir quelque chose

TG76
Domoticz sur raspberry pi4 + station météo WMR86
Porte auto poulailler par détournement moteur porte de garage
suivi nas synology et onduleur
TG76
Messages : 49
Inscription : 10 nov. 2017, 12:04

Re: Hygrothermographe V2

Message par TG76 »

Bonjour,

Bon a priori, il existe un script qui fonctionne pour V1 et V2, j'ai bossé dessus ce long week-end mais je n'ai pas réussi à les intégrer, pourtant, il semblerait que ca fonctionne a lire les commentaires.

domoticz_mijia_v2.py

Code : Tout sélectionner

import urllib.request
import base64
import time
import btlewrap
from btlewrap.base import BluetoothBackendException
from mijia.mitemp2_bt_poller import MiTemp2BtPoller, \
    MI_HUMIDITY, MI_TEMPERATURE, MI_BATTERY

# Settings for the domoticz server

# Forum see: http://domoticz.com/forum/viewtopic.php?f=56&t=13306&hilit=mi+flora&start=20#p105255

domoticzserver   = "127.0.0.1:8000"
domoticzusername = ""
domoticzpassword = ""

# So id devices use: sudo hcitool lescan

# Sensor IDs

# Create virtual sensors in dummy hardware
# type temperature & humidity

try:
    import bluepy.btle  # noqa: F401 pylint: disable=unused-import

    BACKEND = btlewrap.BluepyBackend
except ImportError:
    BACKEND = btlewrap.GatttoolBackend


base64string = base64.encodestring(('%s:%s' % (domoticzusername, domoticzpassword)).encode()).decode().replace('\n', '')

def domoticzrequest (url):
  print(url)
  request = urllib.request.Request(url)
  request.add_header("Authorization", "Basic %s" % base64string)
  response = urllib.request.urlopen(request)
  return response.read()

def update(address,idx_temp):

    poller = MiTemp2BtPoller(address, BACKEND)

    loop = 0
    try:
        temp = poller.parameter_value(MI_TEMPERATURE)
    except:
        temp = "Not set"

    while loop < 2 and temp == "Not set":
        print("Error reading value retry after 5 seconds...\n")
        time.sleep(5)
        poller = MiTemp2BtPoller(address)
        loop += 1
        try:
            temp = poller.parameter_value(MI_TEMPERATURE)
        except:
            temp = "Not set"

    if temp == "Not set":
        print("Error reading value\n")
        return

    global domoticzserver

    print("Mi Sensor: " + address)
    print("Firmware: {}".format(poller.firmware_version()))
    print("Name: {}".format(poller.name()))
    print("Temperature: {}°C".format(poller.parameter_value(MI_TEMPERATURE)))
    print("Humidity: {}%".format(poller.parameter_value(MI_HUMIDITY)))
    print("Battery: {}%".format(poller.parameter_value(MI_BATTERY)))

    val_bat  = "{}".format(poller.parameter_value(MI_BATTERY))

    # Update temp
    #val_temp = "{}".format(poller.parameter_value(MI_TEMPERATURE))
    #domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=udevice&idx=" + idx_temp + "&nvalue=0&svalue=" + val_temp + "&battery=" + val_bat)

    # Update humidity
    #val_hum = "{}".format(poller.parameter_value(MI_HUMIDITY))
    #domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=udevice&idx=" + idx_hum + "&svalue=" + val_hum + "&battery=" + val_bat)

	#/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP;HUM;HUM_STAT
    val_temp = "{}".format(poller.parameter_value(MI_TEMPERATURE))
    val_hum = "{}".format(poller.parameter_value(MI_HUMIDITY))

    val_comfort = "0"
    if float(val_hum) < 40:
        val_comfort = "2"
    elif float(val_hum) <= 70:
        val_comfort = "1"
    elif float(val_hum) > 70:
        val_comfort = "3"

    #domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=udevice&idx=" + idx_temp + "&nvalue=0&svalue=" + val_temp + ";" + val_hum + ";"+ val_comfort + "&battery=" + val_bat)



#print("\n1: updating")
update("A4:C1:38:A1:D5:92","752")

#update("4C:65:A8:D0:26:D2","753")

#update("4C:65:A8:D0:57:2A","754")

mijia/mitemp2_bt_poller.py

Code : Tout sélectionner

""""
Read data from Mi Temp environmental (Temp and humidity) sensor.
"""

from datetime import datetime, timedelta
import logging
from threading import Lock
from btlewrap.base import BluetoothInterface, BluetoothBackendException

_HANDLE_READ_BATTERY_LEVEL = 0x001B
_HANDLE_READ_FIRMWARE_VERSION = 0x0012
_HANDLE_READ_NAME = 0x03
_HANDLE_READ_WRITE_SENSOR_DATA = 0x001C


MI_TEMPERATURE = "temperature"
MI_HUMIDITY = "humidity"
MI_BATTERY = "battery"

_LOGGER = logging.getLogger(__name__)


class MiTemp2BtPoller:
    """"
    A class to read data from Mi Temp plant sensors.
    """

    def __init__(self, mac, backend, cache_timeout=600, retries=3, adapter='hci0'):
        """
        Initialize a Mi Temp Poller for the given MAC address.
        """

        self._mac = mac
        self._bt_interface = BluetoothInterface(backend, adapter=adapter)
        self._cache = None
        self._cache_timeout = timedelta(seconds=cache_timeout)
        self._last_read = None
        self._fw_last_read = None
        self.retries = retries
        self.ble_timeout = 10
        self.lock = Lock()
        self._firmware_version = None
        self.battery = None

    def name(self):
        """Return the name of the sensor."""
        with self._bt_interface.connect(self._mac) as connection:
            name = connection.read_handle(_HANDLE_READ_NAME)  # pylint: disable=no-member

        if not name:
            raise BluetoothBackendException("Could not read NAME using handle %s"
                                            " from Mi Temp sensor %s" % (hex(_HANDLE_READ_NAME), self._mac))
        return ''.join(chr(n) for n in name)

    def fill_cache(self):
        """Fill the cache with new data from the sensor."""
        _LOGGER.debug('Filling cache with new sensor data.')
        try:
            self.firmware_version()
        except BluetoothBackendException:
            # If a sensor doesn't work, wait 5 minutes before retrying
            self._last_read = datetime.now() - self._cache_timeout + \
                timedelta(seconds=300)
            raise

        with self._bt_interface.connect(self._mac) as connection:
            try:
                connection.wait_for_notification(_HANDLE_READ_WRITE_SENSOR_DATA, self,
                                                 self.ble_timeout)  # pylint: disable=no-member
                # If a sensor doesn't work, wait 5 minutes before retrying
            except BluetoothBackendException:
                self._last_read = datetime.now() - self._cache_timeout + \
                    timedelta(seconds=300)
                return

    def battery_level(self):
        """Return the battery level.
        The battery level is updated when reading the firmware version. This
        is done only once every 24h
        """
        self.firmware_version()
        return self.battery

    def firmware_version(self):
        """Return the firmware version."""
        if (self._firmware_version is None) or \
                (datetime.now() - timedelta(hours=24) > self._fw_last_read):
            self._fw_last_read = datetime.now()
            with self._bt_interface.connect(self._mac) as connection:
                res_firmware = connection.read_handle(_HANDLE_READ_FIRMWARE_VERSION)  # pylint: disable=no-member
                _LOGGER.debug('Received result for handle %s: %s',
                              _HANDLE_READ_FIRMWARE_VERSION, res_firmware)
                res_battery = connection.read_handle(_HANDLE_READ_BATTERY_LEVEL)  # pylint: disable=no-member
                _LOGGER.debug('Received result for handle %s: %d',
                              _HANDLE_READ_BATTERY_LEVEL, res_battery)

            if res_firmware is None:
                self._firmware_version = None
            else:
                self._firmware_version = res_firmware.decode("utf-8")

            if res_battery is None:
                self.battery = 0
            else:
                self.battery = int(ord(res_battery))
        return self._firmware_version

    def parameter_value(self, parameter, read_cached=True):
        """Return a value of one of the monitored paramaters.
        This method will try to retrieve the data from cache and only
        request it by bluetooth if no cached value is stored or the cache is
        expired.
        This behaviour can be overwritten by the "read_cached" parameter.
        """
        # Special handling for battery attribute
        if parameter == MI_BATTERY:
            return self.battery_level()

        # Use the lock to make sure the cache isn't updated multiple times
        with self.lock:
            if (read_cached is False) or \
                    (self._last_read is None) or \
                    (datetime.now() - self._cache_timeout > self._last_read):
                self.fill_cache()
            else:
                _LOGGER.debug("Using cache (%s < %s)",
                              datetime.now() - self._last_read,
                              self._cache_timeout)

        if self.cache_available():
            return self._parse_data()[parameter]
        raise BluetoothBackendException("Could not read data from Mi Temp sensor %s" % self._mac)

    def _check_data(self):
        """Ensure that the data in the cache is valid.
        If it's invalid, the cache is wiped.
        """
        if not self.cache_available():
            return

        parsed = self._parse_data()
        _LOGGER.debug('Received new data from sensor: Temp=%.1f, Humidity=%.1f',
                      parsed[MI_TEMPERATURE], parsed[MI_HUMIDITY])

        if parsed[MI_HUMIDITY] > 100:  # humidity over 100 procent
            self.clear_cache()
            return

    def clear_cache(self):
        """Manually force the cache to be cleared."""
        self._cache = None
        self._last_read = None

    def cache_available(self):
        """Check if there is data in the cache."""
        return self._cache is not None

    def _parse_data(self):
        data = self._cache

        res = dict()


        res[MI_TEMPERATURE] = round(int.from_bytes([data[0], data[1]], "little")/100.0, 1)
        res[MI_HUMIDITY] = int.from_bytes([data[2]], "little")

        return res

    @staticmethod
    def _format_bytes(raw_data):
        """Prettyprint a byte array."""
        if raw_data is None:
            return 'None'
        return ' '.join([format(c, "02x") for c in raw_data]).upper()

    def handleNotification(self, handle, raw_data):  # pylint: disable=unused-argument,invalid-name
        """ gets called by the bluepy backend when using wait_for_notification
        """
        if raw_data is None:
            return

        self._cache = raw_data
        self._check_data()
        if self.cache_available():
            self._last_read = datetime.now()
        else:
            # If a sensor doesn't work, wait 5 minutes before retrying
            self._last_read = datetime.now() - self._cache_timeout + \
                timedelta(seconds=300)
Si un expert peu y jeter un oeil, on ne doit pas être loin.

Il existe aussi une version pour V1 + V2 sur la même page
https://github.com/pFenners/mijia-senso ... cz/pull/10

je ne désespère pas de pouvoir les intégrer

Bonne journée

TG76
Domoticz sur raspberry pi4 + station météo WMR86
Porte auto poulailler par détournement moteur porte de garage
suivi nas synology et onduleur
Clément89
Messages : 2
Inscription : 29 août 2020, 00:41

Re: Hygrothermographe V2

Message par Clément89 »

Bonjour à tous j'ai modifié un script provenant de ce site : https://www.fanjoe.be/?p=3911

Dans domoticz il faut créer un capteur virtuel Température + humidité, récupérer l'idx

Dans mon script il faut renseigner IP du serveur, port, l'idx et la MAC correspondant au module, si vous avez des identifiants de connexion il faut supprimer les # avant domoticz_USER & domoticz_PASSWORD, mettre un # devant la ligne 92 et supprimer celui de la ligne 93

Ensuite j'ai fait un cron qui remonte capteur par capteur toutes les 15 minutes

Code : Tout sélectionner

#/bin/bash
#chcp 65001 > nul

#domoticz server
domoticz_IP="127.0.0.1"
domoticz_PORT="8080"
#domoticz_USER="user"
#domoticz_PASSWORD="pwd"
#MIJA V2
MACadd="A4:A4:38:A4:86:A4"
domoticz_idx="10"

# Vérifie que l'on est en Root
if [[ $EUID -ne 0 ]];
then
    echo "Ce script doit être exécuté avec les privilèges administrateur"
    exit 1
fi


hciconfig hci0 down
hciconfig hci0 up
hnd38=$(timeout 15 gatttool -b $MACadd --char-write-req --handle='0x0038' --value="0100" --listen | grep --max-count=1 "Notification handle")
# Notification handle = 0x0036 value: 7c 08 2a 97 0c
  
if !([ -z "$hnd38" ])
then
    temperature=${hnd38:39:2}${hnd38:36:2}
    temperature=$((16#$temperature))
    if [ "$temperature" -gt "10000" ];
    then
        temperature=$((-65536 + $temperature))
    fi
    temperature=$(echo "scale=2;$temperature/100" | bc)
    
    humidity=${hnd38:42:2}
    humidity=$((16#$humidity))
    voltage=${hnd38:48:2}${hnd38:45:2}
    voltage=$((16#$voltage))
    voltage=$(echo "scale=3;$voltage/1000" | bc)
    
    # Battery Level : 0x2A19
    # handle = 0x001b, uuid = 00002a19-0000-1000-8000-00805f9b34fb
        hnd1b=$(gatttool --device=$MACadd --char-read -a 0x1b)
        # Characteristic value/descriptor: 63
        battery=${hnd1b:33:2}
        battery=$((16#$battery))
    # Firmware Revision String : 0x2A26
    # handle = 0x0012, uuid = 00002a26-0000-1000-8000-00805f9b34fb
        hnd12=$(gatttool --device=$MACadd --char-read -a 0x12)
        # Characteristic value/descriptor: 31 2e 30 2e 30 5f 30 31 30 36 00
        firmware=$(echo "$hnd12" | cut -c34-65 | xxd -r -p)
  
    # Device Name : 0x2A00
    # handle = 0x0003, uuid = 00002a00-0000-1000-8000-00805f9b34fb
        hnd03=$(gatttool --device=$MACadd --char-read -a 0x03)
        # Characteristic value/descriptor: 4c 59 57 53 44 30 33 4d 4d 43 00
        name=$(echo "$hnd03" | cut -c34-65 | xxd -r -p)
  
    # Hardware Revision String : 0x2A27
    # handle = 0x0014, uuid = 00002a27-0000-1000-8000-00805f9b34fb
        hnd14=$(gatttool --device=$MACadd --char-read -a 0x14)
        # Characteristic value/descriptor: 42 31 2e 34
        revision=$(echo "$hnd14" | cut -c34-45 | xxd -r -p)
    # Affichage des données
        echo "Reading Mijia..."
        echo "Hardware: {Firmware Version:$firmware / Hardware Revision:$revision / BT Name:$name / Battery Level:$battery}"
        echo "Sensors: {Temperature:$temperature / Humidity:$humidity / Voltage:$voltage}"
  
#humidity=80
  
if [ $humidity -ge 0 ]&&[ $humidity -le 39 ]
then
         HUM=2
elif [ $humidity -ge 60 ]&&[ $humidity -le 79 ]
then
         HUM=1
elif [ $humidity -ge 40 ]&&[ $humidity -le 59 ]
then
         HUM=0
elif [ $humidity -ge 80 ]&&[ $humidity -le 100 ]
then
         HUM=3
fi
  
echo $HUM
  
#Création d'une variable contenant url en y incluant la valeur de la température
url="http://$domoticz_IP:$domoticz_PORT/json.htm?type=command&param=udevice&idx=$domoticz_idx&svalue=$temperature;$humidity;$HUM"

#Requête vers domoticz pour mise à jour  de la température en mode silencieux
#curl --user $domoticz_USER:$domoticz_PASSWORD  $url > /dev/null
curl -s $url > /dev/null

else
    echo "Mijia error"
fi
TG76
Messages : 49
Inscription : 10 nov. 2017, 12:04

Re: Hygrothermographe V2

Message par TG76 »

Bonsoir,

je suis en train d'essayer, mais rien a faire. J'ai une erreur de syntaxe et je ne maîtrise pas du tout.

En l'éxecutant manuellement depuis le terminal

Code : Tout sélectionner

File "THsalon.py", line 14
    if [[ $EUID -ne 0 ]];
          ^
SyntaxError: invalid syntax
En l'executant dans Geany

Code : Tout sélectionner

  File "THsalon.py", line 13
SyntaxError: Non-ASCII character '\xc3' in file THsalon.py on line 13, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Un problème avec Python?

Si quelqu'un peut m'aider svp
Domoticz sur raspberry pi4 + station météo WMR86
Porte auto poulailler par détournement moteur porte de garage
suivi nas synology et onduleur
Répondre