[
  {
    "path": "HassOsEnableSSH/CHANGELOG.md",
    "content": "| Version | Change                                                    |\n|---------|-----------------------------------------------------------|\n| 0.9.3   | Check if running in 'protection mode'                     |\n| 0.9.2b  | Add skip/success messages and obviously dummy default key |\n| 0.9.1a  | Fix for changes in HAOS docker. Fix for mmcblk1p1         |\n| 0.9     | Support for mmcblk1p1                                     |\n| 0.7     | Support new Addon API                                     |\n| 0.6     | Support for x86                                           |\n| 0.5     | Incresed security to absolute maximum because, why not?   |\n| 0.4     | fixed docker error with cache                             |\n| 0.3     | Supporting odroid                                         |\n| 0.2     | Improving security rating                                 |\n| 0.1     | initial release                                           |\n"
  },
  {
    "path": "HassOsEnableSSH/DOCS.md",
    "content": "\n# Configuration\nHassOS SSH Port 22222 Configurator requires configuration. Copy your public key into the configurator in a single line as such\n\n```\nSSHKey: \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGTlRAfhm9BIV6l6sOubRgeCY0wRhYQVfB3QBWFl2ELpeAnTHwRYY+4pSP1Nu7FuZqAzDyZkssmFkbXHJGqi6EAnAkRLsKhzvDKo5WSXfEQdl2kSN5bgU/e37GfwqG4ChEfY56gwu+tdHtt4eIrzKpmUKqFZWJaGoeI9sHptQR9QNitEsm0krkOcK0VLFLTeau+HOO1A4plcLjBB9Y43SFjth/Ouke+DVGaBO2LYNc8U0S4EiHT6KdRXS4iIwYjXMw6SEsT7eP9IWQObQ4ZgyG0cHO/6ArxJ0fyOcAI29sLzM9466ID0mTaJWHriTRf6Lxhpdd/S30VTG0JMTdo/Fj  root@HLAB-A17\"\n```\n\n(PLEASE NOTE! In recent versions of Home Assistant, you do NOT NEED TO ADD the `SSHKey:` yaml key, UNLESS you select `Edit In YAML` from the `Configuration` 3-dot menu. In other words, just paste your double-quoted SSH public key directly into the field provided. You may want to select `Edit In YAML` to validate that the final YAML passed to the add-on is as expected).\n\nAfter saving, Home Assistant may change your input to look like this\n![image](https://raw.githubusercontent.com/adamoutler/HassOSConfigurator/main/gitResources/configuration.png)\n\n# Support\nIf problems are encountered please get all \"Karen\" in the forums and make sure to display attitude, because developers love that.  Alternatively, you can provide a log and tell us the problem, what you did, the model of your device, and what happened differently than what you expected.\n\nSupport is provided on the Home Assistant Community forums [here](https://community.home-assistant.io/t/add-on-hassos-ssh-port-22222-configurator/264109)\n\n# Operation\nHit the start button and observe the logs.  Perform 2 pull-the-plug reboots after running this.  You may uninstall the Add-On when it tells you it can find I2C. \n"
  },
  {
    "path": "HassOsEnableSSH/Dockerfile",
    "content": "ARG BUILD_FROM=ghcr.io/home-assistant/base:latest\nFROM $BUILD_FROM\nENV LANG C.UTF-8\nCOPY run.sh /\nWORKDIR /data\nRUN chmod a+x /run.sh\n\nCMD [ \"/run.sh\" ]\n"
  },
  {
    "path": "HassOsEnableSSH/README.md",
    "content": "\n## HassOS SSH port 22222 Configurator\nPlaces an authorized_keys file in the location required by HassOS at boot time to enable the SSH port 22222.  Run it once and then remove it.  You won't need to run it again. \n\nYou can connect an SDCard and up to two hard disks or USB drives, which are detected as sda or sdb, and they will all have HassOS SSH port 22222 enabled. \n\n# Support\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/add-on-hassos-ssh-port-22222-configurator/264109)\n\n# Operation\n**Important Note** when requested to reboot, choose Supervisor->Reboot Host or pull the power plug from your machine and restart it. \n\nHit the start button and observe the logs.   Perform 2 pull-the-plug reboots after running this.  You may uninstall the Add-On when it tells you it found I2C. \n\n"
  },
  {
    "path": "HassOsEnableSSH/apparmor.txt",
    "content": "#include <tunables/global>\n\nprofile hassos_ssh_configurator_addon flags=(attach_disconnected,mediate_deleted) {\n  #include <abstractions/base>\n  \n  capability,\n  file,\n  mount,\n  umount,\n  remount,\n\n  capability setgid,\n  capability setuid,\n  capability dac_override,\n\n  # S6-Overlay\n  /bin/** ix,\n  /usr/bin/** ix,\n  /usr/lib/bashio/** ix,\n  /etc/s6/** rix,\n  /run/s6/** rix,\n  /etc/services.d/** rwix,\n  /etc/cont-init.d/** rwix,\n  /etc/cont-finish.d/** rwix,\n  /init rix,\n  /var/run/** mrwkl,\n  /var/run/ mrwkl,\n  /proc/self/attr/** mrwkl,\n  # Files required\n  /dev/sda1 mrwkl,\n  /dev/sdb1 mrwkl,\n  /dev/mmcblk0p1 mrwkl,\n  /dev/* mrwkl,\n  /tmp/** mrkwl,\n  \n  # Data access\n  /data/** rw,\n\n\n  # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container\n  ptrace (trace,read) peer=docker-default,\n \n  # docker daemon confinement requires explict allow rule for signal\n  signal (receive) set=(kill,term) peer=/usr/bin/docker,\n\n}\n"
  },
  {
    "path": "HassOsEnableSSH/config.json",
    "content": "{\n  \"name\": \"HassOS SSH port 22222 Configurator\",\n  \"version\": \"0.9.3\",\n  \"slug\": \"hassos_ssh_configurator_addon\",\n  \"description\": \"This enables the SSH HassOS Console on port 22222. Only for Home Assistant OS\",\n  \"arch\": [\"amd64\", \"i386\", \"armhf\", \"armv7\", \"aarch64\"],\n  \"startup\": \"once\",\n  \"boot\": \"manual\",\n  \"url\":\"https://community.home-assistant.io/t/add-on-hassos-ssh-port-22222-configurator/264109\",\n  \"apparmor\": \"true\",\n  \"init\": false,\n  \"ingress\": \"true\",\n  \"stage\": \"experimental\",\n  \"privileged\": [\"SYS_ADMIN\"],\n  \"full_access\": true,\n  \"options\": {\n    \"SSHKey\": \"ssh-rsa AAA.. Insert the full contents (i.e. ssh-rsa AAA...) of your public ssh key (id_rsa.pub, id_ecdsa.pub, ...) here.\"\n  },\n  \"schema\": {\n    \"SSHKey\": \"str\"\n  }\n}\n"
  },
  {
    "path": "HassOsEnableSSH/run.sh",
    "content": "#!/usr/bin/with-contenv bashio\n\nset +e\n\nfun() { while true; do nc -l -p 8099 -e echo -e 'HTTP/1.1 200 OK\\r\\nServer: DeskPiPro\\r\\nDate:$(date)\\r\\nContent-Type: text/html; charset=UTF8\\r\\nCache-Control: no-store, no cache, must-revalidate\\r\\n\\r\\n<!DOCTYPE html><html><body><p>This addon gains 2 security points for implementing this page. So it is here.</body></html>\\r\\n\\n\\n'; done; }\nfun &\n\nkey=$(jq -r '.SSHKey' options.json)\n\nmountAttempts=0\nmountFailures=0\n\ncopyKeyToDevicePartition() {\n  partition=\"/dev/${1}\"\n  tmp_path=\"/tmp/${1}\"\n  config_dir=\"${tmp_path}/CONFIG\"\n  authorized_keys_file=\"${config_dir}/authorized_keys\"\n\n  if [ ! -e \"${partition}\" ]; then\n    echo \"[skip] ${partition} does not exist.\"\n    return\n  fi\n\n  mkdir -p \"${tmp_path}\" 2>/dev/null\n  mountAttempts=$((mountAttempts + 1))\n  mount \"${partition}\" \"${tmp_path}\" 2>/dev/null\n\n  # NOTE: This check must be run immediately after the `mount` command above.\n  if [ $? -ne 0 ]; then\n    mountFailures=$((mountFailures + 1))\n    return\n  fi\n\n  if [ ! -e \"${tmp_path}/cmdline.txt\" ]; then\n    echo \"[skip] No config file found in ${partition}\"\n    return\n  fi\n\n  if test -e \"${config_dir}/\" && grep \"$key\" \"${authorized_keys_file}\" >/dev/null 2>&1; then\n    echo \"[skip] Key already exists in ${partition}\"\n    return\n  fi\n\n  echo \"Writing authorized_keys in ${partition}\"\n  mkdir -p \"${config_dir}\"\n  echo \"$key\" >>\"${authorized_keys_file}\"\n  echo \"[SUCCESS] Key written to ${partition}.\"\n}\npartitions=(\n  vda1\n  sda1\n  sdb1\n  mmcblk0p1\n  mmcblk1p1\n  nvme0n1p1\n  xvda8\n)\nfor partition in \"${partitions[@]}\"; do\n  copyKeyToDevicePartition \"${partition}\"\ndone\n\nif [ $mountAttempts -eq $mountFailures ]; then\n  echo \"=============================================================\"\n  echo \"=    #     #    #    ######  #     # ### #     #  #####     =\"\n  echo \"=    #  #  #   # #   #     # ##    #  #  ##    # #     #    =\"\n  echo \"=    #  #  #  #   #  #     # # #   #  #  # #   # #          =\"\n  echo \"=    #  #  # #     # ######  #  #  #  #  #  #  # #  ####    =\"\n  echo \"=    #  #  # ####### #   #   #   # #  #  #   # # #     #    =\"\n  echo \"=    #  #  # #     # #    #  #    ##  #  #    ## #     #    =\"\n  echo \"=     ## ##  #     # #     # #     # ### #     #  #####     =\"\n  echo \"=============================================================\"\n  echo \"=\"\n  echo \"=   Issue: Failed to mount all attempted partitions (${mountAttempts} partition(s)).\"\n  echo \"=\"\n  echo \"=   Possible Solution: Ensure that 'Protection mode' is disabled in the 'Info' tab of this Add-On.\"\n  echo \"=\"\n  echo \"=============================================================\"\n  echo \"[FAILURE] Configurator failed. Please follow the steps above, then restart this Add-On.\"\n  sleep 99999\n  exit 1\nfi\n\necho \"[Done] Configurator complete. Perform a hard power-off now. This configurator only works once and is no longer needed.\"\nsleep 99999\n"
  },
  {
    "path": "Pi4EnableI2C/CHANGELOG.md",
    "content": "| Version | Change |\n|---|---|\n| 0.14 | Add nvme0n1p1 |\n| 0.13 | cleanup error in supervisor for device access with full access |\n| 0.11 | removing support for deprecated non-protected mode, and increasing to sec level 6! |\n| 0.10 | Support new Addon API |\n| 0.9 | Support for Raspian |\n| 0.8 | Do not run on startup |\n| 0.7 | Incresed security to absolute maximum because, why not? |\n| 0.6 | Testing increased security |\n| 0.4 | Improving security |\n| 0.3 | Supporting odroid |\n| 0.2 | fixed problem with not mounting partition correctly |\n| 0.1 | initial release |\n"
  },
  {
    "path": "Pi4EnableI2C/DOCS.md",
    "content": "No configuration required.  If problems are encountered please get all \"Karen\" in the forums and make sure to display attitude, because developers love that.  Alternatively, you can provide a log and tell us the problem, what you did, the model of your device, and what happened differently than what you expected.\n\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/hassos-i2c-configurator/264167)\n\nJust hit the start button and observe the logs. Perform 2- pull-the-plug restart after starting to ensure it takes effect.  The first restart will emplace files.  The second will activate I2C.  You will see a message in the logs that I2C was found after the 2nd restart. You may uninstall the Add-On when complete. \n"
  },
  {
    "path": "Pi4EnableI2C/Dockerfile",
    "content": "ARG BUILD_FROM=ghcr.io/home-assistant/base:latest\nFROM ${BUILD_FROM}\nENV LANG C.UTF-8\nCOPY run.sh /\nWORKDIR /data\nRUN chmod a+x /run.sh\n\nCMD [ \"/run.sh\" ]\n"
  },
  {
    "path": "Pi4EnableI2C/README.md",
    "content": "# HassOS I2C Configurator\nEnables the Raspberry Pi I<sup>2</sup>C bus.  You can connect an SDCard and up to two hard disks or USB drives, which are detected as sda or sdb, and they will all have I<sup>2</sup>C enabled. \n\n# Support\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/hassos-i2c-configurator/264167)\n\n# Operation\nHit the start button and observe the logs.  You may uninstall the Add-On when complete. "
  },
  {
    "path": "Pi4EnableI2C/apparmor.txt",
    "content": "#include <tunables/global>\n\nprofile hassosi2cconfiguratoraddon flags=(attach_disconnected,mediate_deleted) {\n  #include <abstractions/base>\n  \n  capability,\n  file,\n  mount options=(user,rw,noatime) /dev/sda1,\n  mount options=(user,rw,noatime) /dev/sda2,\n  mount options=(user,rw,noatime) /dev/sdb1,\n  mount options=(user,rw,noatime) /dev/sdb2,\n  mount options=(user,rw,noatime) /dev/mmcblk0p1,\n  mount options=(user,rw,noatime) /dev/mmcblk0p2,\n\n  mount,\n  umount,\n  remount,\n\n  capability setgid,\n  capability setuid,\n  capability dac_override,\n\n  # S6-Overlay\n  /bin/** ix,\n  /usr/bin/** ix,\n  /usr/lib/bashio/** ix,\n  /etc/s6/** rix,\n  /run/s6/** rix,\n  /etc/services.d/** rwix,\n  /etc/cont-init.d/** rwix,\n  /etc/cont-finish.d/** rwix,\n  /init rix,\n  /var/run/** mrwkl,\n  /var/run/ mrwkl,\n  /proc/self/attr/** mrwkl,\n  # Files required\n  /dev/sda1 mrwkl,\n  /dev/sda2 mrkwl,\n  /dev/sdb1 mrwkl,\n  /dev/sdb2 mrkwl,\n  /dev/mmcblk0p1 mrwkl,\n  /dev/mmcblk0p1 mrkwl,\n  /dev/* mrwkl,\n  /tmp/* mrwkl,\n  /tmp/ mrkwl,\n  \n  # Data access\n  /data/** rw,\n\n\n  # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container\n  ptrace (trace,read) peer=docker-default,\n \n  # docker daemon confinement requires explict allow rule for signal\n  signal (receive) set=(kill,term) peer=/usr/bin/docker,\n\n}\n"
  },
  {
    "path": "Pi4EnableI2C/config.json",
    "content": "{\n  \"name\": \"HassOS I2C Configurator\",\n  \"version\": \"0.14\",\n  \"slug\": \"hassosi2cconfiguratoraddon\",\n  \"description\": \"This enables i2c. You can uninstall this when it has run once. Check logs for information.\",\n  \"arch\": [\"armhf\", \"armv7\", \"aarch64\"],\n  \"startup\": \"once\",\n  \"auth_api\": true,\n  \"init\": false,\n  \"ingress\": true,\n  \"app_armor\": false,\n  \"privileged\": [\"SYS_ADMIN\"],\n  \"stage\": \"experimental\",\n  \"full_access\": true,\n  \"url\":\"https://community.home-assistant.io/t/add-on-hassos-i2c-configurator/264167\",\n  \"boot\": \"manual\",\n  \"options\": {},\n  \"schema\": {}\n}\n"
  },
  {
    "path": "Pi4EnableI2C/run.sh",
    "content": "#! /usr/bin/with-contenv bash\nwhoami\nid\n\necho $0\n\nnc -lk -p 8099 -e  echo -e 'HTTP/1.1 200 OK\\r\\nServer: DeskPiPro\\r\\nDate:$(date)\\r\\nContent-Type: text/html; charset=UTF8\\r\\nCache-Control: no-store, no cache, must-revalidate\\r\\n\\r\\n<!DOCTYPE html><html><body><p>HassOS I2C Configurator WebUI.  This is it. Impressive, right?</p></body></html>\\r\\n\\n\\n' & \n\nconfig='dtparam=i2c_vc=on'\nconfig2='dtparam=i2c_arm=on'\nuntil false; do\n  set +e\n  mkdir /tmp 2>/dev/null\n\n  ls -al /dev/ 2>&1\n  mkdir /tmp/nvme0n1p1 /tmp/mmcblk0p1 /tmp/sda1 /tmp/sdb1 2> /dev/null\n  if [ ! -e /dev/sda1 ] && [ ! -e /dev/sdb1 ] && [ ! -e /dev/mmcblk0p1 ] && [ ! -e /dev/nvme0n1p1 ]; then \n    echo \"nothing to do. Is protection mode enabled?  You can't run this without disabling protection mode\";\n    while true; do sleep 99999; done;\n  fi;\n\n\n  performWork () {\n    partition=$1\n    if [ ! -e /dev/$partition ]; then\n      echo \"no $partition available\"\n      return;\n    fi\n    umount /tmp/$partition 2>/dev/null\n    result=$(mount /dev/$partition /tmp/$partition 2>&1);\n    echo $result\n    [[ \"$result\" == *\"root\"* ]] && echo \"Detected Protection Mode is enabled. Disable Protection Mode in Info Screen.\"\n    if [ -e /tmp/$partition/config.txt ]; then\n      mkdir -p /tmp/$partition/CONFIG/modules;\n      echo i2c-dev >/tmp/$partition/CONFIG/modules/rpi-i2c.conf;\n\n      #debian support for i2c-bcm2708\n      if  ls /tmp/$partition | grep vmlinuz; then\n        echo \"Detected raspian, not HASSOS\"\n        p2=${partition::-1}2;\n        mkdir -p /tmp/${p2}\n        mount /dev/${p2} /tmp/${p2}\n        if ! grep bcm /tmp/${p2}/etc/modules; then\n          echo -e \"i2c-bcm2708\">>/tmp/${p2}/etc/modules;\n        fi\n        if ! grep i2c-dev /tmp/${p2}/etc/modules; then\n          echo -e \"i2c-dev\">>/tmp/${p2}/etc/modules\n        fi\n      fi\n      if grep \"$config\" /tmp/$partition/config.txt|grep -v \\#; then\n        echo \"i2c already configured on $partition. Reboot required.\";\n      else\n        echo \"adding $config to $partition config.txt\"\n        echo \"$config\">>/tmp/$partition/config.txt\n      fi\n      if grep \"$config2\" /tmp/$partition/config.txt|grep -v \\#; then\n        echo \"i2c already configured on $partition. This addon was already run during this boot and no reboot occurred. \";\n      else\n        echo \"adding $config2 to $partition config.txt\"\n        echo \"$config2\">>/tmp/$partition/config.txt\n      fi\n    else\n      echo \"no $partition config found\"\n    fi\n  }\n  if ls /dev/i2c-1; then \n    echo $(ls /dev/*i2c*)\n    echo \"Found i2c access!  Nothing to do!  You can remove this add-on.\";\n  else \n    echo \"I don't see I2C.\"\n    performWork sda1\n    performWork sdb1\n    performWork mmcblk0p1\n    performWork nvme0n1p1\n    echo \"This Configurator did it's job. Perform a hard-power-off reboot now.\"\n    echo \"You will need to reboot twice total, once to place the files, and again to activate the I2C.\"\n  fi\n  \n  sleep 99999;\ndone\n"
  },
  {
    "path": "Pi4EnableSerial/CHANGELOG.md",
    "content": "| Version | Change |\n|---|---|\n| 0.5 | Cleanup error in supervisor |\n| 0.4 | Support new Addon API |\n| 0.3 | Improving messages|\n| 0.2 | Improving security|\n| 0.1 | initial release |\n"
  },
  {
    "path": "Pi4EnableSerial/DOCS.md",
    "content": "No configuration required.  If problems are encountered please get all \"Karen\" in the forums and make sure to display attitude, because developers love that.  Alternatively, you can provide a log and tell us the problem, what you did, the model of your device, and what happened differently than what you expected.\n\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/add-on-hassos-serial-configurator/264169).\n\nJust hit the start button and observe the logs. Perform a pull-the-plug restart after starting to ensure it takes effect. You may uninstall the Add-On when complete. \n"
  },
  {
    "path": "Pi4EnableSerial/Dockerfile",
    "content": "ARG BUILD_FROM=ghcr.io/home-assistant/base:latest\nFROM $BUILD_FROM\nENV LANG C.UTF-8\nCOPY run.sh /\nWORKDIR /data\nRUN chmod a+x /run.sh\n\nCMD [ \"/run.sh\" ]\n"
  },
  {
    "path": "Pi4EnableSerial/README.md",
    "content": "## HassOS Serial Configurator\nEnables the Raspberry Pi 4 Serial Port. Instead of Device Mode, the port becomes Host Mode for utilization by the Operating System.\n\nYou can connect an SDCard and up to two hard disks or USB drives, which are detected as sda or sdb, and they will all have Serial enabled. \n\n# Support\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/add-on-hassos-serial-configurator/264169)\n\n# Operation\nHit the start button and observe the logs. Perform a pull-the-plug restart after starting to ensure it takes effect.  You may uninstall the Add-On when complete. \n"
  },
  {
    "path": "Pi4EnableSerial/apparmor.txt",
    "content": "#include <tunables/global>\n\nprofile hassosi2cconfiguratoraddon flags=(attach_disconnected,mediate_deleted) {\n  #include <abstractions/base>\n  \n  capability,\n  file,\n  mount,\n  umount,\n  remount,\n\n  capability setgid,\n  capability setuid,\n  capability dac_override,\n\n  # S6-Overlay\n  /bin/** ix,\n  /usr/bin/** ix,\n  /usr/lib/bashio/** ix,\n  /etc/s6/** rix,\n  /run/s6/** rix,\n  /etc/services.d/** rwix,\n  /etc/cont-init.d/** rwix,\n  /etc/cont-finish.d/** rwix,\n  /init rix,\n  /var/run/** mrwkl,\n  /var/run/ mrwkl,\n  /proc/self/attr/** mrwkl,\n  # Files required\n  /dev/sda1 mrwkl,\n  /dev/sdb1 mrwkl,\n  /dev/mmcblk0p1 mrwkl,\n  /dev/* mrwkl,\n  /dev/ttyUSB0 mrkwl,\n  /dev/ttyUSB1 mrkwl,\n  /dev/ttyUSB2 mrkwl,\n  # Data access\n  /data/** rw,\n\n\n  # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container\n  ptrace (trace,read) peer=docker-default,\n \n  # docker daemon confinement requires explict allow rule for signal\n  signal (receive) set=(kill,term) peer=/usr/bin/docker,\n\n}\n"
  },
  {
    "path": "Pi4EnableSerial/config.json",
    "content": "{\n  \"name\": \"HassOS Serial Configurator\",\n  \"version\": \"0.5a\",\n  \"slug\": \"hassos_serial_configurator_addon\",\n  \"description\": \"This enables Serial. You can uninstall when complete.\",\n  \"arch\": [\"armhf\", \"armv7\", \"aarch64\"],\n  \"startup\": \"once\",\n  \"init\": false,\n  \"url\":\"https://community.home-assistant.io/t/add-on-hassos-serial-configurator/264169\",\n  \"stage\": \"experimental\",\n  \"privileged\": [\"SYS_ADMIN\"],\n  \"ingress\": true,\n  \"full_access\": true,\n  \"boot\": \"manual\",\n  \"options\": {},\n  \"schema\": {}\n}\n"
  },
  {
    "path": "Pi4EnableSerial/run.sh",
    "content": "#!/usr/bin/with-contenv bashio\n\n\nfun() {  while true; do nc -l -p 8099 -e  echo -e 'HTTP/1.1 200 OK\\r\\nServer: EnableSerial\\r\\nDate:$(date)\\r\\nContent-Type: text/html; charset=UTF8\\r\\nCache-Control: no-store, no cache, must-revalidate\\r\\n\\r\\n<!DOCTYPE html><html><body><p>Serial Ingress! It is here, and there is nothing left to say.</body></html>\\r\\n\\n\\n'; done }; fun&\n\nconfig='dtoverlay=dwc2,dr_mode=host'\nuntil false; do\nset +e\n  mkdir /tmp 2>/dev/null\n  mkdir /tmp/mmcblk0p1 /tmp/sda1 2> /dev/null\n  if [ ! -e /dev/sda1 ] && [ ! -e /dev/sdb1 ] && [ ! -e /dev/mmcblk0p1 ]; then \n    echo \"nothing to do. Is protection mode enabled?  You can't run this without disabling protection mode\";\n    while true; do sleep 99999; done;\n\n  fi;\n\n\n  performWork () {\n    partition=$1\n    mount /dev/$partition /tmp/$partition 2>/dev/null\n    if [ -e /tmp/$partition/config.txt ]; then\n      if [ $(grep \"$config\" /tmp/$partition/config.txt|grep -v \\#) ]; then\n        echo \"serial already configured on $partition\";\n      else\n        echo \"adding $config to $partition config.txt\"\n        echo \"$config\">>/tmp/$partition/config.txt\n      fi\n    else\n      echo \"no $partition config found\"\n    fi\n  }\n\n  performWork sda1\n  performWork sdb1\n  performWork mmcblk0p1\n\n  echo \"This Configurator did it's job. Perform a hard-power-off now. You can uninstall and reboot now.  This configurator only works once.\"\n  sleep 99999;\ndone\n"
  },
  {
    "path": "README.md",
    "content": "# Addon Repository\nThis an addon repository for HassOS Configurator projects.  These projects perform configuration tasks.<br>\n\nAll projects require a reboot and may be uninstalled after the first successful run.  Please observe logs to determine if the run was successful. \n\n## [HassOS I2C Configurator](https://github.com/adamoutler/HassOSConfigurator/tree/main/Pi4EnableI2C)\nEnables the Raspberry Pi I<sup>2</sup>C bus Bus.  For support, click [here](https://community.home-assistant.io/t/hassos-i2c-configurator/264167).\n\n## [HassOS Serial Configurator](https://github.com/adamoutler/HassOSConfigurator/tree/main/Pi4EnableSerial)\nEnables the Raspberry Pi 4 Serial Port. Instead of Device Mode, the port becomes Host Mode for utilization by the Operating System. For support click [here](https://community.home-assistant.io/t/hassos-serial-configurator/264169)\n\n## [HassOS SSH port 22222 Configurator](https://github.com/adamoutler/HassOSConfigurator/tree/main/HassOsEnableSSH)\nPlaces an authorized_keys file in the location required by HassOS at boot time to enable the SSH port 22222. For support click [here](https://community.home-assistant.io/t/hassos-ssh-port-22222-configurator/264109)\n\n# Installation\nWithin Home Assistant, click Supervisor-> Add-on Store -> … button (in top left)-> Repositories. Add this repository. \n\nClick one of the items and install.<br>\n![image](gitResources/repository.jpg)\n\n\n# Operation\n\n**Important Note** when requested to reboot, choose Supervisor->Reboot Host or pull the power plug from your machine and restart it. \nHit the start button and observe the logs.  You may uninstall the Add-On when complete. \n"
  },
  {
    "path": "Run/CHANGELOG.md",
    "content": "| Version | Change |\n|---|---|\n| 0.11 | fix problem with logging |\n| 0.10 | Clean up error in supervisor for access to devices |\n| 0.7  | Support new Addon API |\n| 0.6  | logs are displayed in ingress |\n| 0.4  | corrected error preventing start on raspi |\n| 0.3  | Initial release|\n| 0.2  | Further testing|\n| 0.1  | initial Testing |\n"
  },
  {
    "path": "Run/DOCS.md",
    "content": "## Normal Operation\nThe purpose of this add-on is to perform tasks on startup for each container, within the context of that container.  Tasks such as mounting folders, pinging REST APIs, starting servers, and other such tasks may be performed by scripts.  \n\n**Warning**- Your scripts will run as root and have the capability of destroying your machine. \n\n## Scripts\nScripts for each container may be placed in the home assistant configuration folder, usually /config/startup/startup.d/name-of-container.sh. \n\n## Logs\nLogs may be found in the home assistant configuration folder, usually /config/startup/logs/name-of-container.log\n\n## Options\n| Setting name | Valid Values| Description |\n|---|---|---|\n|Seconds to wait before startup scripts execute| 1-999999 |Provides a delay from the time this container starts until the time it will begin executing commands in other containers. \n|Create example scripts in /config/startup/startup.d\"|lowercase true/false|If true, a script for all running containers will be created in the /config/startup/startup.d folder. Each created script will display the environmental variables for the container.|\n|Retain old logs in /config/startup/logs/ instead of deleting old logs|lowercase true/false| If true, logs will be appended. Otherwise, logs will be replaced on each startup. |\n\n## Support\nSupport is provided on the [Home Assistant Community forums](https://community.home-assistant.io/t/run-on-startup-d/271008).  Git Issues may be ignored.\n\nIf problems are encountered please get all \"Karen\" in the forums and make sure to display attitude, because developers love that.  Alternatively, you can provide a log and tell us the problem, what you did, the model of your device, and what happened differently than what you expected.\n\n"
  },
  {
    "path": "Run/Dockerfile",
    "content": "ARG BUILD_FROM\nFROM $BUILD_FROM\nENV LANG C.UTF-8\nCOPY run.sh /\nWORKDIR /data\nRUN chmod a+x /run.sh\nRUN apk add docker --no-cache\nCOPY rootfs /\nCMD [ \"/run.sh\" ]\n"
  },
  {
    "path": "Run/README.md",
    "content": "## Run On Startup.d\nThis Home Assistant Addon allows you to perform startup scripts for each container, within the context of that container.  Tasks such as mounting folders, pinging REST APIs, starting servers, and other such tasks may be automated and performed by scripts. \n\n**Warning**- Proceed at your own risk. Your scripts will run as root and have the capability of destroying your machine. \n\n# Support\nSupport is provided on the Home Assistant Community forums, [here](https://community.home-assistant.io/t/run-on-startup-d/271008)\n\n# Operation\nHit the start button and observe the logs. Perform a pull-the-plug restart after starting to ensure it takes effect.  You may uninstall the Add-On when complete. \n"
  },
  {
    "path": "Run/config.json",
    "content": "{\n  \"name\": \"Run On Startup.d\",\n  \"version\": \"0.11a\",\n  \"slug\": \"run_on_startup_addon\",\n  \"description\": \"This runs things at startup. Disable Protection Mode! Check logs and ingress for information.\",\n  \"arch\": [\"i386\", \"amd64\", \"armhf\", \"armv7\", \"aarch64\"],\n  \"startup\": \"application\",\n  \"url\": \"https://community.home-assistant.io/t/run-on-startup-d/271008\",\n  \"host_network\": true,\n  \"homeassistant\": true,\n  \"hassio_role\": \"admin\",\n  \"hassio_api\": true,\n  \"auth_api\": true,\n  \"init\": false,\n  \"homeassistant_api\":true,\n  \"ingress\": true,\n  \"stage\": \"experimental\",\n  \"docker_api\":true,\n  \"privileged\":[\"SYS_ADMIN\"],\n  \"stdin\":true,\n  \"full_access\": \"yes\",\n  \"boot\": \"auto\",\n  \"devicetree\": false,\n  \"map\": [\"config:rw\", \"ssl:rw\",\"addons:rw\",\"media:rw\",\"backup:rw\",\"share:rw\"],\n  \"options\": {\n               \"Seconds to wait before startup scripts execute\":\"1\",\n               \"Create example scripts in /config/startup/startup.d\":false,\n               \"Retain old logs in /config/startup/logs/ instead of deleting old logs\":true\n             },\n  \"schema\": {\n              \"Seconds to wait before startup scripts execute\":\"int(1,9999999)\",\n              \"Create example scripts in /config/startup/startup.d\":\"bool\",\n              \"Retain old logs in /config/startup/logs/ instead of deleting old logs\":\"bool\"\n            }\n}\n"
  },
  {
    "path": "Run/rootfs/opt/logcontent.sh",
    "content": "#! /bin/bash\ncontainersvar=$(docker ps --format \"{{.Names}}\")\ncontainerscs=$(echo $containersvar|sed 's/\\ /,/g')\n\nIFS=',' read -r -a containers <<<\"$containerscs\"\n\n\necho -e 'HTTP/1.1 200 OK\\r\\nServer: DeskPiPro\\r\\nDate:$(date)\\r\\nContent-Type: text/html; charset=UTF8\\r\\nCache-Control: no-store, no cache, must-revalidate\\r\\n\\r\\n'\n\necho -e \\\n\"<!DOCTYPE html>\\n\"\\\n\"<html>\\n\"\\\n\"<head>\\n\"\\\n\"<title>Page Title</title>\\n\"\\\n\"</head>\\n\"\\\n\"<body>\\n\"\\\n\nfor i in \"${containers[@]}\"; do\n  echo -e \"<H2>$i</H2>\"\n  file=\"/config/startup/logs/\"$i\".log\";\n  test -e ${file} && cat ${file}|sed 's/$/<br>/g'\n\ndone\n\necho -e \\\n\"</body>\\n\"\\\n\"</html>\\n\"\\\n\"\\n\"\n"
  },
  {
    "path": "Run/run.sh",
    "content": "#!/usr/bin/with-contenv bashio\n\nPATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n\nexecuteInRootPath=( 'homeassistant' );\n\n#Test docker access\necho \"Testing Docker access.\";\nset +e\n\n## Test for docker access\ndocker container ls 2>&1>/dev/null;\nif [ $? != 0 ]; then\n echo \"You must disable protection mode. sleeping...\"\n while true; do sleep 9999; done;\nfi\n\nlogOption=\"\";\n#Sleep for delay period\ndelay=$(cat options.json |jq -r '.\"Seconds to wait before startup scripts execute\"')\ncreateScripts=$(cat options.json |jq -r '.\"Create example scripts in /config/startup/startup.d\"')\ntest $(cat options.json |jq -r '.\"Retain old logs in /config/startup/logs/ instead of deleting old logs\"') == \"true\" && logOption=\"-a\"\necho \"Sleeping for Startup Delay period of $delay seconds\"\nsleep ${delay};\n\n#Log server\nnc -lk -p 8099 -e  exec /opt/logcontent.sh 3>/dev/null &\n\n#Get containers\necho \"Listing Containers.\"\ncontainers=$(docker ps --format \"{{.Names}}\")\nfor container in ${containers}; do \n  echo ${container};\n  if [ ${createScripts} == \"true\" ]; then \n    test ! -e /config/startup/startup.d/${container}.sh && echo -e \"#! /bin/bash\\n\\necho \\\"This script is executed in the $container container\\\"; \\nenv;\">/config/startup/startup.d/${container}.sh\n  fi\ndone;\n\n#Start running\necho \"executing\";\nmkdir -p /config/startup/startup.d\nmkdir -p /config/startup/logs\n\n#Set the environment to continue executing and start running all the scripts\nfor container in ${containers}; do\n  containerid=$(docker ps -aqf \"name=$container\")\n  if [ ! -e /config/startup/startup.d/${container}.sh ]; then\n    continue;\n  fi\n  echo \"#############################################################################\";\n  echo \"###############/config/startup/startup.d/$container.sh\";\n  echo \"###############Container: $containerid: tmp/$container.startup.sh\";\n  echo \"#############################################################################\"\n\n  remotePath=/tmp/${container};\n  (for e in \"${executeInRootPath[@]}\"; do [[ \"$e\" == ${container} ]] && exit 0; done) && remotePath=/${container};\n\n  docker cp /config/startup/startup.d/${container}.sh ${containerid}:${remotePath}.startup.sh;\n  docker exec -t ${containerid} chmod 755 ${remotePath}.startup.sh;\n  docker exec -t ${containerid} exec ${remotePath}.startup.sh 2>&1 | tee ${logOption} /config/startup/logs/${container}.log &\n  sleep 1;\n\ndone;\nset -e\necho;echo;echo;echo;\necho \"----DONE----  sleeping...\";\nsleep 99999;\n"
  },
  {
    "path": "Run/test.txt",
    "content": "HTTP/1.1 200 OK\r Content-Type: application/json\r Content-Length: 18407\r Date: Tue, 19 Jan 2021 23:44:55 GMT\r Server: Python/3.8 aiohttp/3.7.3\r \r [{\"domain\": \"homeassistant\", \"services\": {\"turn_off\": {\"description\": \"Generic service to turn devices off under any domain. Same usage as the light.turn_on, switch.turn_on, etc. services.\", \"fields\": {\"entity_id\": {\"description\": \"The entity_id of the device to turn off.\", \"example\": \"light.living_room\"}}}, \"turn_on\": {\"description\": \"Generic service to turn devices on under any domain. Same usage as the light.turn_on, switch.turn_on, etc. services.\", \"fields\": {\"entity_id\": {\"description\": \"The entity_id of the device to turn on.\", \"example\": \"light.living_room\"}}}, \"toggle\": {\"description\": \"Generic service to toggle devices on/off under any domain. Same usage as the light.turn_on, switch.turn_on, etc. services.\", \"fields\": {\"entity_id\": {\"description\": \"The entity_id of the device to toggle on/off.\", \"example\": \"light.living_room\"}}}, \"stop\": {\"description\": \"Stop the Home Assistant service.\", \"fields\": {}}, \"restart\": {\"description\": \"Restart the Home Assistant service.\", \"fields\": {}}, \"check_config\": {\"description\": \"Check the Home Assistant configuration files for errors. Errors will be displayed in the Home Assistant log.\", \"fields\": {}}, \"update_entity\": {\"description\": \"Force one or more entities to update its data\", \"fields\": {\"entity_id\": {\"description\": \"One or multiple entity_ids to update. Can be a list.\", \"example\": \"light.living_room\"}}}, \"reload_core_config\": {\"description\": \"Reload the core configuration.\", \"fields\": {}}, \"set_location\": {\"description\": \"Update the Home Assistant location.\", \"fields\": {\"latitude\": {\"description\": \"Latitude of your location\", \"example\": 32.87336}, \"longitude\": {\"description\": \"Longitude of your location\", \"example\": 117.22743}}}}}, {\"domain\": \"persistent_notification\", \"services\": {\"create\": {\"description\": \"Show a notification in the frontend.\", \"fields\": {\"message\": {\"description\": \"Message body of the notification. [Templates accepted]\", \"example\": \"Please check your configuration.yaml.\"}, \"title\": {\"description\": \"Optional title for your notification. [Optional, Templates accepted]\", \"example\": \"Test notification\"}, \"notification_id\": {\"description\": \"Target ID of the notification, will replace a notification with the same Id. [Optional]\", \"example\": 1234}}}, \"dismiss\": {\"description\": \"Remove a notification from the frontend.\", \"fields\": {\"notification_id\": {\"description\": \"Target ID of the notification, which should be removed. [Required]\", \"example\": 1234}}}, \"mark_read\": {\"description\": \"Mark a notification read.\", \"fields\": {\"notification_id\": {\"description\": \"Target ID of the notification, which should be mark read. [Required]\", \"example\": 1234}}}}}, {\"domain\": \"recorder\", \"services\": {\"purge\": {\"description\": \"Start purge task - delete events and states older than x days, according to keep_days service data.\", \"fields\": {\"keep_days\": {\"description\": \"Number of history days to keep in database after purge. Value >= 0.\", \"example\": 2}, \"repack\": {\"description\": \"Attempt to save disk space by rewriting the entire database file.\", \"example\": true}}}}}, {\"domain\": \"system_log\", \"services\": {\"clear\": {\"description\": \"Clear all log entries.\", \"fields\": {}}, \"write\": {\"description\": \"Write log entry.\", \"fields\": {\"message\": {\"description\": \"Message to log. [Required]\", \"example\": \"Something went wrong\"}, \"level\": {\"description\": \"Log level: debug, info, warning, error, critical. Defaults to 'error'.\", \"example\": \"debug\"}, \"logger\": {\"description\": \"Logger name under which to log the message. Defaults to 'system_log.external'.\", \"example\": \"mycomponent.myplatform\"}}}}}, {\"domain\": \"cloud\", \"services\": {\"remote_connect\": {\"description\": \"Make instance UI available outside over NabuCasa cloud.\", \"fields\": {}}, \"remote_disconnect\": {\"description\": \"Disconnect UI from NabuCasa cloud.\", \"fields\": {}}}}, {\"domain\": \"person\", \"services\": {\"reload\": {\"description\": \"Reload the person configuration.\", \"fields\": {}}}}, {\"domain\": \"hassio\", \"services\": {\"addon_start\": {\"description\": \"Start a Hass.io docker add-on.\", \"fields\": {\"addon\": {\"description\": \"The add-on slug.\", \"example\": \"core_ssh\"}}}, \"addon_stop\": {\"description\": \"Stop a Hass.io docker add-on.\", \"fields\": {\"addon\": {\"description\": \"The add-on slug.\", \"example\": \"core_ssh\"}}}, \"addon_restart\": {\"description\": \"Restart a Hass.io docker add-on.\", \"fields\": {\"addon\": {\"description\": \"The add-on slug.\", \"example\": \"core_ssh\"}}}, \"addon_stdin\": {\"description\": \"Write data to a Hass.io docker add-on stdin .\", \"fields\": {\"addon\": {\"description\": \"The add-on slug.\", \"example\": \"core_ssh\"}}}, \"host_shutdown\": {\"description\": \"Poweroff the host system.\", \"fields\": {}}, \"host_reboot\": {\"description\": \"Reboot the host system.\", \"fields\": {}}, \"snapshot_full\": {\"description\": \"Create a full snapshot.\", \"fields\": {\"name\": {\"description\": \"Optional or it will be the current date and time.\", \"example\": \"Snapshot 1\"}, \"password\": {\"description\": \"Optional password.\", \"example\": \"password\"}}}, \"snapshot_partial\": {\"description\": \"Create a partial snapshot.\", \"fields\": {\"addons\": {\"description\": \"Optional list of addon slugs.\", \"example\": [\"core_ssh\", \"core_samba\", \"core_mosquitto\"]}, \"folders\": {\"description\": \"Optional list of directories.\", \"example\": [\"homeassistant\", \"share\"]}, \"name\": {\"description\": \"Optional or it will be the current date and time.\", \"example\": \"Partial Snapshot 1\"}, \"password\": {\"description\": \"Optional password.\", \"example\": \"password\"}}}, \"restore_full\": {\"description\": \"\", \"fields\": {}}, \"restore_partial\": {\"description\": \"\", \"fields\": {}}}}, {\"domain\": \"frontend\", \"services\": {\"set_theme\": {\"description\": \"Set a theme unless the client selected per-device theme.\", \"fields\": {\"name\": {\"description\": \"Name of a predefined theme, 'default' or 'none'.\", \"example\": \"default\"}, \"mode\": {\"description\": \"The mode the theme is for, either 'dark' or 'light' (default).\", \"example\": \"dark\"}}}, \"reload_themes\": {\"description\": \"Reload themes from yaml configuration.\", \"fields\": {}}}}, {\"domain\": \"logbook\", \"services\": {\"log\": {\"description\": \"Create a custom entry in your logbook.\", \"fields\": {\"name\": {\"description\": \"Custom name for an entity, can be referenced with entity_id\", \"example\": \"Kitchen\"}, \"message\": {\"description\": \"Message of the custom logbook entry\", \"example\": \"is being used\"}, \"entity_id\": {\"description\": \"Entity to reference in custom logbook entry [Optional]\", \"example\": \"light.kitchen\"}, \"domain\": {\"description\": \"Icon of domain to display in custom logbook entry [Optional]\", \"example\": \"light\"}}}}}, {\"domain\": \"script\", \"services\": {\"reload\": {\"description\": \"Reload all the available scripts\", \"fields\": {}}, \"turn_on\": {\"description\": \"Turn on script\", \"fields\": {\"entity_id\": {\"description\": \"Name(s) of script to be turned on.\", \"example\": \"script.arrive_home\"}}}, \"turn_off\": {\"description\": \"Turn off script\", \"fields\": {\"entity_id\": {\"description\": \"Name(s) of script to be turned off.\", \"example\": \"script.arrive_home\"}}}, \"toggle\": {\"description\": \"Toggle script\", \"fields\": {\"entity_id\": {\"description\": \"Name(s) of script to be toggled.\", \"example\": \"script.arrive_home\"}}}}}, {\"domain\": \"scene\", \"services\": {\"reload\": {\"description\": \"Reload the scene configuration\", \"fields\": {}}, \"apply\": {\"description\": \"Activate a scene. Takes same data as the entities field from a single scene in the config.\", \"fields\": {\"transition\": {\"description\": \"Transition duration in seconds it takes to bring devices to the state defined in the scene.\", \"example\": 2.5}, \"entities\": {\"description\": \"The entities and the state that they need to be.\", \"example\": {\"light.kitchen\": \"on\", \"light.ceiling\": {\"state\": \"on\", \"brightness\": 80}}}}}, \"create\": {\"description\": \"Creates a new scene.\", \"fields\": {\"scene_id\": {\"description\": \"The entity_id of the new scene.\", \"example\": \"all_lights\"}, \"entities\": {\"description\": \"The entities to control with the scene.\", \"example\": {\"light.tv_back_light\": \"on\", \"light.ceiling\": {\"state\": \"on\", \"brightness\": 200}}}, \"snapshot_entities\": {\"description\": \"The entities of which a snapshot is to be taken\", \"example\": [\"light.ceiling\", \"light.kitchen\"]}}}, \"turn_on\": {\"description\": \"Activate a scene.\", \"fields\": {\"transition\": {\"description\": \"Transition duration in seconds it takes to bring devices to the state defined in the scene.\", \"example\": 2.5}, \"entity_id\": {\"description\": \"Name(s) of scenes to turn on\", \"example\": \"scene.romantic\"}}}}}, {\"domain\": \"group\", \"services\": {\"reload\": {\"description\": \"Reload group configuration, entities, and notify services.\", \"fields\": {}}, \"set\": {\"description\": \"Create/Update a user group.\", \"fields\": {\"object_id\": {\"description\": \"Group id and part of entity id.\", \"example\": \"test_group\"}, \"name\": {\"description\": \"Name of group\", \"example\": \"My test group\"}, \"icon\": {\"description\": \"Name of icon for the group.\", \"example\": \"mdi:camera\"}, \"entities\": {\"description\": \"List of all members in the group. Not compatible with 'delta'.\", \"example\": \"domain.entity_id1, domain.entity_id2\"}, \"add_entities\": {\"description\": \"List of members they will change on group listening.\", \"example\": \"domain.entity_id1, domain.entity_id2\"}, \"all\": {\"description\": \"Enable this option if the group should only turn on when all entities are on.\", \"example\": true}}}, \"remove\": {\"description\": \"Remove a user group.\", \"fields\": {\"object_id\": {\"description\": \"Group id and part of entity id.\", \"example\": \"test_group\"}}}}}, {\"domain\": \"zone\", \"services\": {\"reload\": {\"description\": \"Reload the YAML-based zone configuration.\", \"fields\": {}}}}, {\"domain\": \"counter\", \"services\": {\"increment\": {\"description\": \"Increment a counter.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the counter to increment.\", \"example\": \"counter.count0\"}}}, \"decrement\": {\"description\": \"Decrement a counter.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the counter to decrement.\", \"example\": \"counter.count0\"}}}, \"reset\": {\"description\": \"Reset a counter.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the counter to reset.\", \"example\": \"counter.count0\"}}}, \"configure\": {\"description\": \"Change counter parameters\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the counter to change.\", \"example\": \"counter.count0\"}, \"minimum\": {\"description\": \"New minimum value for the counter or None to remove minimum\", \"example\": 0}, \"maximum\": {\"description\": \"New maximum value for the counter or None to remove maximum\", \"example\": 100}, \"step\": {\"description\": \"New value for step\", \"example\": 2}, \"initial\": {\"description\": \"New value for initial\", \"example\": 6}, \"value\": {\"description\": \"New state value\", \"example\": 3}}}}}, {\"domain\": \"timer\", \"services\": {\"reload\": {\"description\": \"\", \"fields\": {}}, \"start\": {\"description\": \"Start a timer.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the timer to start. [optional]\", \"example\": \"timer.timer0\"}, \"duration\": {\"description\": \"Duration the timer requires to finish. [optional]\", \"example\": \"00:01:00 or 60\"}}}, \"pause\": {\"description\": \"Pause a timer.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the timer to pause. [optional]\", \"example\": \"timer.timer0\"}}}, \"cancel\": {\"description\": \"Cancel a timer.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the timer to cancel. [optional]\", \"example\": \"timer.timer0\"}}}, \"finish\": {\"description\": \"Finish a timer.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the timer to finish. [optional]\", \"example\": \"timer.timer0\"}}}}}, {\"domain\": \"input_text\", \"services\": {\"reload\": {\"description\": \"Reload the input_text configuration.\", \"fields\": {}}, \"set_value\": {\"description\": \"Set the value of an input text entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input text to set the new value.\", \"example\": \"input_text.text1\"}, \"value\": {\"description\": \"The target value the entity should be set to.\", \"example\": \"This is an example text\"}}}}}, {\"domain\": \"input_boolean\", \"services\": {\"reload\": {\"description\": \"Reload the input_boolean configuration.\", \"fields\": {}}, \"turn_on\": {\"description\": \"Turns on an input boolean.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input boolean to turn on.\", \"example\": \"input_boolean.notify_alerts\"}}}, \"turn_off\": {\"description\": \"Turns off an input boolean\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input boolean to turn off.\", \"example\": \"input_boolean.notify_alerts\"}}}, \"toggle\": {\"description\": \"Toggles an input boolean.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input boolean to toggle.\", \"example\": \"input_boolean.notify_alerts\"}}}}}, {\"domain\": \"input_select\", \"services\": {\"reload\": {\"description\": \"Reload the input_select configuration.\", \"fields\": {}}, \"select_option\": {\"description\": \"Select an option of an input select entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input select to select the value.\", \"example\": \"input_select.my_select\"}, \"option\": {\"description\": \"Option to be selected.\", \"example\": \"\\\"Item A\\\"\"}}}, \"select_next\": {\"description\": \"Select the next options of an input select entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input select to select the next value for.\", \"example\": \"input_select.my_select\"}}}, \"select_previous\": {\"description\": \"Select the previous options of an input select entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input select to select the previous value for.\", \"example\": \"input_select.my_select\"}}}, \"set_options\": {\"description\": \"Set the options of an input select entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input select to set the new options for.\", \"example\": \"input_select.my_select\"}, \"options\": {\"description\": \"Options for the input select entity.\", \"example\": \"[\\\"Item A\\\", \\\"Item B\\\", \\\"Item C\\\"]\"}}}}}, {\"domain\": \"input_number\", \"services\": {\"reload\": {\"description\": \"Reload the input_number configuration.\", \"fields\": {}}, \"set_value\": {\"description\": \"Set the value of an input number entity.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input number to set the new value.\", \"example\": \"input_number.threshold\"}, \"value\": {\"description\": \"The target value the entity should be set to.\", \"example\": 42}}}, \"increment\": {\"description\": \"Increment the value of an input number entity by its stepping.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input number that should be incremented.\", \"example\": \"input_number.threshold\"}}}, \"decrement\": {\"description\": \"Decrement the value of an input number entity by its stepping.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input number that should be decremented.\", \"example\": \"input_number.threshold\"}}}}}, {\"domain\": \"input_datetime\", \"services\": {\"reload\": {\"description\": \"Reload the input_datetime configuration.\", \"fields\": {}}, \"set_datetime\": {\"description\": \"This can be used to dynamically set the date and/or time. Use date/time, datetime or timestamp.\", \"fields\": {\"entity_id\": {\"description\": \"Entity id of the input datetime to set the new value.\", \"example\": \"input_datetime.test_date_time\"}, \"date\": {\"description\": \"The target date the entity should be set to.\", \"example\": \"\\\"2019-04-20\\\"\"}, \"time\": {\"description\": \"The target time the entity should be set to.\", \"example\": \"\\\"05:04:20\\\"\"}, \"datetime\": {\"description\": \"The target date & time the entity should be set to.\", \"example\": \"\\\"2019-04-20 05:04:20\\\"\"}, \"timestamp\": {\"description\": \"The target date & time the entity should be set to as expressed by a UNIX timestamp.\", \"example\": 1598027400}}}}}, {\"domain\": \"automation\", \"services\": {\"trigger\": {\"description\": \"Trigger the action of an automation.\", \"fields\": {\"entity_id\": {\"description\": \"Name of the automation to trigger.\", \"example\": \"automation.notify_home\"}, \"skip_condition\": {\"description\": \"Whether or not the condition will be skipped (defaults to true).\", \"example\": true}}}, \"toggle\": {\"description\": \"Toggle an automation.\", \"fields\": {\"entity_id\": {\"description\": \"Name of the automation to toggle on/off.\", \"example\": \"automation.notify_home\"}}}, \"turn_on\": {\"description\": \"Enable an automation.\", \"fields\": {\"entity_id\": {\"description\": \"Name of the automation to turn on.\", \"example\": \"automation.notify_home\"}}}, \"turn_off\": {\"description\": \"Disable an automation.\", \"fields\": {\"entity_id\": {\"description\": \"Name of the automation to turn off.\", \"example\": \"automation.notify_home\"}, \"stop_actions\": {\"description\": \"Stop currently running actions (defaults to true).\", \"example\": false}}}, \"reload\": {\"description\": \"Reload the automation configuration.\", \"fields\": {}}}}, {\"domain\": \"tts\", \"services\": {\"google_translate_say\": {\"description\": \"\", \"fields\": {}}, \"clear_cache\": {\"description\": \"Remove cache files and RAM cache.\", \"fields\": {}}}}, {\"domain\": \"notify\", \"services\": {\"persistent_notification\": {\"description\": \"Sends a notification to the visible in the front-end.\", \"fields\": {\"message\": {\"description\": \"Message body of the notification.\", \"example\": \"The garage door has been open for 10 minutes.\"}, \"title\": {\"description\": \"Optional title for your notification.\", \"example\": \"Your Garage Door Friend\"}}}, \"notify\": {\"description\": \"Send a notification.\", \"fields\": {\"message\": {\"description\": \"Message body of the notification.\", \"example\": \"The garage door has been open for 10 minutes.\"}, \"title\": {\"description\": \"Optional title for your notification.\", \"example\": \"Your Garage Door Friend\"}, \"target\": {\"description\": \"An array of targets to send the notification to. Optional depending on the platform.\", \"example\": \"platform specific\"}, \"data\": {\"description\": \"Extended information for notification. Optional depending on the platform.\", \"example\": \"platform specific\"}}}}}, {\"domain\": \"stream\", \"services\": {\"record\": {\"description\": \"Make a .mp4 recording from a provided stream.\", \"fields\": {\"stream_source\": {\"description\": \"The input source for the stream.\", \"example\": \"rtsp://my.stream.feed:554\"}, \"filename\": {\"description\": \"The file name string.\", \"example\": \"/tmp/my_stream.mp4\"}, \"duration\": {\"description\": \"Target recording length (in seconds). Default: 30\", \"example\": 30}, \"lookback\": {\"description\": \"Target lookback period (in seconds) to include in addition to duration. Only available if there is currently an active HLS stream for stream_source. Default: 0\", \"example\": 5}}}}}]\n"
  },
  {
    "path": "repository.json",
    "content": "{\n  \"name\": \"HassOS Configurator\",\n  \"url\": \"https://github.com/adamoutler/HassOSConfigurator\",\n  \"maintainer\": \"Adam Outler <adamoutler@adamoutler.com>\"\n}\n"
  }
]